合并两个使用Private Sub Worksheet_Change(ByVal目标作为范围)的VBA术语

时间:2018-09-20 15:44:48

标签: excel-vba

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

3 个答案:

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

虽然其他答案似乎是正确的,但有些实例可能希望将两个例程区分开来,因为它增加了额外的灵活性并简化了调试。

您可以通过重命名现有的两个例程来实现此目的,然后创建第三个处理更改事件并调用两个单独的子例程的例程。

在此示例中,我们将重命名为sub1sub2,但是显然您可以更改为提供更好描述的名称。


将处理更改事件的例程。您只需调用Sub1Sub2,并传递与事件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()事件来调用这些例程。 如果您必须修改这两个子程序中的任何一个,则只需执行一次,而不必逐个进行更新。