也许今天早上我只是在Googles上表现糟糕,但是我很快就在VBA中找到一个事件处理程序,用于在从其他应用程序切换时激活工作簿.我正在使用Excel 2010.
在ThisWorkbook对象中,我尝试了以下内容:
Private Sub Workbook_Activate()
MsgBox "1"
End Sub
Private Sub Workbook_WindowActivate(ByVal Wn As Window)
MsgBox "2"
End Sub
Run Code Online (Sandbox Code Playgroud)
在类模块中,我尝试过这些:
Public WithEvents appevent As Application
Private Sub appevent_ProtectedViewWindowActivate(ByVal Pvw As ProtectedViewWindow)
MsgBox "1"
End Sub
Private Sub appevent_ProtectedViewWindowOpen(ByVal Pvw As ProtectedViewWindow)
MsgBox "2"
End Sub
Private Sub appevent_WindowActivate(ByVal Wb As Workbook, ByVal Wn As Window)
MsgBox "3"
End Sub
Private Sub appevent_WorkbookActivate(ByVal Wb As Workbook)
MsgBox "4"
End Sub
Private Sub appevent_WorkbookDeactivate(ByVal Wb As Workbook)
MsgBox "5"
End Sub …Run Code Online (Sandbox Code Playgroud) 当您打开多个Excel文件,并且VBA/VSTO代码调用该Calculate函数或打开自动计算时,Excel将痛苦地重新计算所有打开的工作簿,而不仅仅是活动工作簿.
这是一个众所周知且报道良多的问题,已存在多年,但微软似乎并不想修复它.
可笑的是,在VBA和VSTO中,微软让我们有能力:
...但是没有选择只重新计算一个特定的工作簿.
在我工作的金融公司,这是一个巨大的问题.我们的精算师有大,笨重的Excel文件,充分公式,当他们点击计算上一个工作簿或我们保存文件前进行计算,然后他们必须等待几分钟到其他所有打开的Excel文件也得到计算.
有两种方法可以解决这个问题.
你可以像这样运行一些VBA:
Application.Calculation = xlManual
For Each sh In ActiveWorkbook.Worksheets
sh.Calculate
Next sh
Run Code Online (Sandbox Code Playgroud)
..但这不能保证有效.您的"Sheet1"可能包含指向"Sheet2"中单元格的公式,但"Sheet2"中的其他单元格可能依赖于"Sheet1".因此,计算每个工作表一次可能不足以在工作簿上执行完整计算.
或者,您可以在单独的实例中打开每个Excel文件(通过在打开Excel图标时按住ALT).但是,你失去了完整的Excel cut'n'pasting功能,如下所述:
所以,我的问题是......有没有人找到解决这个问题的方法?
我只想重新计算Active Excel工作簿中的单元格.
我想知道是否可以添加一些VBA或VSTO,在我启动Active Workbook上的计算之前将所有非活动工作簿设置为"只读",从而防止其他工作簿被重新计算.但这是不可能的.Workbook.ReadOnly只能读取" ",而不能以编程方式设置.
或者可能在Worksheet_Calculate事件中添加一个处理程序,它检查正在运行的VBA代码是否属于Active Workbook,如果没有,它会中止尝试计算......?但这个事件实际上被拉开序幕后,该工作表已被计算,所以一切都太迟了.
我们公司不可能是唯一遭受这个问题的人......
任何建议(除了升级到Lotus 1-2-3)?