Excelmacros在personal.xls中运行,但不在任何其他工作簿中运行

我已经将下面的macros放在我的c:\program files (x86)\microsoft office\office11\xlstart\personal.xls

 Option Explicit Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) ' http://stackoverflow.com/questions/15267796/macro-to-make-a-backup-while-saving-a-file ' http://office.microsoft.com/en-us/excel-help/deploy-your-excel-macros-from-a-central-file-HA001087296.aspx Dim BackupName As String MsgBox "ActiveWorkbook.Name: " & ActiveWorkbook.Name 'For debugging BackupName = ActiveWorkbook.Name BackupName = Mid(BackupName, 1, InStrRev(BackupName, ".")) & "bak" 'For testing BackupName = "D:\temp\" & BackupName 'For testing BackupName = ActiveWorkbook.Path & "\" & BackupName ActiveWorkbook.SaveCopyAs BackupName End Sub 

从我的理解(例如上面提到的第二个链接),我应该每次保存任何工作表时都运行这个工作表,但是这并没有发生。
只有我(编辑和)保存personal.xls我看到MsgBoxpersonal.bak文件出现。

我忘了什么

(运行W7 64位和Office 2003)。

我在评论中提到,你所拥有的是一个工作簿级的事件过程。 这与“macros”(您的公共macros可用于任何打开的工作簿,但工作表或工作簿级事件不会响应其他工作簿事件)略有不同。 你需要的是捕获应用程序级别的事件

我还没有完全testing这个,但我做了一些简单的testing,似乎工作,(我正在移植一些代码,我在PowerPoint中使用陷阱应用程序级别的事件)。 给这个镜头,让我们看看它是否适合你。

首先创build一个类对象来处理事件。

在您的Personal.XLS中,添加一个Class模块并将其命名为cEventClass (您可以将其命名为wahtever),但如果您使用与我使用的命名约定相同的命令,则会更容易遵循我的示例。

在这个类模块中,input以下代码:

 Option Explicit Public WithEvents XLEvent As Application Private Sub XLEvent_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean) 'This is just my test, you can place your own code (modified as needed) here: MsgBox "BeforeSave " & Wb.Name End Sub 

现在我们已经build立了陷阱应用程序级事件的方法,我们可以在VBE的下拉列表中看到这些可用的选项:

在这里输入图像描述

接下来 ,实例化这个类的一个实例。

在Personal.XLS Workbook_Open过程中可能最好的地方。 你可以把它放在另一个子节点,并按需要调用它,但如果你把它放在这个事件处理程序中,我认为它应该工作。

添加一个正常的代码模块(这不能进入一个对象或类模块),这样做:

 Public cXLEvents As New cEventClass 

添加一些代码来自动实例化类

在Personal.XLS的Workbook_Open过程中,执行以下操作:

 Option Explicit Private Sub Workbook_Open() 'Add this line in addition to any other code you might already have in this procedure Set cXLEvents.XLEvent = Application End Sub 

现在,请坐下来让经理人完成工作!

现在,当你去保存任何工作簿(不限于Personal.XLS)时,应用程序事件处理程序应该把它拿起来,正如我的例子所validation的那样:

在这里输入图像说明

注意我认为如果你正在debugging和“结束”运行时,这将失效; 这将杀死cXLEvents ,所以事件处理程序将基本上“closures”,所以你需要重新实例化它。