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

时间:2017-03-24 16:09:06

标签: excel excel-vba vba

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

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

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

无论如何,以某种方式隐藏行会创建一个导致所有内容重新计算的条件。 只有在宏隐藏了SheetX 中的行之后才会执行SheetX中的计算宏,然后无论我在哪个工作簿或工作表中输入数据,它都会执行。如果我然后通过Windows打开第三个工作簿资源管理器,任何更改都会立即触发计算宏。我可以在Sheet1中添加一个事件处理程序并验证两个处理程序(SheetX和Sheet1)是否正在执行,而SheetX每次都执行 ,即使更改是在Sheet1中。

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

情况:

在Win7下使用Excel 2013。

Workbook1,SheetX具有VBA宏Worksheet_Calculate()。 SheetX具有数据过滤功能。

打开Workbook1。

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

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

在Book2中的单元格中输入值。

Workbook1的Worksheet_Calculate()事件触发。这可以通过设置断点来证明。

此外,事件触发后,TAB键不再在Book2中工作,但在Workbook1中工作正常。这似乎是特定于正在显示的工作表,因为如果您在Book2中创建Sheet2,TAB键将一直有效,直到您在Sheet2中输入内容,之后它将在Sheet1中工作,直到您在那里输入内容为止。反之亦然。

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

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

宏在这里:

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

因为我对“Me”对象有点怀疑,所以我检查了调试器,当我在Book2中时,这是我在事件发生时发现的:

  

?me.Name

     

SheetX

     

?me.Parent.name

     

Workbook1.xlsm

     

?activesheet.name

     

Sheet 1中

     

?activesheet.parent.name

     

第二册

很明显,“Me”对象引用Workbook1中的SheetX,即使活动工作表是Book2中的Sheet1。

感谢您的任何想法!

1 个答案:

答案 0 :(得分:0)

library(reshape2) library(ggplot2) col1<- c(0.43,0.78,-0.26,0.5,0.6,0.78,-0.2,0.1) col2<- c(0.23,0.48,-0.76,0.1,0.9,0.73,-0.7,0.2) col3<- c(0.83,0.18,-0.96,0.9,0.2,0.18,-0.79,0.3) col4<- c(0.23,0.98,-0.16,0.4,0.3,0.49,-0.2,0.2) test<-data.frame(col1,col2,col3,col4) test2 <- melt(test) ggplot(test2, aes(x = variable, y = value)) + geom_boxplot() 事件在这里无济于事,唯一的解决方法是在任何单元格(例如,单元格#A1)中都有一些特定的文本行“ My Report123”。

调用application.caller事件时,第一行应为检查点。

Worksheet_Calculate()

这将解决excel bug的问题。

相关问题