【问题标题】:Worksheet_Change - Targeting multiple cells simultaneouslyWorksheet_Change - 同时定位多个单元格
【发布时间】:2014-11-28 14:35:13
【问题描述】:

这里是 VBA 初学者。

我有一个项目,我为用户指定了输入单元格。当这些输入单元之一发生更改时,它需要运行几行代码,这些代码仅针对该一个单元。如果用户清除单元格的内容,我希望代码将空白单元格替换为值“0”。

下面的代码模拟了我想要实现的目标。它的写法和我的项目一样,但更简洁。

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 1 And Target.Row = 1 Then
    Range("B1").Value = "Changed 1"  'Just something specific to this cell. Not important
    If IsEmpty(Sheet1.Range("A1")) Then Sheet1.Range("A1").Value = 0
End If

If Target.Column = 1 And Target.Row = 2 Then
    Range("B2").Value = "Changed 2" 'Just something specific to this cell. Not important
    If IsEmpty(Sheet1.Range("A2")) Then Sheet1.Range("A2").Value = 0
End If

If Target.Column = 1 And Target.Row = 3 Then
    Range("B3").Value = "Changed 3" 'Just something specific to this cell. Not important
    If IsEmpty(Sheet1.Range("A3")) Then Sheet1.Range("A3").Value = 0
End If

End Sub

在单个单元格上执行更改时,上述所有操作都可以正常工作。如果用户选择所有个单元格并按下删除键,它只会运行第一个单元格的代码。我希望它对所有选定(已删除)的单元格运行。

关于如何跨多个单元格同时运行 Worksheet_Change 有什么建议吗?

谢谢

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    当您的更改事件在单个单元格上运行良好时,您可以进行一些调整以确保它在一次更改一系列单元格时也能正常运行,例如将三个单元格粘贴到 A1 中时A3

    您可能希望应用类似于此的方法:

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ws As Worksheet
    Dim cel As Range
    Dim myRow As Long
    
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    If Not Intersect(Target, Range("A1:A3")) Is Nothing Then ' watch all the cells in this range
        For Each cel In Target ' do the next steps for each cell that was changed
            myRow = cel.Row
            Range("B" & myRow).Value = "Changed " & Target.Row 'Just something specific to this cell. Not important
            Application.EnableEvents = False
            If IsEmpty(ws.Range("A" & myRow)) Then Sheet1.Range("A" & myRow).Value = 0
            Application.EnableEvents = True
        Next cel
    End If
    
    End Sub
    

    解释:

    If Not Intersect(Target, Range("A1:A3")) Is Nothing Then -- 仅作用于单元格 A1 到 A3 的更改

    For Each cel In Target - 对所有已更改的单元格执行相同的操作

    Range("B" & myRow).Value = "Changed " & Target.Row - 在当前行的 B 列输入一些值

    在宏的下一步中,我们可能会将一些数据输入到我们正在监控变化的单元格中,即 A1 到 A3。这些单元格中的更改将触发此宏。该宏将写入单元格。单元格中的更改将触发此宏 ....

    你知道这是怎么回事。为了避免死循环,我们关闭任何事件触发的宏,例如更改单元格时触发的宏。所以我们用这个语句关闭事件监控。

    Application.EnableEvents = False - 现在任何诸如“单元格已更改”之类的事件都将被忽略。

    我们现在可以在 A 列中写入一个值,这样就不会再次触发宏了。伟大的。我们对单元格 A1 到 A3 执行任何需要执行的操作,然后重新打开事件监控。

    Application.EnableEvents = True

    然后我们转到触发此宏的范围内的下一个单元格(如果有)。

    让我知道这是否有帮助,或者您是否需要更多详细信息。这些东西需要一点学习曲线。

    【讨论】:

    • 值得注意的是,您可以通过这种方式拥有多个范围,例如If Not Intersect(Target, Range("A1:A3"), Range("D7")) Is Nothing Then
    • Teylyn,在这种情况下,这种逐步遍历每个目标单元格并应用一组标准代码的方法不适用于我的项目(“Changed 1”等只是占位符代码)。尽管如此,Not Intersect(Target) is NothingEnableEvents = False 正是我所需要的。感谢您的帮助。
    • 嗨,Snotty,不太确定我是否了解什么对您有用或不适用,但很高兴看到您有解决问题的方法。 not intersect(target, range(something)) is nothing 是一个非常有用的概念,当您写入受监控的范围时,禁用事件是必须。两者都非常有用。
    【解决方案2】:
    Private Sub Worksheet_Change(ByVal Target As Range)
    
        If Not Application.Intersect(Target, Cells(1, 1)) Is Nothing Then
            Range("B1").Value = "Changed 1"  'Just something specific to this cell. Not important
            If IsEmpty(Sheet1.Range("A1")) Then Sheet1.Range("A1").Value = 0
        End If
    
        If Not Application.Intersect(Target, Cells(1, 2)) Is Nothing Then
            Range("B2").Value = "Changed 2" 'Just something specific to this cell. Not important
            If IsEmpty(Sheet1.Range("A2")) Then Sheet1.Range("A2").Value = 0
        End If
    
        If Not Application.Intersect(Target, Cells(1, 3)) Then
            Range("B3").Value = "Changed 3" 'Just something specific to this cell. Not important
            If IsEmpty(Sheet1.Range("A3")) Then Sheet1.Range("A3").Value = 0
        End If
    
    End Sub
    

    【讨论】:

    • 嗨,蒂姆,稍微调整一下(例如添加“EnableEvents=False”),这个解决方案对我来说效果最好。非常感谢。
    猜你喜欢
    • 2021-05-26
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多