1

我有两个通常同时打开的 Excel 文件:一个有宏,另一个没有。问题是,当它们都打开时,宏也适用于没有它的文件,这是一个问题。如何确保它仅适用于创建它的文件?

操作系统: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
4

3 回答 3

0

this will help test if the macro should activate - check ThisWorkbook against ActiveWorkbook

Example:

Public Sub test1()
If ThisWorkbook.Name = ActiveWorkbook.Name Then
    Debug.Print "ok to run"
Else
    Debug.Print "not ok"
End If
End Sub
于 2013-05-24T19:05:53.327 回答
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 编辑器,并查看项目资源管理器,将会有一个名为“Sheet 1”的项目(或在您的情况下为“当前”)。双击该项目并将代码粘贴到编辑器窗口中。

显示 vba 项目资源管理器中的工作表模块的图像

更新 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 窗口中宏对话框中的“编辑”按钮重新配置它。

于 2013-05-24T19:22:54.050 回答
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
于 2013-05-24T17:07:06.977 回答