Worksheet_Change – 同时定位多个单元格

VBA初学者在这里。

我有我为用户指定input单元的项目。 当这些input单元中的一个被改变时,它需要运行几行特定于那个单元的代码。 如果用户清除单元格的内容,我希望代码将空值单元格replace为值“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 

上面的所有内容在单个单元格上执行更改时都正常工作。 如果用户select所有的单元格并按下删除键,它只运行第一个单元格的代码。 我希望它运行所有选定的(删除)单元格。

有关如何同时在多个单元格上运行Worksheet_Change的任何build议?

谢谢

 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 

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

在macros的下一步,我们可能会input一些数据到我们正在监视的变化的单元格,即A1到A3。 这些单元格的变化将触发这个macros。 这个macros将写入单元格。 单元格中的更改将触发此macros…

你看看这是怎么回事 为了避免无限循环,我们closures任何事件触发的macros,例如当单元格更改时触发的macros。 所以我们用这个语句来closures事件监视。

Application.EnableEvents = False – 现在像“单元格已被更改”的任何事件将被忽略。

我们现在可以在列A中写入一个值,并且不会再次触发macros。 大。 我们可以根据需要对单元格A1到A3执行任何操作,然后重新开启事件监视器。

Application.EnableEvents = True

然后我们去触发这个macros的范围内的下一个单元格(如果有的话)。

让我知道这是否有帮助,或者如果你需要更多的细节。 这些东西需要一点学习曲线。