Excel VBA:工作表\u更改-目标地址与使用Intersect

Excel VBA:工作表\u更改-目标地址与使用Intersect,excel,vba,Excel,Vba,我正在成功运行包含以下代码段的宏: Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$B$1" Or Target.Address = "$B$3" Then Call MainSub End If End Sub 此子模块的目的是在单元格B1或B3发生更改时,通过调用MainSub使宏spring生效。它起作用了 但是,在寻找解决方案时,我也遇到了以下代码: Pr

我正在成功运行包含以下代码段的宏:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$B$1" Or Target.Address = "$B$3" Then
        Call MainSub
    End If
End Sub
此子模块的目的是在单元格B1或B3发生更改时,通过调用MainSub使宏spring生效。它起作用了

但是,在寻找解决方案时,我也遇到了以下代码:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Target.Worksheet.Range("B1")) Is Nothing Then
        Call MainSub
    End If
End Sub
它只适用于B1

现在我有两个问题:

1如何在intersect方法中包含另一个单元格B3以进行检查?对我来说,使用或不起作用,所以我认为在第一个if语句之后再使用另一个if语句就可以了,但是有更优雅的解决方案吗

2使用intersect与只查看目标地址相比有什么好处?

您可以使用:

If Not Intersect(Target, Range("B1,B3")) Is Nothing Then
Intersect很有用,因为它会在多个单元格发生更改时作出反应。例如,如果用户将数据复制并粘贴到恰好重叠B1和/或B3的范围内,则Target.Address将不会是$B$1或$B$3,但Intersect仍然有效。

您可以使用:

If Not Intersect(Target, Range("B1,B3")) Is Nothing Then

Intersect很有用,因为它会在多个单元格发生更改时作出反应。例如,如果用户将数据复制并粘贴到恰好重叠B1和/或B3的范围内,则Target.Address将不会是$B$1或$B$3,但Intersect仍然有效。

顶部片段隐含地假设了目标的形状;底部的代码段没有做出这样的假设,并且会更可靠地工作。另外,调用是冗余的,只需MainSub就足以调用它。。。您需要将Application.EnableEvents设置为before=False和before=True,否则如果MainSub决定修改任何单元格,则事件处理程序将是重入隐式递归。。如果它修改了B1或B3单元格,一切都会化为乌有。@MathieuGuindon所以我在MainSub前后放置Application.EnableEvents=False?我使用call是因为它使代码更易于阅读。通过调用,我立即知道正在调用另一个子对象,对于初学者来说,这并不总是很清楚。Application.EnableEvents控制修改单元格时是否运行工作表更改。如果运行工作表更改将修改任何单元格,则希望将其设置为False,并且希望在事件处理程序退出时将其恢复为True,以便下一次修改B1/B3时处理程序将其拾取。否则Application.EnableEvents在第一次调用后将保持False,不会有第二次调用。特定单元格是否受到影响没有区别,事件是可重入的,您希望避免这种情况,而不是作为一个简单的条件语句来使用不受控制的隐式递归彻底破坏所有内容。。。特别是因为是否修改单元格取决于另一个过程/另一个模块中的代码。当然,现在不是问题。最上面的代码片段隐含着对目标形状的假设;底部的代码段没有做出这样的假设,并且会更可靠地工作。另外,调用是冗余的,只需MainSub就足以调用它。。。您需要将Application.EnableEvents设置为before=False和before=True,否则如果MainSub决定修改任何单元格,则事件处理程序将是重入隐式递归。。如果它修改了B1或B3单元格,一切都会化为乌有。@MathieuGuindon所以我在MainSub前后放置Application.EnableEvents=False?我使用call是因为它使代码更易于阅读。通过调用,我立即知道正在调用另一个子对象,对于初学者来说,这并不总是很清楚。Application.EnableEvents控制修改单元格时是否运行工作表更改。如果运行工作表更改将修改任何单元格,则希望将其设置为False,并且希望在事件处理程序退出时将其恢复为True,以便下一次修改B1/B3时处理程序将其拾取。否则Application.EnableEvents在第一次调用后将保持False,不会有第二次调用。特定单元格是否受到影响没有区别,事件是可重入的,您希望避免这种情况,而不是作为一个简单的条件语句来使用不受控制的隐式递归彻底破坏所有内容。。。特别是因为是否修改单元格取决于另一个过程/另一个模块中的代码。当然,现在不是问题。