excel - 由 VBA 关闭的工作簿未关闭引用,IsAddin 工作簿
问题描述
版本
Excel 2016 桌面版
语境
VBA 项目(“客户端”.xlsb)引用了另一个工作簿(工具菜单 > 参考)。参考书不是插件,它是一个普通的 .xlsb 文件。
如果客户书仍然打开,则无法关闭参考书:
"This workbook is currently referenced by another workbook and cannot be closed."
我渴望这种行为。
问题
如果 VBA 使用 关闭客户端书籍ThisWorkbook.Close
,则引用的书籍将保留在内存中——它不会像手动关闭客户端时那样自动关闭。
使用VBA关闭客户端书籍时,如何使参考书籍自动关闭?理想情况下,即使打开了其他工作簿,该解决方案也会关闭参考书。
我将无法使用需要以编程方式从客户端删除引用的解决方案,因为我不能保证用户在宏安全中具有对 VBA 的受信任访问权限。
假设不止一本打开的书可能会引用被引用的书,因此在最后一个客户关闭之前不应关闭引用。
尝试的解决方案
AfterClose 事件:当没有其他客户端打开时,让引用的书自行关闭。这里的挑战是,在所有客户端都关闭之前,不能关闭引用的文件。这意味着,我们必须等待 Workbook_AfterClose 事件——不幸的是,不存在这样的 Workbook_AfterClose 事件。我试图通过拦截 Application_WorkbookDeactivate 和 Application_WorkbookActivate 事件(客户端外部)来滚动我自己的 Workbook_AfterClose 事件。到目前为止没有运气。
OnTime:在最后一个客户端关闭 5 秒后使用 OnTime 事件模拟 AfterClose 事件。但是,如果 OnTime 事件在由 VBA 使用 ClientWorkbook.Close 启动的 Workbook_Close 事件中注册,则似乎不会触发它们。
模拟鼠标:在客户手册的 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
这就是现在发生的事情
笔记
否则在运行代码时会出现以下错误。
推荐阅读
- r - 如何制作带有整体误差线的堆积条形图?
- python - 执行 python 请求发布脚本时出错
- java - 如何覆盖子类中的父类方法,使其返回类型为子类
- ios - 在 UIRepresentableView 和 SwiftUI 的 View 之间设置独占触摸
- node.js - 开玩笑未能相等的枚举值
- python - 部署干草堆模型/工作流程
- http-status-code-404 - 当 tile 为 404 时,openlayers 会放大前一个 tile 图像而不是隐藏它
- python - 通过 k 聚类处理 Iris 数据集
- python - VS Code 中的 Pylance 使用 import * 报告未定义的变量
- java - 打印具有唯一 K 个不同元素的所有子数组