簡體   English   中英

在單元格更改時自動執行 Excel 宏

[英]automatically execute an Excel macro on a cell change

每次特定單元格中的值發生變化時,如何自動執行 Excel 宏?

現在,我的工作代碼是:

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

其中"H5"是被監控的特定單元, Macro是宏的名稱。

有沒有更好的辦法?

你的代碼看起來很不錯。

但是請注意,調用Range("H5")<\/code>是Application.Range("H5")<\/code>的快捷命令,它等效於Application.ActiveSheet.Range("H5")<\/code> 。 這可能很好,如果唯一的更改是用戶更改 - 這是最典型的 - 但是當工作表的單元格值不是活動工作表時,它可能會通過編程更改(例如 VBA)進行更改。

考慮到這一點,我將使用Target.Worksheet.Range("H5")<\/code> :

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

處理Worksheet_Change事件或Workbook_SheetChange事件。

事件處理程序采用參數“Target As Range”,因此您可以檢查正在更改的范圍是否包括您感興趣的單元格。

在真正搞砸了事件觸發器之后,我花了很多時間研究這個並了解它是如何工作的。 由於有這么多分散的信息,我決定將我發現的所有內容分享在一個地方,一步一步如下:

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

或從左上角的下拉列表中選擇“更改”,然后在 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

這會將事件從模塊中打開/關閉,這會產生問題,並且只是讓更改觸發、關閉事件、運行宏並重新打開事件。

我更喜歡這種方式,不使用單元格,而是使用范圍

    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

我有一個鏈接到在線股票數據庫並經常更新的單元格。 我想在單元格值更新時觸發一個宏。

我相信這類似於程序或任何外部數據更新的單元格值更改,但以上示例對我不起作用。 我認為問題在於沒有觸發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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM