iT邦幫忙

0

Worksheet_Change 觸發問題

z89787 2016-12-28 11:11:2115367 瀏覽
  • 分享至 

  • twitterImage

想請問Worksheet_Change觸發的特性是只能更改該儲存格嗎?
例如A1<100 就會觸發,但在儲存格中設定A1=A2,在儲存格A2=10時則無法觸發,請問如何改成在A2輸入10也會觸發呢?
附上簡易的程式碼,麻煩各位前輩解答。

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Application.EnableEvents = False '暫時停止事件觸發 
    If Target.Column = 1 And Target.Row = 1 Then
        ThisRow = Target.Row 
        If Target.Value < 100 Then
            Range("B1").ClearContents
            MsgBox ("hello")
        Else
        Range("B1") = "無"
        End If
    End If
Application.EnableEvents = True '啟用事件觸發
End Sub
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
海綿寶寶
iT邦大神 1 級 ‧ 2016-12-28 11:46:29
最佳解答

其實是有觸發的
是你自己寫的這列
某種程度上限制「只有A1改變才觸發」的現象

If Target.Column = 1 And Target.Row = 1 Then

改成以下這樣
看看合不合用

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    Application.EnableEvents = False '暫時停止事件觸發
'    If Target.Column = 1 And Target.Row = 1 Then
'        ThisRow = Target.Row
'        If Target.Value = 1 Then
        If Range("A1").Value = 1 Then
            Range("B1").ClearContents
            MsgBox ("hello")
        Else
            Range("B1") = "無"
        End If
'    End If
    Application.EnableEvents = True '啟用事件觸發
End Sub
看更多先前的回應...收起先前的回應...

補充說明
當你修改 A2 時,Worksheet_Change 傳進來的 Target 是A2
所以你的** Colume=1 和 Row=1 **是不符合條件的
以致你以下寫的程式都不會被執行


是不是改題目了
還好 Excel 還沒刪掉

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    Application.EnableEvents = False '暫時停止事件觸發
'    If Target.Column = 1 And Target.Row = 1 Then
'        ThisRow = Target.Row
'        If Target.Value = 1 Then
        If Range("A1").Value < 100 Then
            Range("B1").ClearContents
            MsgBox ("hello")
        Else
            Range("B1") = "無"
        End If
'    End If
    Application.EnableEvents = True '啟用事件觸發
End Sub
z89787 iT邦新手 5 級 ‧ 2016-12-28 14:03:21 檢舉

抱歉,怕誤會所以題目有做修改
故意要限制在A1的,不然這樣變成全域觸發,造成子程式會有些問題
需求舉例來說:初始儲存格設定為"A1"="A2",而儲存格A2=3,故儲存格A1=3,經過數據篩選後的結果會回傳給儲存格A2,A2=1,故A1也變為1,理論上A1從3變成1,應該要觸發的,但卻沒有回應

當你使用 Worksheet_Change 時
就已經是全域觸發了

另外常見的是 Worksheet_Caculate
如果 Worksheet_Change 是儲存格的「值」改變
那麼 Worksheet_Caculate 就是儲存格的「公式」有重新計算過

如果以上兩個都不符你的要求
那我也不會了
要靠別的高手出馬了
/images/emoticon/emoticon55.gif

z89787 iT邦新手 5 級 ‧ 2016-12-28 16:58:15 檢舉

海大,可以問一下上面的程式碼可以直接改成Caculate嗎? 因為Caculate能參考的範例我這邊比較少,大大能幫忙一下嗎?

當然可以,但對你的意義不大
Caculate 連 Target 這個參數都沒有
根本無從判斷是那一個儲存格有變動

Private Sub Worksheet_Caculate
    Application.EnableEvents = False '暫時停止事件觸發
'    If Target.Column = 1 And Target.Row = 1 Then
'        ThisRow = Target.Row
'        If Target.Value = 1 Then
        If Range("A1").Value = 1 Then
            Range("B1").ClearContents
            MsgBox ("hello")
        Else
            Range("B1") = "無"
        End If
'    End If
    Application.EnableEvents = True '啟用事件觸發
End Sub

是吧

z89787 iT邦新手 5 級 ‧ 2016-12-29 15:35:07 檢舉

海大,請問您有再EXCEL執行過這串程式碼嗎?
小弟寫進EXCEL後怎麼都不會執行.....

你要寫在跟 Private Sub Worksheet_Change(ByVal Target As Range)
同一個地方才會執行

Private Sub Worksheet_Caculate()
z89787 iT邦新手 5 級 ‧ 2017-01-12 16:07:40 檢舉

海大,我有新發一個問題,名稱是"VBA 定時篩選後,貼上另一個工作表",麻煩海大有空時幫小弟解答一下...

我要發表回答

立即登入回答