2017-06-20 5 views
0

Ich versuche, verschiedene Bedingungen mit VBA zum Füllen meiner Spalten und Zeilen zu überprüfen.Excel: Testbedingungen mit if

Das ist, was ich bisher versucht habe:

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 

Wie Sie sehen können, habe ich eine Menge von Bedingungen testen.

Das Problem ist mit den Anweisungen, wo Zellen C12 oder D12 leer sind. Wenn D12 leer ist, sollte der Code mir alle Daten geben, die ab dem Datum C12 angegeben wurden.

Zum Beispiel möchte ich alles, was von 15/05/2017 beginnt:

enter image description here

Und das ist das Ergebnis, das ich bekam:

enter image description here

Wie Sie sehen können, ist es nicht richtig. Ich habe alles einzeln getestet und es funktioniert, aber wenn ich alles zusammen bekomme, bekommt es ein paar Fehler.

Außerdem bin ich wirklich im Zweifel, wenn meine If/ElseIf Aussagen alle Bedingungen in der Reihenfolge prüfen oder wenn ich in einer korrekten Weise schrieb. Gibt es eine andere Möglichkeit, es in der von mir gewünschten Reihenfolge auszuführen?

+0

Sie brauchen nicht '= true' Zustand in' If' Blöcke. Sie können einfach 'If ' schreiben. Und sind Ihre Datumsspalten tatsächlich im Datumsformat? Wenn nicht, wird Ihr Vergleich fehlschlagen. – Taosique

+0

@Taosique aber für 'IsEmpty' immernoch notwendig, oder? Ja, sie sind ... Alles ist im Datumsformat, ich habe überprüft. – paulinhax

+0

Ja, wenn Ihre Geschäftslogik es so braucht. – Taosique

Antwort

2

Haben Sie Ihre IFs nicht validiert, sondern eine Select Aussage würde viel sauberer sein:

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

Ich habe ein paar Änderungen vorgenommen, aber es hat mir sehr geholfen ... Ich wusste nicht, wie man 'Select Case' verwendet, aber jetzt funktioniert es. Ich habe gerade geändert 'Case IsEmpty (ws1.Range (" C12 ")) Und ws1.Cells (i, 8) <= ws1.Cells (12, 4): ws2.Cells (i, j) = ws1.Cells (i, j) .Wert 'für' Case IsEmpty (ws1.Range ("C12")): Wenn ws1.Cells (i, 8) <= ws1.Cells (12, 4) Dann ws2.Cells (i , j) = ws1.Cells (i, j) .Wert Ende If' – paulinhax

+0

Die Select-Anweisung ist viel schneller als IF. Denken Sie daran, eine Standard-Case-Else zu verwenden. Wenn keine Übereinstimmung gefunden wird, erhalten Sie einen Fehler. –

+0

danke! Ich werde das nächste Mal darauf achten :) – paulinhax