我有一个从电子表格功能(用户定义的功能,UDF)调用的VBA宏。当从互联网上下载电子表格并且用户相应地设置了“信任中心”设置时,电子表格将以这样的方式打开,即所谓的“保护视图”。该函数将不会被调用。显示按钮“启用编辑”。
如果按下该按钮,则电子表格将被“信任”并正常重新打开,从而开始计算并因此调用用户定义的函数。
但是,在该VBA函数中,Application.ActiveWorkbook
的值为Nothing
。这可以在调试器中进行验证。
由于我只需要阅读电子表格的某些属性(如路径名),因此我可以选择检查Application.ActiveProtectedViewWindow
的可用性,该引用应引用工作簿的受保护版本。在调试器中,可以检查此对象。但是,在发行版中运行(未经调试),Application.ActiveProtectedViewWindow
的值也为Nothing
。
两种行为-尤其是第一种行为-似乎都是Excel 2010和2013中存在的错误(另请参见a post at the MSDN forum)。
问题:在启用活动工作簿以进行编辑之后,是否有办法掌握活动工作簿的属性?
PS:作为对Siddharth Rout的很好观察的结果,“ ThisWorkbook”可能有效:就我而言,该宏不属于开放式工作簿的一部分。 UDF在XLA中定义。因此,ThisWorkbook将引用XLA。我确实需要获得ActiveWorkbook(=调用UDF的工作簿)而不是ThisWorkbook(=运行UDF的工作簿)。
重要要求:
我的函数称为用户定义函数,即执行顺序由Excel更新单元格确定。
该功能不是正在打开的工作簿的一部分。它是XLA的一部分。
我无法将任何代码添加到打开的工作簿中。
最佳答案
摘要:该问题可以重现,并且有一些可能的解决方法。聊天产生的最有希望的方法是使用ActiveWindow.Parent
而不是ActiveWorkbook
。
我能够重现问题。
我试过了
Private Sub Workbook_Open()
MsgBox "Application.ActiveWorkbook Is Nothing = " & _
CStr(Application.ActiveWorkbook Is Nothing)
End Sub
我得到了
True
但是,后来我尝试了一下,它给了我
False
Private Sub Workbook_Open()
MsgBox "Application.ActiveWorkbook Is Nothing = " & _
CStr(Application.ThisWorkbook Is Nothing)
End Sub
现在回答您的问题...
问题:在启用工作簿进行编辑后,是否有办法掌握工作簿的属性?
是。使用
ThisWorkbook
代替ActiveWorkbook
后续评论
退出
Protected Mode
后,一旦工作簿完全加载,便可以访问ActiveWorkbook
对象。要对此进行测试,请将此代码放在受保护的文件中。Private Sub Workbook_Activate()
MsgBox "Application.ActiveWorkbook Is Nothing = " & _
CStr(Application.ActiveWorkbook Is Nothing)
End Sub
您会注意到您得到一个
False
因此,一旦加载工作簿,您的加载项就可以使用
ActiveWorkbook
与打开的文件进行交互。这是另一个测试
Private Sub Workbook_Activate()
MsgBox ActiveWorkbook.Path
End Sub
这就是我得到的那一刻,我退出
Protected Mode
聊天的跟进
使用
ActiveWindow.Parent.Path
代替ActiveWorkbook.Path
将解决问题。