2016-05-18 15 views
-1

Ich versuche, eine bedingte Schleife Makro in Excel zu erstellen. Spalte B enthält einen Nachnamen, Spalte C enthält einen Vornamen und Spalte D enthält einen Vor- und Nachnamen. Ich versuche, das Makro zu bekommen, um festzustellen, wenn Spalte D = Spalte C + Spalte B.VBA-Code für bedingte Schleife

Wenn D = C + B, dann klare Inhalte von D.

also folgenden Arbeiten für eine einzelne Zeile:

Sub ClearContentsD() 

If Range("D1").Value = Range("C1").Value + Space(1) + Range("B1") Then Range("D1").ClearContents 

End Sub 

es funktioniert nicht ohne den zusätzlichen Raum (1), und ich kann es nicht durch das ganze Arbeitsblatt Schleife erhalten:

Sub ClearContentsLoop() 

Application.ScreenUpdating = False 

    Dim i As Long 
    For i = 1 To Rows.Count 

    Next i 

Do While Cells(i, 4).Value = Cells(i, 3).Value + Space(1) + Cells(i, 2).Value 
Cells(i, 4).ClearContents 

Loop 

Application.ScreenUpdating = True 

End Sub 

VBA mag Während mein Do nicht. Jede Hilfe würde sehr geschätzt werden.

CJ

+0

Können Sie ein Beispiel dafür angeben, mit was der Code arbeitet? – Histerical

+0

* VBA mag nicht meine Do While * ist keine Problembeschreibung, es sei denn, Sie sagen uns specificicall was * VBA * nicht gefällt **. Was bedeutet das konkret? –

+0

Auch wenn Sie möchten, dass "John Smith" gleich "John" + "Smith" ist, benötigen Sie ein Leerzeichen, es sei denn, der Zellenwert enthält ein Leerzeichen nach "John". – Histerical

Antwort

1

Einige Fragen:

  • Sie müssen Strings mit & verketten. Das Plus (+) ist für die Addition;
  • Ihre For Schleife macht nichts: ihr Körper ist leer;
  • Ihre Do While Schleife wird maximal einmal durchlaufen, weil i nicht inkrementiert wird;
  • Es ist ein Geheimnis, warum Sie zwei Schleifen (For und Do While) möchten;
  • Ein Blatt hat viele Zeilen, von denen Sie nur einen Bruchteil verwenden, also nicht alle durchgehen (For) und UsedRange verwenden.

Mögliche Korrektur:

Sub ClearContentsLoop() 
    Dim i As Long 

    Application.ScreenUpdating = False 
    For i = 1 To ActiveSheet.UsedRange.Rows.Count 
     If Cells(i, 4).Value = Cells(i, 3).Value & " " & Cells(i, 2).Value Then 
      Cells(i, 4).ClearContents 
     End If 
    Next i 
    Application.ScreenUpdating = True 
End Sub 
+0

Das funktioniert, danke. Ich habe versucht, eine If/Then-Funktion zuerst ohne Erfolg, aber meine es würde nicht mit meiner leeren Schleife und (+) funktionieren. – user6353333

0

Es gibt einen Weg, um den Raum in den Werten ignorieren Sie auswerten. Versuchen Sie folgendes:

Application.ScreenUpdating = False 

    Dim i As Long 
    For i = 1 To Rows.Count 
     If InStr(1, Cells(i, 4).Value, Cells(i, 2).Value, vbTextCompare) > 0 And InStr(1, Cells(i, 4).Value, Cells(i, 3).Value, vbTextCompare) > 0 Then Cells(i, 4).ClearContents 
    Next i 

Application.ScreenUpdating = True 

Erläuterung:

Durch die Verwendung der InStr Funktion, die Sie testen für das Vorhandensein einer Textzeichenfolge innerhalb eines anderen, und wenn zumindest eine Übereinstimmung gefunden wird, dann Die Funktion gibt einen Wert ungleich Null zurück (die Position, an der die Übereinstimmung gefunden wurde). Im obigen Beispiel testen Sie gleichzeitig das Vorhandensein des Vornamens und des Nachnamens. Wenn beide gefunden werden, löscht der Code den Inhalt der Zelle.

Und wie im Abschnitt Kommentare ausgeführt wurde, müssen Sie dies innerhalb der Schleife tun, damit alle Zellen in der Länge des Arbeitsblatts wie angegeben ausgewertet und aktualisiert werden.

Achten Sie darauf, dies auf einer Kopie Ihrer Originaldaten zu testen, damit Sie nicht die ursprünglichen Werte verlieren, falls Sie Ihre Änderungen rückgängig machen möchten! ;)

Verwandte Themen