24

是否有一种简单的方法可以让 Excel 在更改单元格时自动执行宏?

有问题的单元格将在Worksheet("BigBoard").Range("D2")

我认为简单的谷歌查询被证明更复杂 - 每个样本都涉及相交(无论是什么)或颜色格式或任何其他看似无关的事物。

4

5 回答 5

41

是的,这可以通过使用工作表事件来实现:

在 Visual Basic 编辑器中,双击左上角树中的工作表名称,打开您感兴趣的工作表(即“BigBoard”)。将以下代码放入模块中:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Me.Range("D2")) Is Nothing Then Exit Sub
        Application.EnableEvents = False 'to prevent endless loop
        On Error Goto Finalize 'to re-enable the events      
        MsgBox "You changed THE CELL!"
    End If
Finalize:        
    Application.EnableEvents = True
End Sub
于 2013-03-11T11:10:02.830 回答
19

另一种选择是

Private Sub Worksheet_Change(ByVal Target As Range)
    IF Target.Address = "$D$2" Then
        MsgBox("Cell D2 Has Changed.")
    End If
End Sub

我相信这比 使用的资源更少Intersect,如果您的工作表发生很大变化,这将很有帮助。

于 2013-03-11T13:12:59.683 回答
3

为了找到一种方法,使 intersect 方法的目标单元格成为名称表数组,我偶然发现了一种简单的方法,可以在特定工作表上的任何单元格或一组单元格发生更改时运行某些东西。此代码也放置在工作表模块中:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 0 Then
'mycode here
end if
end sub
于 2015-07-24T17:15:51.627 回答
1

为了发现特定列中某处的更改(此处为“W”,即“23”),我将 Peter Alberts 的回答修改为:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Target.Column = 23 Then Exit Sub
    Application.EnableEvents = False             'to prevent endless loop
    On Error GoTo Finalize                       'to re-enable the events
    MsgBox "You changed a cell in column W, row " & Target.Row
    MsgBox "You changed it to: " & Target.Value
Finalize:
    Application.EnableEvents = True
End Sub
于 2018-04-10T09:01:43.580 回答
1

我正在创建一个表单,其中用户输入另一个宏使用的电子邮件地址,以通过电子邮件将特定单元组发送到输入的地址。我将这个来自多个站点的简单代码和我对 VBA 的有限知识拼凑在一起。这只是监视一个单元格(在我的情况下为 K22)更新,然后终止该单元格中的任何超链接。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range

    ' The variable KeyCells contains the cells that will
    ' cause an alert when they are changed.
    Set KeyCells = Range("K22")

    If Not Application.Intersect(KeyCells, Range(Target.Address)) _
           Is Nothing Then

        Range("K22").Select
        Selection.Hyperlinks.Delete

    End If 
End Sub
于 2019-03-28T14:18:06.447 回答