2017-06-20 107 views
0

我試圖檢查使用VBA填充我的行和列不同的條件下的測試條件。擅長:如果用

這是我到目前爲止已經試過:

For i = 1 To Lastrow 
    For j = 1 To 11 
     If (IsEmpty(ws1.Range("C12"))) And (IsEmpty(ws1.Range("D12"))) = True Then 
      ws2.Cells(i, j) = ws1.Cells(i, j).Value 
     ElseIf (IsEmpty(ws1.Range("C12")) And (ws1.Cells(i, 8) <= ws1.Cells(12, 4))) = True Then 
      ws2.Cells(i, j) = ws1.Cells(i, j).Value 
     ElseIf (IsEmpty(ws1.Range("D12")) And (ws1.Cells(i, 8) <= ws1.Cells(12, 4))) = True Then 
      ws2.Cells(i, j) = ws1.Cells(i, j).Value 
     ElseIf (ws1.Cells(12, 3) >= ws1.Cells(i, 7) And ws1.Cells(12, 3) <= ws1.Cells(i, 8)) Or (ws1.Cells(12, 4) >= ws1.Cells(i, 7) And ws1.Cells(12, 4) <= ws1.Cells(i, 8)) Or ((ws1.Cells(12, 3) >= ws1.Cells(i, 7)) And (ws1.Cells(12, 4) <= ws1.Cells(i, 8))) Then 
      ws2.Cells(i, j) = ws1.Cells(i, j).Value 
     End If 
    Next j 
Next i 

正如你所看到的,我試了很多條件。

問題是與地方細胞C12 OR D12是空的語句。 如果D12爲空,代碼應該給我所有從C12開始的日期。

例如,我想,從15/05/2017開始的一切:

enter image description here

這就是我得到的結果是:

enter image description here

正如你所看到的,它不正確。 我對所有東西都進行了單獨測試,並且它可以正常工作,但是當我把所有東西都放到一起時,就會出現一些錯誤。

此外,我真的很懷疑,如果我的If/ElseIf語句測試所有條件才能或者如果我在一個適當的方式寫。 是否有另一種方法可以按照我想要的順序運行它?

+0

你並不需要在'If'塊'= TRUE'條件。你可以簡單地寫'If '。你的日期欄是否以日期格式?如果不是,那麼你的比較就會失敗。 – Taosique

+0

@Taosique但是對於'IsEmpty'仍然是必要的,不是嗎?是的,他們是......一切都是日期格式,我查了一下。 – paulinhax

+0

是的,如果你的業務邏輯需要它的話。 – Taosique

回答

2

沒有驗證您的IF但選擇聲明將是更清潔:

For i = 1 To lastrow 
    For j = 1 To 11 
     Select Case True 
      Case IsEmpty(ws1.Range("C12")) And IsEmpty(ws1.Range("D12")): 
       ws2.Cells(i, j) = ws1.Cells(i, j).Value 

      Case IsEmpty(ws1.Range("C12")) And ws1.Cells(i, 8) <= ws1.Cells(12, 4): 
       ws2.Cells(i, j) = ws1.Cells(i, j).Value 

      Case IsEmpty(ws1.Range("D12")) And ws1.Cells(i, 8) <= ws1.Cells(12, 4): 
       ws2.Cells(i, j) = ws1.Cells(i, j).Value 

      Case (ws1.Cells(12, 3) >= ws1.Cells(i, 7) And ws1.Cells(12, 3) <= ws1.Cells(i, 8)) Or _ 
       (ws1.Cells(12, 4) >= ws1.Cells(i, 7) And ws1.Cells(12, 4) <= ws1.Cells(i, 8)) Or _ 
       (ws1.Cells(12, 3) >= ws1.Cells(i, 7) And (ws1.Cells(12, 4) <= ws1.Cells(i, 8))): 
       ws2.Cells(i, j) = ws1.Cells(i, j).Value 

      Case Else: 
       ws2.Cells(i, j) = "No match" 
     End Select 
    Next j 
Next i 
+0

我做了一些修改,但它幫了我很多。我不知道如何使用'選擇Case'非常好,但現在它的工作。我只是改變這個'案例的IsEmpty(ws1.Range( 「C12」)),並且ws1.Cells(I,8)<= ws1.Cells(12,4): ws2.Cells(I,J)= ws1.Cells (I,J)爲.Value''案例的IsEmpty(ws1.Range( 「C12」)): 如果ws1.Cells(I,8)<= ws1.Cells(12,4)接着 ws2.Cells(ⅰ ,j)= ws1.Cells(i,j)。值 End If' – paulinhax

+0

Select語句比IF快得多。只記得使用默認的'Case Else',否則如果沒有匹配,你會得到一個錯誤。 –

+0

謝謝!下次我會注意的:) – paulinhax