如何解决这个 "ambiguous name detected Worksheet_Change"?

How to fix this "ambiguous name detected Worksheet_Change"?

我试图添加两个相似的宏来做同样的事情(在两个不同的列中),但是当我让它 运行 它说:“检测到名称不明确 Worksheet_Change”。 (您可以在下面找到代码)

Private Sub Worksheet_Change(ByVal Target As Range)

Dim WorkRng As Range
Dim Rng As Range
Dim xOffsetColumn As Integer
Set WorkRng = Intersect(Application.ActiveSheet.Range("Cost_to_date"), Target)
xOffsetColumn = 1
If Not WorkRng Is Nothing Then
    Application.EnableEvents = False
    For Each Rng In WorkRng
        If Not VBA.IsEmpty(Rng.Value) Then
            Rng.Offset(0, xOffsetColumn).Value = Now
            Rng.Offset(0, xOffsetColumn).NumberFormat = "mmm dd, yyyy"
        Else
            Rng.Offset(0, xOffsetColumn).ClearContents
        End If
    Next
    Application.EnableEvents = True
End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

Dim WorkRng As Range
Dim Rng As Range
Dim xOffsetColumn As Integer
Set WorkRng = Intersect(Application.ActiveSheet.Range("Last_update"), Target)
xOffsetColumn = 1
If Not WorkRng Is Nothing Then
    Application.EnableEvents = False
    For Each Rng In WorkRng
        If Not VBA.IsEmpty(Rng.Value) Then
            Rng.Offset(0, xOffsetColumn).Value = Now
            Rng.Offset(0, xOffsetColumn).NumberFormat = "mmm dd, yyyy"
        Else
            Rng.Offset(0, xOffsetColumn).ClearContents
        End If
    Next
    Application.EnableEvents = True
End If
End Sub

如果我尝试执行以下操作以使其更小,Cost_to_date 和 Last_update 之间的所有列都会自动添加日期...

Private Sub Worksheet_Change(ByVal Target As Range)

Dim WorkRng As Range
Dim Rng As Range
Dim xOffsetColumn As Integer
Set WorkRng = Intersect(Application.ActiveSheet.Range("Cost_to_date","Last_update"), Target)
xOffsetColumn = 1
If Not WorkRng Is Nothing Then
    Application.EnableEvents = False
    For Each Rng In WorkRng
        If Not VBA.IsEmpty(Rng.Value) Then
            Rng.Offset(0, xOffsetColumn).Value = Now
            Rng.Offset(0, xOffsetColumn).NumberFormat = "mmm dd, yyyy"
        Else
            Rng.Offset(0, xOffsetColumn).ClearContents
        End If
    Next
    Application.EnableEvents = True
End If
End Sub

他们应该只更改名为(迄今为止的成本和上次更新)的两列右侧的列,并单独工作。

请让我知道我在这里遗漏了什么。

每件作品只能有一个 Worksheet_Change 事件sheet。简短的回答是您需要将这些组合到一个事件或将操作转换为宏并修改您的事件以动态调用操作宏。


考虑以下方法,其中包含一个 Worksheet_Change 事件和 3 个子例程。请注意,更改事件的唯一工作是确定需要采取什么操作,然后调用适当的子例程(其中一个 sheet 可以有许多不同的事件 )。您的事件将测试的标准是 Intersect - 当 TRUE 时,您只需将 Target 传递到子例程并在那里执行操作。

Private Sub Worksheet_Change(ByVal Target As Range)

Application.EnableEvents = False

    If Condition_1 Then
        Macro_1 (Target)
    ElseIf Condition_2 Then
        Macro_2 (Target)
    ElseIf Condition_3 Then
        Macro_3 (Target)
    End If
    
Application.EnableEvents = True

End Sub

Sub Macro_1(Target As Range)
    'When condition_1 is met
End Sub

Sub Macro_2(Target As Range)
    'When condition_2 is met
End Sub

Sub Macro_3(Target As Range)
    'When condition_3 is met
End Sub

你能试试下面的吗?这似乎对我有用,所以只是想检查一下您的情况。当我突出显示并一次性清除整个列时,这确实让我崩溃了。


我相信你需要单独检查每个范围的 Intersect 并在其中一个为 TRUE 时输入宏。从那里我循环遍历 Target 并进行相应的检查,例如

  1. 目标不为空
  2. 目标列正确

Private Sub Worksheet_Change(ByVal Target As Range)

Dim xCell As Range, x As Long, y As Long
x = Range("Last_Update").Column
y = Range("Cost_to_date").Column

If Not Intersect(Range("Last_Update"), Target) Is Nothing Or Not Intersect(Range("Cost_to_date"), Target) Is Nothing Then
    Application.EnableEvents = False
    On Error GoTo SafeExit
    
    For Each xCell In Target
        If xCell.Column = x Or xCell.Column = y Then
            If xCell <> "" Then
                xCell.Offset(, 1) = Now
            Else
                xCell.Offset(, 1).ClearContents
            End If
        End If
    Next xCell
    
    Application.EnableEvents = True
    Target.Offset(, 1).NumberFormat = "mmm dd, yyyy"
    
End If
Exit Sub

SafeExit:

Application.EnableEvents = True
MsgBox "Error Occured", vbCritical

End Sub