Worksheet_Change - 同时定位多个单元格

时间:2014-11-28 05:37:41

标签: excel vba

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

在单个单元格上执行更改时,上述所有内容均可正常工作。如果用户选择 all 单元格并按下删除键,则只运行第一个单元格的代码。我想让它运行所有选定(已删除)的单元格。

有关如何跨多个单元格同时运行Worksheet_Change的任何建议吗?

由于

2 个答案:

答案 0 :(得分:4)

如果您在单个单元格上有一个可以正常工作的更改事件,则可以进行一些调整,以确保在一次更改一系列单元格时它也可以正常工作,例如将三个单元格粘贴到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

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

如果有帮助或者您需要更多细节,请告诉我。这些事情需要一些学习曲线。

答案 1 :(得分:0)

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