Excel VBA Worksheet_Calculate事件触发不同的工作簿

附加信息(在阅读其余部分后应该有意义):如果我打开Workbook1.xlsm,然后创build一个新的工作簿(Book1),我可以在Book1!Sheet1中input数据和公式,甚至是易失性函数,如NOW(),实例范围的重新计算。 我知道这一点,因为我正在观看Workbook1!SheetX中的计算事件处理程序。

初步结论:Excel并不总是自动重新计算所有打开的工作簿中的所有公式。 相反,它只会重新计算活动工作表(或者也许是活动工作簿),直到发生什么事情。

在这种情况下,“something”实际上是隐藏了calculate事件处理程序中的行。 我删除了各种代码行,发现如果我删除Me.Rows(x).Hidden = True行,实例范围的重新计算不会发生。 应用filter是触发事件的简单方法,但是添加公式会产生相同的结果,而不使用filter,所以filter似乎没有任何关系。

无论如何,以某种方式隐藏行会创build一个条件,导致一切重新计算。 只有在macros隐藏SheetX中的行之后才能执行SheetX中的计算macros,然后执行,无论在哪个工作簿或工作表中input数据。如果我通过Windows资源pipe理器打开第三个工作簿,则立即进行任何更改计算macros。 我可以在Sheet1中添加一个事件处理程序,并validation这两个处理程序(SheetX和Sheet1)正在执行,并且SheetX每次都执行,即使更改在Sheet1中。


注意:请不要被容易或更好的隐藏行或单元格的方式分散注意力。 我确定有。 我的问题与Excel中的错误有关,所以请关注事件的触发, 除非问题与macros写入的方式有关。

情况:

在Win7下使用Excel 2013。

Workbook1,SheetX有VBAmacrosWorksheet_Calculate()。 SheetX有数据过滤。

打开Workbook1。

使用File |打开一个新的工作簿 新| | 空白的工作簿。 它的名字是Book2。

返回到Workbook1并筛选SheetX中的列(例如,在A列中仅显示3的值)。 [你也可以在A4:C7范围内的任何地方input另一个公式。]

在Book2中的单元格中input一个值。

Workbook1的Worksheet_Calculate()事件触发。 这可以通过设置一个断点来演示。

此外,事件触发后,TAB键不再在Book2中工作,但在Workbook1中正常工作。 这似乎是特定于正在显示的工作表,因为如果您在Book2中创build工作表2,TAB键将工作,直到您inputSheet2中的某些内容,之后它将工作在工作表Sheet1,直到您input的东西。 反之亦然,令人难以置信。

SheetX包含以下内容。 macros的唯一目的是隐藏第2行和第3行,它们在现实生活中包含用户不需要知道的参数。 当使用filter时,行将被取消隐藏/可见。 A3中的公式需要确保Worksheet_Calculate事件在工作表中的任何内容发生更改时触发。

  ABC 1 data1 data2 data3 2 3 =A2 4 3 A3 C5 5 4 a3 C6 6 3 A5 C7 7 6 a6 C8 

这个macros在这里:

 Private Sub Worksheet_Calculate() 'Hide rows 2 & 3, which are the rows containing parameters. 'This is necessary because whenever an autofilter selection is removed, ' Excel redisplays hidden rows and rows with 0 height. On Error GoTo errHdlr 'First ensure that the event does not loop. Application.EnableEvents = False 'Have to unprotect and re-protect the sheet to make these changes. Me.Unprotect Me.Rows(2).Hidden = True Me.Rows(3).Hidden = True 'Have to specify that the user can insert hyperlinks ' and use filters. Me.Protect , , , , , , , , , , True, , , , True 'Now restore event handling. Application.EnableEvents = True Exit Sub errHdlr: MsgBox "Error #" & Err.Number & ":" _ & vbCrLf & " " & Err.Description _ & vbCrLf & "Please inform tech support.", vbCritical + vbOKOnly, _ "Worksheet_Calculate" Resume Next End Sub 

因为我对“我”这个对象有点怀疑,所以我和debugging器进行了检查,当我在Book2中的时候,事件发生的时候就是这样的:

?me.Name

SheetX

?me.Parent.name

Workbook1.xlsm

?activesheet.name

工作表Sheet1

?activesheet.parent.name

第二册

因此,即使活动工作表是Book2中的Sheet1,“Me”对象也很清楚地指向Workbook1中的SheetX。

感谢您的任何想法!