首页 > 解决方案 > 由 VBA 关闭的工作簿未关闭引用,IsAddin 工作簿

问题描述

版本

Excel 2016 桌面版

语境

VBA 项目(“客户端”.xlsb)引用了另一个工作簿(工具菜单 > 参考)。参考书不是插件,它是一个普通的 .xlsb 文件。

如果客户书仍然打开,则无法关闭参考书:

"This workbook is currently referenced by another workbook and cannot be closed."

我渴望这种行为。

问题

如果 VBA 使用 关闭客户端书籍ThisWorkbook.Close,则引用的书籍将保留在内存中——它不会像手动关闭客户端时那样自动关闭。

使用VBA关闭客户端书籍时,如何使参考书籍自动关闭?理想情况下,即使打开了其他工作簿,该解决方案也会关闭参考书。

我将无法使用需要以编程方式从客户端删除引用的解决方案,因为我不能保证用户在宏安全中具有对 VBA 的受信任访问权限。

假设不止一本打开的书可能会引用被引用的书,因此在最后一个客户关闭之前不应关闭引用。

尝试的解决方案

标签: excelvbaexcel-addins

解决方案


这就是你所面临的

在此处输入图像描述

这是你正在尝试的吗?

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

这就是现在发生的事情

在此处输入图像描述

笔记

您必须授予对 Office VBA 项目的编程访问权限

在此处输入图像描述

否则在运行代码时会出现以下错误。

在此处输入图像描述


推荐阅读