Board logo

標題: [發問] 邏輯條件判斷請益 [打印本頁]

作者: li_hsien    時間: 2015-2-9 18:49     標題: 邏輯條件判斷請益

本帖最後由 li_hsien 於 2015-2-9 18:50 編輯

有個邏輯判斷問題請教各位大大

主要邏輯 -> 如果A2跟C欄比對,有比到的話則B2值=D2

判別條件細分:
1. 如果A2跟C欄vlookup比對的到
2. 如果比到的值(D2)不為空值
若上述條件成立則將D2值填入B2
  1.      
  2. If IsError(Application.VLookup(Range("A2") , Range("C:D") , 2 , 0)) = False And Application.VLookup(Range("A2") , Range("C:D") , 2 , 0) <> "" Then
  3.         
  4.         Range("B2") = Application.VLookup(Range("A2") , Range("C:D") , 2 , 0)
  5.      
  6. End If
複製代碼
現在令小弟疑惑的點是

為什麼我A2的值確實不存在於C欄中

但B2還是會被填入值(顯示#NA)
  1. IsError(Application.VLookup(Range("A2") , Range("C:D") , 2 , 0))
複製代碼
上方這段 如果A2不存在於C欄中不是應該等於True嗎???
所以我條件是等於False應該不會往下執行吧???


不知小弟是哪邊誤解  煩請各位解惑

謝謝!!!
作者: stillfish00    時間: 2015-2-10 14:07

回復 1# li_hsien
附檔看看吧, 我直接run你這寫法會有執行階段錯誤。

該不會你前面下了 On Error Resume Next 指令吧...
作者: li_hsien    時間: 2015-2-11 08:30

回復 2# stillfish00

感謝stillfish提點!!!

真的是On Error Resume Next的影響

後來我發現下段這行
  1. Application.VLookup(Range("A1"), Range("C:D"), 2, 0) <> ""
複製代碼
因為比對不到所以出錯了

但我下了On Error Resume Next所以就往下執行了

導致值給了#NA


後來修正作法變成是將兩個條件分開
  1. If IsError(Application.VLookup(Range("A1"), Range("C:D"), 2, 0)) = False Then

  2.     If Application.VLookup(Range("A1"), Range("C:D"), 2, 0) <> "" Then   
  3.        Range("B1") = Application.VLookup(Range("A2"), Range("C:D"), 2, 0)
  4.     End If
  5.         
  6. End If
複製代碼
但好像不是很聰明的作法@@
作者: stillfish00    時間: 2015-2-11 11:10

本帖最後由 stillfish00 於 2015-2-11 11:16 編輯

回復 3# li_hsien
沒錯啊,這種條件就是要分開寫
然後你可以把 vlookup 查表的值提出來,不然你這樣要查3次
  1. Sub Test33()
  2.   Dim value As Variant  
  3.   value = Application.VLookup(Range("A2"), Range("C:D"), 2, 0)
  4.   If IsError(value) Then
  5.     MsgBox Range("A2") & " is not found": Exit Sub
  6.   ElseIf value <> "" Then
  7.     Range("B2").value = value
  8.   End If
  9. End Sub
複製代碼
重點是: 濫用 On Error Resume Next 是大忌
作者: li_hsien    時間: 2015-2-11 17:38

回復 4# stillfish00

謝謝stillfish00協助

其實設定On Error Resume Next

主要是因為常常會給使用者使用

盡可能不要讓錯誤訊息跳出來

但要以Msg顯示好像沒有比較適當的字眼

所以就加上去了

但缺點就是程式碼若有誤 常會一時抓不出來@@
作者: stillfish00    時間: 2015-2-12 16:43

回復 5# li_hsien
對我來說這樣就是濫用了,因為你是為了避免不知道何時何處會出現的錯誤訊息,而只在一開始的地方加 On Error Resume Next ,這樣是不對的。
On Error Resume Next 應該用在你知道會發生執行階段錯誤的地方(該行程式碼),而且你知道錯誤的原因並且你判斷可以忽略這錯誤,然後在該行前面加 On Error Resume Next,該行後面加 On Error Goto 0,這樣才是正確的用法。




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