Board logo

標題: [發問] Workbook_SheetChange 疑問 [打印本頁]

作者: swatt    時間: 2016-10-6 15:01     標題: Workbook_SheetChange 疑問

各位大大,
一個簡單的 IF 判斷式問題,卻不知問題出在哪裡?
程式第一個 IF先判斷是不是[h2] or [i2] 有變動,有的話再進入第2個 IF判斷是否為數值 or 空白,
正常情況下跑起來是沒問題,但有一個特別狀況:

在非[h2] or [i2] 的cell 按下delete鍵,EX: [b6]按下delete鍵(清空資料),
竟然會跑到第2個IF判斷式,而出現 MsgBox "Must be numeric value!"

有大大可以解答一下嗎?

[attach]25460[/attach]
  1. Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

  2. If Target = [h2] Or Target = [i2] Then
  3.   

  4.     If (Not IsNumeric(Target.Value)) Or IsEmpty(Target.Value) Then
  5.    
  6.         MsgBox "Must be numeric value!"
  7.         Application.EnableEvents = False
  8.         Target.Value = ""  'this will trigger Target again
  9.         [j2].Value = ""    'clear the cell of yield
  10.         Application.EnableEvents = True
  11.         Exit Sub
  12.    
  13.     End If
  14. End If

  15. End Sub
複製代碼

作者: c_c_lai    時間: 2016-10-6 15:36

回復 1# swatt
  1. If Target = [h2] Or Target = [i2] Then
複製代碼
改為
  1. If Target.Address = "$H$2" Or Target.Address = "$I$2" Then
複製代碼
即可。
作者: swatt    時間: 2016-10-6 16:02

回復 2# c_c_lai


感謝 c_c_lai  大大,改完之後確實不會再發生,
請問為這麼第一種寫法會出錯?
以後如果要參照cell,是否都要用address ,不要用range?
作者: c_c_lai    時間: 2016-10-6 16:33

本帖最後由 c_c_lai 於 2016-10-6 16:43 編輯

回復 3# swatt
Target.Address = "$H$2" 是明確的指出 [H2] 的位址。
亦即如果有任何欄為值有異動, 即行觸發 Workbook_Change(),
接著判斷該觸動欄位是否為   [H2] 或 [I2] 欄位值的異動。
條件符合,即行按照符合條件繼續執行;否則跳離。
作者: swatt    時間: 2016-10-6 17:16

回復 4# c_c_lai

謝謝大大,我是了解address可得到明確的位址,
那   If Target = [h2] 會失靈,可能是何原因??
作者: c_c_lai    時間: 2016-10-6 17:52

回復 5# swatt
  1. If Target = [h2] Or Target = [i2] Then
複製代碼
只要內容等於 [h2] 值 或者是 [i2] 值的欄位異動均屬之。
譬如: [h2]  為 ""; c6 = "ABC", 當  c6 按 DEL 清除時,則  c6  值會等於 [h2] 值,
所以條件成立。以此類推,假設 [h2]  = "ABC", 當任何欄位值等於  "ABC",
則條件成立。
作者: swatt    時間: 2016-10-6 18:33

回復 6# c_c_lai


終於了解哪裡錯了,   用address 來比對位址才是上策,再次謝謝c_c_lai大大詳細的解說.
作者: GBKEE    時間: 2016-10-7 06:22

回復 7# swatt
  1. Option Explicit
  2. Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  3. Dim Rng As Range
  4.     Set Rng = Range("H2:I2")
  5.     If Not Intersect(Target, Rng) Is Nothing Then
  6.     '*******************************************************************
  7.     'Intersect 方法   傳回 Range 物件,此物件代表兩個或多個範圍重疊的矩形範圍
  8.     '*******************************************************************
  9.     'If Target = [h2] Or Target = [i2] Then
  10.         If (Not IsNumeric(Target.Value)) Or IsEmpty(Target.Value) Then
  11.             MsgBox "Must be numeric value!"
  12.             Application.EnableEvents = False
  13.             Target.Value = ""  'this will trigger Target again
  14.             [j2].Value = ""    'clear the cell of yield
  15.             Application.EnableEvents = True
  16.         'Exit Sub
  17.         End If
  18.     End If
  19. End Sub
複製代碼

作者: c_c_lai    時間: 2016-10-7 08:02

回復 7# swatt
你也可以應用 GBKEE 版大的範例來延伸你的需求:
  1.     Set Rng = Range("H2:I2")
  2.     If Not Intersect(Target, Rng) Is Nothing Then
  3.         MsgBox "條件符合!"
  4.     Else
  5.         MsgBox "條件不成立!"
  6.     End If
複製代碼

作者: swatt    時間: 2016-10-8 02:41

回復 8# GBKEE

感謝GBKEE大大提供另一個想法,利用range的交集來判斷,又學到一課啦~
作者: swatt    時間: 2016-10-8 02:44

回復 9# c_c_lai


一個問題真有不同解法,我自己對VBA又多一點了解了,再次感謝兩位大大囉~~




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