所以我写了一个宏,我希望在工作簿结束时运行。
不幸的是,显然这样做的唯一方法是将宏放在实际文件的ThisWorkbook
模块中,而不是让它放在PERSONAL.XLSB
中。
由于以下几个原因,这是不可取的:
宏必须放入需要运行的每个工作簿中 - 我有数百个。
工作簿需要保存为启用宏,根据我的经验,许多电子邮件服务器都不会接受附加了宏工作簿的电子邮件。
理想情况下,我希望能够在一般模块中运行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
和电子邮件过滤器,因此无法解决此问题。
答案 0 :(得分:2)
您可以查看应用程序事件,它允许您使用可能位于Personal.xlsb中的代码挂钩应用程序级别的事件