Board logo

標題: Worksheet_SelectionChange 及 Worksheet_Change [打印本頁]

作者: enoch    時間: 2017-5-29 10:37     標題: Worksheet_SelectionChange 及 Worksheet_Change

Worksheet_SelectionChange 及 Worksheet_Change

請問程式中同時使用 Worksheet_SelectionChange  及 Worksheet_Change 時
如何在更改儲存格內容時, 只觸發Worksheet_Change 事件
嘗試過在程式開始加上 Application.EnableEvents = False
結尾加上Application.EnableEvents = true
請指教
作者: lpk187    時間: 2017-5-30 00:11

本帖最後由 lpk187 於 2017-5-30 00:16 編輯

回復 1# enoch

當你同時使用Worksheet_Change和 Worksheet_SelectionChange時,
只要你變更某儲存格後,按下Enter鍵或Tab鍵,這時Worksheet_SelectionChange會比Worksheet_Change先觸發事件,
而你在Worksheet_Change 事件中加上 Application.EnableEvents = False 是無效的,它先啟動了Worksheet_SelectionChange事件
除非關閉掉 "按Enter鍵後,移動選取範圍":參照下圖,不要勾選這個項目
[attach]27243[/attach]
或者加上這2個事件
  1. Private Sub Worksheet_Activate()
  2. Application.MoveAfterReturn = False
  3. End Sub

  4. Private Sub Worksheet_Deactivate()
  5. Application.MoveAfterReturn = True
  6. End Sub
複製代碼
也就是說當你改變了儲存格內容後按下Enter鍵不要移動選取的儲存格而是用Worksheet_Change去移動它
作者: lpk187    時間: 2017-5-30 00:15

本帖最後由 lpk187 於 2017-5-30 00:18 編輯

回復 1# enoch

如下:
  1. Dim xl_Address '設一個公用變數,讀取位址用

  2. Private Sub Worksheet_Change(ByVal Target As Range)
  3.     Application.EnableEvents = False '這裡只是暫時開閉,暫時不會觸發下一行的移動(只是暫時的,它還是觸發,只你你一打開,它還是會觸發的)
  4.     Target.Offset(1).Select '執行這行時並不會啟動Worksheet_SelectionChange
  5.     xl_Address = Target.Address ' 自設條件斷點,以利 Worksheet_SelectionChange 判斷用
  6.     Application.EnableEvents = True '當這裡打開時,一樣會啟動 SelectionChange 不過呢,它移動的位置?是目前的儲存格位置,比如說在A1改變內容而移動的位置還是A1
  7. End Sub

  8. Private Sub Worksheet_SelectionChange(ByVal Target As Range) '所以在這裡的一開始就要加入判斷了
  9.     If xl_Address = Target.Address Then '當目標儲存格的位址和Worksheet_Change一樣時,跳出此事件
  10.         xl_Address = Null '設xl_Address為null,這樣當你儲存格位置改變時也不會因此而不再觸動 SelectionChange事件
  11.         Exit Sub '離開此事件
  12.     End If
  13. Cells(1, 1).Select '所以當儲存格內容改變時這裡是不會執行的(這裡只是假設的程式碼,也是你自己的程式碼部份,不要抄進去你的程式碼中)
  14. End Sub
複製代碼





歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)