[英]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.