2016-11-24 6 views
-1

Ich bin sehr neu in VBA. Ich versuche, bestimmte Kundentransaktionen auf einer Tabellenkalkulation zu isolieren.VBA Entfernen von Zeilen aus einer Kalkulationstabelle, wenn Zellen eine bestimmte Zeichenfolge enthalten

Spalte "A" enthält die Zahlungsmethode des Kunden (Prepaid oder verschiedene andere Methoden). Spalte "D" enthält den Kunden, den wir auch versenden, Spalte "L" enthält den Kunden, aus dem wir versenden.

Wenn die Zelle in Spalte "A" "Prepaid" hat, möchte ich Spalte "D" für den Kundennamen (Jaba) suchen. Ich werde dann alle Zeilen löschen, die diesen Kunden nicht enthalten. Wenn die Zelle in Spalte "A" nicht "vorausbezahlt" ist, möchte ich, dass sie die Spalte "L" nach dem Kundennamen durchsucht und alle Zeilen löscht, die diese Zeichenfolge nicht enthalten. Wenn ich den unten angegebenen Code ausführe, erhalte ich einen 1004 Fehler beim folgenden Skript 'Wenn cell3.Find (ContainWord) ist nichts als'. Jede Hilfe würde sehr geschätzt werden.

Sub DoNotContainClearCells() 
Dim rng As Range 
Dim rng2 As Range 
Dim rng3 As Range 

Dim cell As Range 
Dim cell2 As Range 
Dim cell3 As Range 
Dim ContainWord As String 

'What range do you want to search? 
    Set rng = Range("A:A") 
    Set rng2 = Range("D:D") 
    Set rng3 = Range("L:L") 
    'What phrase do you want to test for? 
    ContainWord = "jaba" 

For Each cell In rng 

    If cell.Value = "prepaid" Then 


     'Loop through each cell in range and test cell contents 
     For Each cell2 In rng2.Cells 
      If cell2.Find(ContainWord) Is Nothing Then EntireRow.Delete 
     Next cell2 

     Else 
     'Loop through each cell in range and test cell contents 
     For Each cell3 In rng3.Cells 
      If cell3.Find(ContainWord) Is Nothing Then EntireRow.Delete 
     Next cell3 

    End If 
Next 
End Sub 
+1

Warum Sie durch alle Spalte A müssen Schleife gegeben? Sobald Prepaid einmal gefunden wurde, löscht es alle Einträge der Spalte D. Sobald es einen anderen Wert gefunden hat, löscht es alle Einträge der Spalte L. Es gibt keinen Grund, weiter in A zu suchen. Oder habe ich es falsch verstanden? – SJR

+0

Stimmen Sie mit @SJR zu, es sei denn, Sie meinen das für jede Zeile. Beispiel, wenn Zelle (A1) = "vorausbezahlt" >> überprüfe ob Zelle (D1) = "jaba" >> wenn ja Zeile löschen. Wenn Zelle (A1) <> "Prepaid" >> überprüfe ob Zelle (L1) = "Jaba" >> wenn ja Zeile löschen. Ansonsten sind 3 "For" -Schleifen gar nicht nötig. –

+0

Aufgrund von Feinheiten, wie Logistikunternehmen ihre Kunden abrechnen, ist die initial for-Schleife notwendig. Ich kann von Jaba an eine dritte Partei versenden, aber ich bin nicht an dieser Rechnung interessiert, da sie im Voraus bezahlt wird. Danke – SmC

Antwort

0

Ohne die Logik des Codes zu diskutieren, die nicht Teil der Frage ist, kann ich Ihnen sagen, dass die

Laufzeitfehler ‚1004‘: Objekt erforderlich

in dieser Zeile:

If cell3.Find(ContainWord) Is Nothing Then EntireRow.Delete 

an der Spitze müssen immer

If cell2.Find(ContainWord) Is Nothing Then cell2.EntireRow.Delete 
If cell3.Find(ContainWord) Is Nothing Then cell3.EntireRow.Delete 

vorschlagen:, weil die EntireRow.Delete ist eine Reihe (siehe Range.EntireRow Property (Excel))

Lösung fehlt: Ersetzen Sie diese Zeilen:

If cell2.Find(ContainWord) Is Nothing Then EntireRow.Delete 
If cell3.Find(ContainWord) Is Nothing Then EntireRow.Delete 

mit diesen der Module \ classes \ userforms:

Option Explicit 

haben Dies würde eine Compile error: Variable not defined Hervorhebung der Fehler früher zu kompilieren Zeit (siehe Option Explicit Statement)

+0

Vielen Dank E MM! – SmC

Verwandte Themen