【问题标题】:workbook does not open when add in calls a userform at start up加载项在启动时调用用户窗体时工作簿未打开
【发布时间】:2026-02-01 18:20:02
【问题描述】:

我有一个 excel 插件(xlam),它在打开 excel 时调用用户表单。

当我现在打开一个现有的 excel 文件时,用户表单会按预期显示,我可以单击“确定”按钮关闭用户表单。不幸的是,我打算打开的工作簿没有显示出来。

  • 它正在使用 vbmodeless,所以它似乎与用户窗体的“隐藏”或“卸载”有关
  • 当我打开一个新的 Excel 工作簿时,它工作正常

有人知道为什么工作簿没有打开吗? excel会忘记他要打开的工作簿吗?

【问题讨论】:

  • 请您发布代码而不是屏幕截图。谢谢。我认为您已将表单开口放在加载项开口中。
  • 是的 - 我认为当代码在不同的窗口中时图片更容易理解。对于您的问题:是的 - 整个代码都在加载项(xlam)中,并且用户表单在“ThisWorkbook”下的加载项中调用
  • 所以这只会在打开 Excel 时触发,而不是每个工作簿。
  • sry 但我有点困惑。也许我的目标并不明确:我有一个带有小程序的工具箱,用于 excel--> 插件。当我打开 excel 时,加载项被调用,我可以在所有工作簿中使用工具箱。因此,当使用第一个工作簿调用工具箱时就足够了。在打开工具箱时,他应该检查更新,如果有可用更新,请打开用户表单。如果您拒绝更新,请关闭用户窗体并打开我打算打开的工作簿。但是这个工作簿没有打开。我必须第二次打开它,因为工具箱不再被调用。(没关系)
  • 抱歉,我以为您希望每次打开工作簿时都显示​​该表单。我在我的用户表单Private Sub CommandButton1_Click() Me.Hide Unload Me End Sub 中有以下内容,在我的插件workbook_open Private Sub Workbook_Open() UserForm1.Show vbModeless End Sub

标签: excel vba startup userform


【解决方案1】:

在您的加载项中,您需要监听 Excel 的事件。因此,您需要创建一个基于 Excel 应用程序的类。

所以你会有一个名为 clsCustomExcelHandlers 的类,就像这样

Option Explicit

Public WithEvents ExcelApplication As Excel.Application

Private Sub ExcelApplication_WorkbookOpen(ByVal Wb As Workbook)
        '   Do something here
        MsgBox "You have opened " & Wb.FullName
End Sub

然后在一个标准模块中,有一个公共变量来保存这个类的一个实例

Public clsCustomExcel As clsCustomExcelHandlers

然后在插件Workbook_open 中进行设置

Private Sub Workbook_Open()
    Set clsCustomExcel = New clsCustomExcelHandlers
    Set clsCustomExcel.ExcelApplication = Application
End Sub

【讨论】:

  • 对不起 - 不能解决我的问题 - 我希望在第一个工作簿打开之前打开表单,问题是,在调用 UF 然后关闭工作簿后,工作簿没有打开。 - 感谢您的努力
  • 别担心,误会了。您可以将此答案与if workbooks.count=0 then userform.show ???