【问题标题】:Run VBA macro whenever any workbook is opened每当打开任何工作簿时运行 VBA 宏
【发布时间】:2015-10-15 10:12:17
【问题描述】:

我创建了一个 Excel 加载项,该加载项尝试在打开此会话期间打开的所有工作簿时运行。它有时会起作用 - 但并非总是如此,我不知道为什么。

我创建了一个文件,addin.xlam,在这个文件中,ThisWorkbook,我有:

Private XLApp As CExcelEvents

Private Sub Workbook_Open()
    Set XLApp = New CExcelEvents
End Sub

然后我根据这里的代码创建了一个类模块:http://www.cpearson.com/Excel/AppEvent.aspx

Private WithEvents App As Application

Private Sub Class_Initialize()
    Set App = Application
End Sub

Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
    If Not ActiveWorkbook Is Nothing Then
        If InStr(ActiveWorkbook.Name, "New Quote") Then
            quoteCheck = MsgBox("Do you want to run the Quote Generator?", vbYesNo, "Quote Generator")
            If quoteCheck = vbYes Then
                prepare
            Else
                End
            End If
        End If
    End If
End Sub

如果我关闭 Excel 并从 Windows 资源管理器打开文件,则会出现以下行:

Private Sub App_WorkbookOpen(ByVal Wb As Workbook)

然后启动代码 - 如果相关工作簿的名称中有“新报价”,则宏运行。繁荣。完美。

但是,在此运行一次之后,如果我打开另一个带有“新报价”字样的工作簿,则不会触发此私有子。为什么?

我如何让这个每次我打开任何工作簿时触发?

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    显然,打开工作簿并不会自动使其成为活动工作簿,至少在触发此事件处理程序的时间是这样。试试这个:

    Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
        If Not Wb Is Nothing Then
        If InStr(Wb.Name, "New Quote") Then
            quoteCheck = MsgBox("Do you want to run the Quote Generator?", vbYesNo, "Quote Generator")
            If quoteCheck = vbYes Then
                prepare
            Else
                End
            End If
        End If
    End If
    End Sub
    

    【讨论】:

    • 还是什么都没有。即使我在Private Sub App_WorkbookOpen(ByVal Wb as Workbook) 的第一行加上stopstop 也不会触发,所以子程序本身也不会触发。
    • 也许问题是这些后续工作簿没有在加载项工作簿集合中打开
    • 查看我的答案 - 我将其作为答案发布,以便我可以更轻松地添加代码。奇怪,有时我不明白为什么 Excel 会做它所做的事情......我很感谢你帮助我调查它!
    【解决方案2】:
    Private WithEvents App As Application
    
    Private Sub Class_Initialize()
        Set App = Application
    End Sub
    
    Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
        If Not ActiveWorkbook Is Nothing Then
        If InStr(ActiveWorkbook.Name, "New Quote") Then
            quoteCheck = MsgBox("Do you want to run the Quote Generator?", vbYesNo, "Quote Generator")
            If quoteCheck = vbYes Then
                prepare
            Else
                '/ End '/REMOVE THIS LINE <--------------
            End If
        End If
    End If
    End Sub
    

    我不确定这是为什么 - 但是当我检查“否”时(所以我没有继续,因为我只是在测试这个),我在类模块中运行 End,这停止了Sub 从重新启动直到我重新启动 Excel。删除此End 代码现在允许Private Sub 在我每次打开工作簿时触发......很奇怪。

    【讨论】:

    • 看来您可能需要在那里使用Exit Sub 而不是End。但是,当 If 语句无论如何评估为 False 时,看起来也没有其他任何事情发生,因此完全删除它不会有任何区别。
    • 是的,EndExit Sub 和 [什么都没有] 都在做同样的事情.....它现在有效,所以我不碰它 :)
    • 仅使用 End 会清除模块级变量,因此它可能会清除您的 App 变量,因此它不再捕获事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    相关资源
    最近更新 更多