VBA:运行Workbook_BeforeClose来自常规模块而不是ThisWorkbook of Active Workbook

时间:2017-04-06 20:46:27

标签: vba excel-vba excel

所以我写了一个宏,我希望在工作簿结束时运行。

不幸的是,显然这样做的唯一方法是将宏放在实际文件的ThisWorkbook模块中,而不是让它放在PERSONAL.XLSB中。

由于以下几个原因,这是不可取的:

  1. 宏必须放入需要运行的每个工作簿中 - 我有数百个。

  2. 工作簿需要保存为启用宏,根据我的经验,许多电子邮件服务器都不会接受附加了宏工作簿的电子邮件。

  3. 理想情况下,我希望能够在一般模块中运行PERSONAL.XLSB中的宏。

    关于如何做到这一点的任何建议?

    修改

    根据说明:

    http://www.cpearson.com/excel/AppEvent.aspx

    PERSONAL.XLSB

    CExcelEvents class module

    Private WithEvents App As Application
    
    Private Sub Class_Initialize()
        Set App = Application
    End Sub
    
    Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
        MsgBox "New Workbook: " & Wb.Name
    End Sub
    

    PERSONAL.XLSB

    ThisWorkbook

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

    如果您尝试打开其他工作簿,则无法正常工作。如果您在最近的文档中单击PERSONAL.XLSB,它将触发该消息。

    将其移动到特定工作簿的另一个ThisWorkbook对象中,它仍然只适用于该工作簿:

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

    所以即使类模块在PERSONAL.XLSB中,你仍然需要把上面的内容放到你希望它在它上面运行的工作簿上,我想我仍然会需要将其保存为.XLSM,并且会遇到电子邮件过滤器问题。

    出于某种原因,这确实开始使用PERSONAL.XLSB中的所有内容,尽管我没有改变任何内容。令人兴奋,但想知道原因。

    但是,现在我正试图通过BeforeClose更改示例以实际工作。所以我更新到以下内容:

    PERSONAL.XLSB

    CExcelEvents class module

    Private WithEvents App As Application
    
    Private Sub Class_Initialize()
        Set App = Application
    End Sub
    
    Private Sub App_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
        MsgBox "Closing the workbook."
    End Sub
    

    PERSONAL.XLSB

    ThisWorkbook

    Private XLApp As CExcelEvents
    
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        Set XLApp = New CExcelEvents
    End Sub
    

    回到昨天发生的事情......只会在你关闭PERSONAL.XLSB时触发。有人会认为,由于PERSONAL.XLSB打开所有工作簿,它会触发,但不是。同样,保存在目标工作簿的ThisWorkbook对象中仍有效,但由于必须另存为.XLSM和电子邮件过滤器,因此无法解决此问题。

1 个答案:

答案 0 :(得分:2)

您可以查看应用程序事件,它允许您使用可能位于Personal.xlsb中的代码挂钩应用程序级别的事件

这是一个很好的起点:http://www.cpearson.com/excel/AppEvent.aspx