標題:
[發問]
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]
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target = [h2] Or Target = [i2] Then
If (Not IsNumeric(Target.Value)) Or IsEmpty(Target.Value) Then
MsgBox "Must be numeric value!"
Application.EnableEvents = False
Target.Value = "" 'this will trigger Target again
[j2].Value = "" 'clear the cell of yield
Application.EnableEvents = True
Exit Sub
End If
End If
End Sub
複製代碼
作者:
c_c_lai
時間:
2016-10-6 15:36
回復
1#
swatt
If Target = [h2] Or Target = [i2] Then
複製代碼
改為
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
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
Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim Rng As Range
Set Rng = Range("H2:I2")
If Not Intersect(Target, Rng) Is Nothing Then
'*******************************************************************
'Intersect 方法 傳回 Range 物件,此物件代表兩個或多個範圍重疊的矩形範圍
'*******************************************************************
'If Target = [h2] Or Target = [i2] Then
If (Not IsNumeric(Target.Value)) Or IsEmpty(Target.Value) Then
MsgBox "Must be numeric value!"
Application.EnableEvents = False
Target.Value = "" 'this will trigger Target again
[j2].Value = "" 'clear the cell of yield
Application.EnableEvents = True
'Exit Sub
End If
End If
End Sub
複製代碼
作者:
c_c_lai
時間:
2016-10-7 08:02
回復
7#
swatt
你也可以應用 GBKEE 版大的範例來延伸你的需求:
Set Rng = Range("H2:I2")
If Not Intersect(Target, Rng) Is Nothing Then
MsgBox "條件符合!"
Else
MsgBox "條件不成立!"
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/)