首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Worksheet_Change -同时靶向多个细胞

Worksheet_Change -同时靶向多个细胞
EN

Stack Overflow用户
提问于 2014-11-28 05:37:40
回答 2查看 26.7K关注 0票数 6

这里是VBA初学者。

我有一个为用户指定输入单元格的项目。当这些输入单元格中的一个被更改时,它需要运行几行特定于该单元格的代码。如果用户清除单元格的内容,我希望代码用值"0“替换空白单元格。

下面的代码模拟了我试图实现的目标。它是用与我的项目相同的形式写的,但更简洁。

代码语言:javascript
复制
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,有什么建议吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-28 06:19:57

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2014-11-28 06:35:13

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

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

代码语言:javascript
复制
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

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

如果这有帮助,或者你需要更多的细节,请告诉我。这些东西需要一些学习曲线。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27182541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档