我有这个VBA代码
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Not Intersect(Target, Range("rngBarcodeInput")) Is Nothing Then
If Application.CutCopyMode = xlCopy Then
Application.Undo
Target.PasteSpecial Paste:=xlPasteValues
End If
Range("DJ5").Copy
Range("rngBarcodeInput").PasteSpecial Paste:=xlPasteFormats
Range("rngShipCheckInputFieldsNoBarcode").ClearContents
Range("rngEditStatus").ClearContents
End If
Application.EnableEvents = True
End Sub
我想将此代码添加到VBA中,但仅在删除上面的代码后才能使用,因为它们都使用Worksheet_Change。所有组合成一个“私人子”的组合均无效。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("C7")
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then
Range("C15").Value = Range("B15").Value
End Sub
答案 0 :(得分:1)
我认为这是可行的,前提是您不希望C15值的更改导致其他事件触发。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Application.EnableEvents = False
If Not Intersect(Target, Range("rngBarcodeInput")) Is Nothing Then
If Application.CutCopyMode = xlCopy Then
Application.Undo
Target.PasteSpecial Paste:=xlPasteValues
End If
Range("DJ5").Copy
Range("rngBarcodeInput").PasteSpecial Paste:=xlPasteFormats
Range("rngShipCheckInputFieldsNoBarcode").ClearContents
Range("rngEditStatus").ClearContents
End If
Set KeyCells = Range("C7")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
Range("C15").Value = Range("B15").Value
End If
Application.EnableEvents = True
End Sub
答案 1 :(得分:0)
我认为这应该可行:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Not Intersect(Target, Range("rngBarcodeInput")) Is Nothing Then
If Application.CutCopyMode = xlCopy Then
Application.Undo
Target.PasteSpecial Paste:=xlPasteValues
End If
Range("DJ5").Copy
Range("rngBarcodeInput").PasteSpecial Paste:=xlPasteFormats
Range("rngShipCheckInputFieldsNoBarcode").ClearContents
Range("rngEditStatus").ClearContents
End If
' no need for extra variable, just check address directly
'Dim KeyCells As Range
'Set KeyCells = Range("C7")
If Target.Address = "$C$17" Then Range("C15").Value = Range("B15").Value
Application.EnableEvents = True
End Sub
只需将两种方法的代码放在一起。
答案 2 :(得分:0)
虽然其他答案似乎是正确的,但有些实例可能希望将两个例程区分开来,因为它增加了额外的灵活性并简化了调试。
您可以通过重命名现有的两个例程来实现此目的,然后创建第三个处理更改事件并调用两个单独的子例程的例程。
在此示例中,我们将重命名为sub1
和sub2
,但是显然您可以更改为提供更好描述的名称。
将处理更改事件的例程。您只需调用Sub1
和Sub2
,并传递与事件Target
相同的参数。
Private Sub Worksheet_Change(ByVal Target As Range)
sub1 Target
sub2 Target
End Sub
您的原始例程,重命名为:
Private Sub sub1(ByVal Target As Range)
Application.EnableEvents = False
If Not Intersect(Target, Range("rngBarcodeInput")) Is Nothing Then
If Application.CutCopyMode = xlCopy Then
Application.Undo
Target.PasteSpecial Paste:=xlPasteValues
End If
Range("DJ5").Copy
Range("rngBarcodeInput").PasteSpecial Paste:=xlPasteFormats
Range("rngShipCheckInputFieldsNoBarcode").ClearContents
Range("rngEditStatus").ClearContents
End If
Application.EnableEvents = True
End Sub
Private Sub sub2(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("C7")
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then
Range("C15").Value = Range("B15").Value
End Sub
这样做的主要好处是,如果您有多个工作表要用于代码,则可以将两个例程复制到一个标准模块中。然后,每个工作表将具有Worksheet_Change()
事件来调用这些例程。
如果您必须修改这两个子程序中的任何一个,则只需执行一次,而不必逐个进行更新。