附加信息(阅读其余信息后应该有意义):如果我打开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。
感谢您的任何想法!
答案 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的问题。