我有两个Excel文件,我通常会同时打开:一个有宏,另一个没有。问题是,当它们都打开时,宏也可以在没有它的文件上工作,这是一个问题。如何确保它仅适用于创建文件的文件?
OS: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
答案 0 :(得分:0)
第一种方法是这样,但它只适用于单个命名工作表。如果你想在许多工作表中使用它,请告诉。
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
答案 1 :(得分:0)
这有助于测试宏是否应该激活 - 请ThisWorkbook
对ActiveWorkbook
示例:
Public Sub test1()
If ThisWorkbook.Name = ActiveWorkbook.Name Then
Debug.Print "ok to run"
Else
Debug.Print "not ok"
End If
End Sub
答案 2 :(得分:0)
您可以将宏代码放在工作表模块中,以运行它所运行的工作表。
这样做可以访问Me
对象,在这种情况下会引用工作表。因此,您不需要对工作表名称进行硬编码,虽然您可以从其他地方调用sub,但它会在进行任何更改之前退出。
例如:如果您的宏在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
<强>更新强>
当您使用宏录制器创建宏时,它将创建一个名为“模块1”(或2或3等)的模块。如果您打开VBA编辑器,并查看项目资源管理器,将会有一个名为“工作表1”的项目(或在您的情况下为“当前”)。双击该项并将代码粘贴到编辑器窗口中。
更新2
当您发布代码时,请编辑您的问题并将其包含在那里,这样可以更轻松地阅读,并且每个人都可以在不通过评论的情况下阅读它。
您需要将生成的代码修改为与我的类似。差异很小,所以如果你有任何其他类似的宏,调整其余的应该相当简单。 (代码的格式无关紧要,只是为了便于阅读)
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窗口中宏对话框中的“编辑”按钮重新配置它。