Excel – 如何禁用不活动工作表的macros

我有两个Excel文件,我通常保持同时打开:一个有macros,另一个没有。 问题是,当他们都打开macros也适用于没有它的文件,这是一个问题。 我如何确保它只能在创build它的文件上工作?

操作系统:WIN Vista Business 16

微距:

Sub riordino() ' ' riordino Macro ' Macro recorded 4/14/2007 by User ' ' Keyboard Shortcut: Ctrl+l ' Range("A1:L200").Select Selection.Sort Key1:=Range("C2"), Order1:=xlAscending, Key2:=Range("D2") _ , Order2:=xlAscending, Key3:=Range("A2"), Order3:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom Range("A2").Select ActiveWorkbook.Save End Sub 

第一种方法是这样的,但它只适用于单个命名的工作表。 如果你想在很多工作表中使用它,只要告诉。

 Sub riordino() ' ' riordino Macro ' Macro recorded 4/14/2007 by User ' ' Keyboard Shortcut: Ctrl+l ' Dim MyBook as WorkBook Dim MySheet as Worksheet Set MyBook = Application.Workbooks("YourWorkBookName") 'filename Set MySheet = MyBook.Worksheets("WorksheetName") MySheet.Range("A1:L200").Sort Key1:=Range("C2"), Order1:=xlAscending, Key2:=Range("D2"), Order2:=xlAscending, Key3:=Range("A2"), Order3:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom MySheet.Range("A2").Select MyBook.Save End Sub 

另一种方法,与活动工作表(只在屏幕上看到的)一起工作。 在这种情况下,文件不会被保存,

 Sub riordino() ' ' riordino Macro ' Macro recorded 4/14/2007 by User ' ' Keyboard Shortcut: Ctrl+l ' Dim MySheet as Worksheet Set MySheet = Application.ActiveSheet MySheet.Range("A1:L200").Sort Key1:=Range("C2"), Order1:=xlAscending, Key2:=Range("D2"), Order2:=xlAscending, Key3:=Range("A2"), Order3:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom MySheet.Range("A2").Select End Sub 

这将有助于testingmacros是否应该激活 – 检查ThisWorkbookActiveWorkbook

例:

 Public Sub test1() If ThisWorkbook.Name = ActiveWorkbook.Name Then Debug.Print "ok to run" Else Debug.Print "not ok" End If End Sub 

您可以将macros代码放置在工作表模块中,以便运行该工作表。 这样做使您可以访问Me对象,在这种情况下将引用工作表。 所以你不需要对工作表名称进行硬编码,而当你可以从其他地方调用这个子工程时,它将在做任何改变之前退出。

例如:如果你的macros运行在sheet1上,你可以把它放在sheet1模块中。

 Sub riordino() If Not Me.Name = Application.ActiveSheet.Name Then Exit Sub Me.Range("A1:L22").Sort _ Key1:=Me.Range("C2"), _ Order1:=xlAscending, _ Key2:=Me.Range("D2"), _ Order2:=xlAscending, _ Key3:=Me.Range("A2"), _ Order3:=xlAscending, _ Header:=xlGuess, _ OrderCustom:=1, _ MatchCase:=False, _ Orientation:=xlSortRows Me.Range("A2").Select ThisWorkbook.Save End Sub 

更新

当你使用macroslogging器创buildmacros时,它将创build一个名为“模块1”(或2或3等)的模块。 如果您打开VBA编辑器,并在项目浏览器中查找,将会出现一个名为“Sheet 1”的项目(或者您的情况为“Current”)。 双击该项目并将代码粘贴到编辑器窗口中。

在vba项目浏览器中显示工作表模块的图像

更新2

当您发布代码时,请编辑您的问题并将其包含在其中,这样可以更容易阅读,并且每个人都可以阅读,而无需通过评论。

您需要将生成的代码修改为与我的类似。 差异是最小的,所以如果你有其他类似的macros,调整其余部分应该相当简单。 (代码的格式不重要,只是为了可读性)

 Sub Ordinare() If Not Me.Name = Application.ActiveSheet.Name Then Exit Sub Me.Range("A2:L201").Sort _ Key1:=Me.Range("C2"), _ Order1:=xlAscending, _ Key2:=Me.Range("D2"), _ Order2:=xlAscending, _ Key3:=Me.Range("A2"), _ Order3:=xlAscending, _ Header:= xlGuess, _ OrderCustom:=1, _ MatchCase:=False, _ Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal, _ DataOption2:=xlSortNormal, _ DataOption3:= xlSortNormal Me.Range("A2").Select ThisWorkbook.Save End Sub 

一旦将其粘贴到“Sheet N(Current)”模块中,“Module11”不再需要。 (保持它会导致问题)键盘快捷键也将不再起作用,您将不得不使用主Excel窗口中的macros对话框中的“编辑”button重新configuration它。