在特定 sheet / Excel 上调用宏

Call Macro on a specific sheet / Excel

我想要 运行 特定 sheet 上的宏,在我的例子中 sheet 被称为 "Tablet"。

如果 "Tabelle1" 中的单元格值发生变化,我想 运行 "Tablet" sheet 中的此宏。

我的 Tabelle1 中的代码:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$C" Then
        Call Delete_OptionB1
    End If
End Sub

这部分有效。

宏代码:

Sub Delete_OptionB1()
'
' Delete_OptionB1 Makro
'
     With Worksheets("Tablet")
    .Range("M2:AD2").Select
     Selection.ClearContents
    End With
End Sub

这行不通。有什么关于我如何让它工作的建议吗?

而不是……

Target.Address = "$C"

... 如果 Target 不止一个单元格,最好使用 Application.Intersect method 使其工作(当您 copy/paste 一个范围时可能会发生这种情况):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Target.Parent.Range("C2")) Is Nothing Then
        Delete_OptionB1 'you don't need the Call statement
    End If
End Sub

如果 Delete_OptionB1 不在 public 模块中而是在工作簿中,请使用例如 Tablet.Delete_OptionB1


使Delete_OptionB1public,并避免使用.SelectSelection.(另见How to avoid using Select in Excel VBA

Public Sub Delete_OptionB1() 'make it public
    ThisWorkbook.Worksheets("Tablet").Range("M2:AD2").ClearContents
End Sub

在您的代码中使用 with 块

 With Worksheets("Tablet")
.Range("M2:AD2").Select
 Selection.ClearContents
End With

您正在选择 .Range("M2:AD2").Select,但随后在 Delete_OptionB1 时清除了 sheet 可能处于活动状态的选择内容。更改以包含一个 . - .Selection.ClearContents.

更好的是,完全摆脱 With...End WithSelect。一行即可完成所有工作:

Sub Delete_OptionB2()
'
' Delete_OptionB1 Makro
'
    Worksheets("Tablet").Range("M2:AD2").ClearContents
End Sub

将其放在 Tabelle1 工作表代码区域:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("$C")) Is Nothing Then
        Application.EnableEvents = False
            Call Delete_OptionB1
        Application.EnableEvents = True
    End If
End Sub

将它放在 标准模块中:

Sub Delete_OptionB1()
'
' Delete_OptionB1 Makro
'
     With Worksheets("Tablet")
        .Range("M2:AD2").ClearContents
    End With
End Sub