相信在學習了一陣子後,開始有人會拉拉按鈕寫程式了,而Excel VBA裡有個特別的地方是,在Excel工作表物件內,也可以撰寫以程式,不同的工作表,可以撰寫不同的程式,相互區隔開,若取名相同,但放在不同工作表物件內,也不會發生問題,按鈕指定巨集時,只需要確認好工作表名稱,別指定錯誤即可。
而Excel工作表物件內撰寫程式,可用內建的觸發功能,讓程式更自動化些,例如我們在Day6工作表物件內,建立了以下程式:
Private Sub Worksheet_Change(ByVal Target As Range)
Range("C1") = "已變更"
End Sub
Sub Clean_Click()
Range("C1") = "清除"
Range("B2:B5").ClearContents
End Sub
工作表畫面如下:
B欄為主要輸入資料位置,C1儲存格為狀態,「清除」按鈕用來清除B2~B5資料,並回填狀態,一切看起來都很美好,但當實際運行時,就會出現「當機」的現象,為什麼呢?因為觸發Worksheet_Change事件時,只要再修改任何工作表的資料,就會再觸發Worksheet_Change事件,而Worksheet_Change內寫了「Range("C1") = "已變更"」,也就是對工作表內進行寫入,也因此Excel就當掉了,這該如何預防?當要用到觸發時,請記著,若還有寫入資料到工作表,一定得使用Application.EnableEvents方式將觸發功能關閉,否則會無限循環,程式修正後如下:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False '暫時停止事件觸發
Range("C1") = "已變更" '進行修改
Application.EnableEvents = True '啟用事件觸發
End Sub
Sub Clean_Click()
Application.EnableEvents = False '暫時停止事件觸發
Range("C1") = "清除" '寫入狀態
Range("B2:B5").ClearContents '清除資料
Application.EnableEvents = True '啟用事件觸發
End Sub
已這種方式將事件暫停後寫入資訊至工作表,即可中斷無線循環的問題發生。有著手撰寫觸發事件者,一定要記得這功能!
感謝介紹Application.EnableEvents
方法。
我自已以前都是先檢測Target
的Address
屬性,才繼續下一步。
範例如下:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> Range("C1").Address then
Range("C1") = "已變更"
End If
End Sub
喔?這個方法也不錯,其實寫一行就可以了,只是還是會觸發到就是了:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("C1").Address Then Exit Sub
Range("C1") = "已變更"
End Sub
你好~ 想請問一下重灌電腦後
ALT + F11寫的Worksheet_BeforeRightClick功能無法使用
(已經有啟用巨集且重灌前是確切可以使用的)
請問是重灌後少安裝了什麼嗎~? (可能VB還是Visual C++等)
您好,這我就不太確定什麼問題了,只有這個功能不能用?還是所有巨集都無法執行?