Version
Excel 2016 桌面版
Context
VBA 项目(“客户端”.xlsb)具有对另一个工作簿的引用(“工具”菜单 >“引用”)。参考书目isn't一个插件,它是一个普通的 .xlsb 文件。
这会导致如果客户书籍仍处于打开状态,则无法关闭引用的书籍:
"This workbook is currently referenced by another workbook and cannot be closed."
我渴望这种行为。
Problem
如果使用 VBA 关闭客户簿ThisWorkbook.Close
,那么引用的书籍将保留在内存中——它不会像手动关闭客户端时那样自动关闭。
当用VBA关闭客户端书籍时,如何使引用的书籍自动关闭?理想情况下,即使其他工作簿打开,该解决方案也会关闭引用的书籍。
我无法使用需要以编程方式从客户端删除引用的解决方案,因为我无法保证用户在宏安全性中具有对 VBA 的可信访问权限。
假设不止一本打开的书可能引用参考书,因此在最后一个客户端关闭之前不应关闭引用。
尝试的解决方案
-
关闭后事件:当没有其他客户端打开时,让参考书自行关闭。这里的挑战是,在所有客户端都关闭之前,引用的文件无法关闭。这意味着,我们必须等待 Workbook_AfterClose 事件——不幸的是,不存在这样的 Workbook_AfterClose 事件。我尝试通过拦截 Application_WorkbookDeactivate 和 Application_WorkbookActivate 事件(客户端外部)来滚动我自己的 Workbook_AfterClose 事件。到目前为止还没有运气。
-
OnTime:最后一个客户端关闭后 5 秒,使用 OnTime 事件模拟 AfterClose 事件。但是,如果 OnTime 事件在由 VBA 使用 ClientWorkbook.Close 启动的 Workbook_Close 事件中注册,则似乎不会触发 OnTime 事件。
-
模拟鼠标:在客户端簿的 Workbook_Close 事件中,模拟鼠标单击客户端簿的前端关闭按钮。但操纵鼠标似乎通常是个坏主意。此外,如果其他不相关的书籍打开,这也不会关闭参考书。
-
删除参考:在关闭客户端之前以编程方式删除引用。但这需要对 VBA 的可信访问,而我没有。
这就是你所面临的
这就是你正在尝试的吗?
Option Explicit
'~~> This is the name of the VBA project from the referenced workbook
Private Const ReferenceWbModule As String = "MyVBAProject"
Private Const ReferenceWb As String = "Test.xlsb"
Sub Sample()
'~~> Save the workbook (IMPORTANT)
ThisWorkbook.Save
'~~> Remove the reference
Dim RefName As String: RefName = ReferenceWbModule
Dim oRefS As Object, oRef As Object
Set oRefS = ThisWorkbook.VBProject.References
For Each oRef In oRefS
If oRef.Name = RefName Then
oRefS.Remove oRef
Exit For
End If
Next
'~~> Close the workbook
Dim wb As Workbook
Set wb = Workbooks(ReferenceWb)
wb.Close (False)
'~~> Close without saving so that next time the reference is still there
ThisWorkbook.Close (False)
End Sub
这就是现在发生的事情
NOTE
你必须给予以编程方式访问 Office VBA 项目 https://support.microsoft.com/en-us/topic/programmatic-access-to-office-vba-project-is-denied-960d5265-6592-9400-31bc-b2ddfb94b445
否则,当您运行代码时,您将收到以下错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)