如何解决这个 "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
并进行相应的检查,例如
- 目标不为空
- 目标列正确
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
我试图添加两个相似的宏来做同样的事情(在两个不同的列中),但是当我让它 运行 它说:“检测到名称不明确 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
并进行相应的检查,例如
- 目标不为空
- 目标列正确
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