我有一个从电子表格功能(用户定义的功能,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将解决问题。

07-26 05:40