在总表中自动汇总新添加的Excel表

时间:2012-04-12 07:31:06

标签: excel excel-vba vba

我有一个Excel工作簿,其中我有标签,表示每个标签中的日期和总和。虽然我可以在最终工作表中获取所有这些的总和,但是当添加新的电子表格时,我想要一个公式/宏来获得总命名工作表中的总和。

注意: - 所有单元格保持不变(E56)

2 个答案:

答案 0 :(得分:0)

我不明白你在尝试什么。在用户在新工作表中放置导致E56值的信息之前,我认为将NewSheet!E56的值添加到总工作表中没什么意义。

但我怀疑你需要使用事件。下面是一些必须放在工作簿的Microsoft Excel对象ThisWorkbook中的事件例程。这些只是输出到立即窗口,以便您可以看到它们何时被触发。注意:可以为一个用户事件触发几个。例如,创建一个新工作表,触发:“为新工作表创建”,“为旧工作表取消激活”和“为新工作表激活”。

不要忘记包含

    Application.EnableEvents = False

    Application.EnableEvents = True

围绕其中一个例程中将触发事件的任何语句。

也许你需要使用SheetDeactivate。当用户离开工作表时,请检查E56中的值。如果存在,请检查其是否包含在总计表中。玩一玩。做你的用户做的事情。添加到这些例程以进一步调查。祝你好运。

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

  Debug.Print "Workbook_SheetActivate " & Sh.Name

End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)

   Call MsgBox("Workbook_BeforeClose", vbOKOnly)

End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Source As Range)

  Debug.Print "Workbook_SheetChange " & Sh.Name & " " & Source.Address

End Sub
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

  Debug.Print "Workbook_SheetDeactivate " & Sh.Name

End Sub
Private Sub Workbook_NewSheet(ByVal Sh As Object)

  Debug.Print "Workbook_NewSheet " & Sh.Name

End Sub
Sub Workbook_Open()

   Debug.Print "Workbook_Open"

End Sub

回应澄清要求的额外部分

下面的代码重新计算除TOTAL之外的所有工作表的单元格E56的总计,并在每次打开工作簿时以及每次用户更改当前工作表时将结果存储在工作表TOTAL中。

很难与Excel保持一致的时序,但根据我的实验,在用户因为重新计算而注意到延迟切换工作表之前,您需要500到1,000张工作表。

我不确定您是否知道如何安装此代码,因此这里有简要说明。询问它们是否过于简短。

  • 打开相关工作簿。
  • 点击Alt+F11。 VBA编辑器显示。在左下角,您应该看到Project Explorer。如果不是,请点击Ctrl+R。 Project Explorer显示内容如下所示:

VBAProject (Xxxxxxxx.xls)
    Microsoft Excel Objects
       Sheet1 (Xxxxxxxxx)
       Sheet10 (Xxxxxxxxx)
       Sheet11 (Xxxxxxx)
       :
       ThisWorkbook
  • 点击ThisWorkbook。屏幕右上角变白。
  • 将以下代码复制到该白色区域。
  • 无需采取进一步行动。适当时,宏Workbook_Open()和Workbook_SheetDeactivate()会自动执行。
祝你好运。

Option Explicit

Sub CalcAndSaveGrandTotal()

  Dim InxWksht As Long
  Dim TotalGrand As Double

  TotalGrand = 0#
  For InxWksht = 1 To Worksheets.Count
    If Not UCase(Worksheets(InxWksht).Name) = "TOTAL" Then
      ' This worksheet is not the totals worksheet
      If IsNumeric(Worksheets(InxWksht).Range("E56").Value) Then            '###
        TotalGrand = TotalGrand + Worksheets(InxWksht).Range("E56").Value
      End If                                                                '###
    End If
  Next

  'Write grand total to worksheet TOTAL
  ' ##### Change the address of the destination cell as required  
  Worksheets("TOTAL").Range("D6").Value = TotalGrand

End Sub
Sub Workbook_Open()

  ' The workbook has just been opened.

   Call CalcAndSaveGrandTotal

End Sub
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

  ' The user has selected a new worksheet or has created a new worksheet.

   Call CalcAndSaveGrandTotal

End Sub

答案 1 :(得分:0)

我知道这是编程论坛,但是如果没有所有的管道,这个特殊的“需要”似乎是可以解决的。

我喜欢旧的隐藏的FIRST和LAST表格。

  1. 创建名为第一
  2. 的工作表
  3. 创建名为上次
  4. 的工作表
  5. 将当前数据表放在这两张纸之间。
  6. 隐藏工作表第一上次
  7. 现在,您可以使用3D公式对所有这些工作表中的单元格求和,如下所示: 的 = SUM(初:!最近E56)
  8. 现在只需在最后一张可见数据表之后将工作表添加到工作簿中,Excel仍然会在隐藏的LAST工作表之前将其滑动,因此您的公式会自行扩展