首页 文章

在单元格更改上自动执行Excel宏

提问于
浏览
84

每当特定单元格中的值发生更改时,如何自动执行Excel宏?

现在,我的工作代码是:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("H5")) Is Nothing Then Macro
End Sub

其中 "H5" 是被监视的特定单元格, Macro 是宏的名称 .

有没有更好的办法?

5 回答

  • 3

    你的代码看起来很不错 .

    但是,请注意,对 Range("H5") 的调用是 Application.Range("H5") 的快捷命令,相当于 Application.ActiveSheet.Range("H5") . 如果唯一的更改是用户更改(这是最典型的),这可能没问题,但是当工作表的单元格值不是通过程序更改的活动工作表时,可能会更改,例如, VBA .

    考虑到这一点,我会利用 Target.Worksheet.Range("H5")

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Intersect(Target, Target.Worksheet.Range("H5")) Is Nothing Then Macro
    End Sub
    

    或者你可以使用 Me.Range("H5") ,如果事件处理程序在相关工作表的代码页上(通常是):

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Intersect(Target, Me.Range("H5")) Is Nothing Then Macro
    End Sub
    

    希望这可以帮助...

  • 104

    处理 Worksheet_Change 事件或 Workbook_SheetChange 事件 .

    事件处理程序采用“目标作为范围”参数,因此您可以检查正在更改的范围是否包括您感兴趣的单元格 .

  • 7

    我更喜欢这种方式,不是使用单元格而是使用范围

    Dim cell_to_test As Range, cells_changed As Range
    
        Set cells_changed = Target(1, 1)
        Set cell_to_test = Range( RANGE_OF_CELLS_TO_DETECT )
    
        If Not Intersect(cells_changed, cell_to_test) Is Nothing Then 
           Macro
        End If
    
  • 0

    在把事件触发器搞得搞糟之后,我花了很多时间研究这个并学习它是如何工作的 . 由于有太多分散的信息,我决定在一个地方分享我发现的工作,一步一步如下:

    1)打开VBA编辑器,在VBA项目(YourWorkBookName.xlsm)下打开Microsoft Excel对象,然后选择更改事件将涉及的工作表 .

    2)默认代码视图为“常规” . 从顶部中间的下拉列表中,选择“工作表” .

    3)Private Sub Worksheet_SelectionChange已经存在,应该是它,不管它 . 从上面复制/粘贴Mike Rosenblum的代码并将.Range引用更改为您正在观察更改的单元格(在我的情况下为B3) . 但是,请不要放置宏(我在“然后”之后删除了“宏”一词):

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
    End Sub
    

    或者从左上角的下拉列表中选择"Change",在Private Sub和End Sub之间的空格中,粘贴 If Not Intersect(Target, Me.Range("H5")) Is Nothing Then

    4)在“然后”之后的行上关闭事件,这样当你调用宏时,它不会触发事件并尝试在永不停止的循环中再次运行此Worksheet_Change,这会导致Excel崩溃和/或以其他方式混乱:

    Application.EnableEvents = False
    

    5)调用你的宏

    Call YourMacroName
    

    6)重新启用事件,以便下一次更改(以及任何/所有其他事件)触发:

    Application.EnableEvents = True
    

    7)结束If块和Sub:

    End If
    End Sub
    

    整个代码:

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Intersect(Target, Me.Range("B3")) Is Nothing Then
            Application.EnableEvents = False
            Call UpdateAndViewOnly
            Application.EnableEvents = True
        End If
    End Sub
    

    这会将模块中的事件打开/关闭从而产生问题,只需让更改触发,关闭事件,运行宏并重新打开事件 .

  • 2

    我有一个链接到在线库存数据库并经常更新的单元格 . 我想在更新单元格值时触发宏 .

    我相信这类似于程序或任何外部数据更新的单元格值更改,但上面的示例以某种方式对我不起作用 . 我认为问题是因为没有触发excel内部事件,但这是我的猜测 .

    我做了以下,

    Private Sub Worksheet_Change(ByVal Target As Range) 
      If Not Intersect(Target, Target.Worksheets("Symbols").Range("$C$3")) Is Nothing Then
       'Run Macro
    End Sub
    

相关问题