Excel - 如何禁用非活动工作表的宏

时间:2013-05-24 16:59:05

标签: excel excel-vba vba

我有两个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

3 个答案:

答案 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)

这有助于测试宏是否应该激活 - 请ThisWorkbookActiveWorkbook

进行检查

示例:

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”的项目(或在您的情况下为“当前”)。双击该项并将代码粘贴到编辑器窗口中。

image showing the worksheet module in the vba project explorer

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