0

我有一个 Excel 工作簿,其中有代表日期的选项卡以及每个选项卡中的总和。虽然我可以在最后一张表中计算所有这些的总和,但是当添加新的电子表格时,我想要一个公式/宏来获得总命名表中的总和。

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

4

2 回答 2

0

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

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

不要忘记包括

    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
于 2012-04-12T09:46:42.620 回答
0

我知道这是编程论坛,但这种特殊的“需求”似乎可以在没有所有管道的情况下解决。

我喜欢旧的隐藏的第一张和最后一张纸把戏。

  1. 创建一个名为First的工作表
  2. 创建一个名为Last的工作表
  3. 将您当前的数据表放在这两张表之间。
  4. 隐藏第一张和最后一张
  5. 现在您可以使用 3D 公式对所有这些工作表中的单元格求和,如下所示: =SUM(First:Last!E56)
  6. 现在只需在最后一个可见数据表之后将工作表添加到您的工作簿,Excel 仍会将其滑入隐藏的 LAST 工作表之前,因此您的公式只是以这种方式扩展自身
于 2012-04-12T21:44:15.350 回答