iT邦幫忙

DAY 6
3

Excel VBA 的眉眉角角系列 第 6

Excel VBA 的眉眉角角Day6:關於工作表程式觸發與暫停觸發

  • 分享至 

  • xImage
  •  

相信在學習了一陣子後,開始有人會拉拉按鈕寫程式了,而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

已這種方式將事件暫停後寫入資訊至工作表,即可中斷無線循環的問題發生。有著手撰寫觸發事件者,一定要記得這功能!


上一篇
Excel VBA 的眉眉角角Day5:關於function與函數,以相似度程式作為討論
下一篇
Excel VBA 的眉眉角角Day7如何用Columns(數字)選擇多列?
系列文
Excel VBA 的眉眉角角30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
paicheng0111
iT邦大師 5 級 ‧ 2018-04-13 08:15:56

感謝介紹Application.EnableEvents方法。

我自已以前都是先檢測TargetAddress屬性,才繼續下一步。
範例如下:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address <> Range("C1").Address then
        Range("C1") = "已變更"
    End If
End Sub
看更多先前的回應...收起先前的回應...
Andy Chiu iT邦研究生 2 級 ‧ 2018-04-13 21:11:15 檢舉

喔?這個方法也不錯,其實寫一行就可以了,只是還是會觸發到就是了:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = Range("C1").Address Then Exit Sub
    
    Range("C1") = "已變更"
    
End Sub

/images/emoticon/emoticon42.gif

你好~ 想請問一下重灌電腦後

ALT + F11寫的Worksheet_BeforeRightClick功能無法使用

(已經有啟用巨集且重灌前是確切可以使用的)

請問是重灌後少安裝了什麼嗎~? (可能VB還是Visual C++等)

Andy Chiu iT邦研究生 2 級 ‧ 2018-06-30 00:30:07 檢舉

您好,這我就不太確定什麼問題了,只有這個功能不能用?還是所有巨集都無法執行?

我要留言

立即登入留言