Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA:find schleife

VBA:find schleife
dani
Hallo Nepumuk, Björn, Rainer, und all Ihr Excel-Spezl's,
ich habe folgendes Problem an dem ich seit Tagen schon "herumschustere".
Aus dem Archiv habe ich schon viele Lösungen gefunden, dennoch komme ich
nicht weiter.
Folgende Situation:
- 3 Tabellenblätter:
    => "FB-Übersicht CR" - diese ist sozusagen der Master, der immer
aktuell sein muss
    => "gelöscht" - hier sind die Suchbegriffe/Artikel-Nr. enthalten, die
aus dem Master gelöscht werden sollen
           = temporäres Blatt, was wöchentlich mit den
changes/deletions/new SKUs aktualisiert wird
    => "Gelöschte AAs" - diese soll zum Review dienen und alle aus dem
Master gelöschten Artikel-Nr mit dem Lösch-Datum enthalten
Was ich nun brauche:
In Tabelle "gelöscht" stehen immer unterschiedliche Artikel-Nr. in Spalte
A. Diese sollen im Master
= "FB-Übersicht CR" in der Spalte A gefunden werden. Sobald dort gefunden,
soll die gesamte Zeile kopiert, in Tabelle "gelöschte AAs" übertragen
werden und aus dem Master gelöscht werden. Zusätzlich
soll in Tabelle "gelöschte AAs" in Spalte F das Datum der Ausführung des
Makros als value eingetragen werden. Ihr werdet sehen, dass im code noch
seltsame Versuche enthalten sind,  nur die range der Artikel-Nr.
einzugrenzen im Blatt "gelöscht" & "gelöschte AAs". Keine Ahnung ob ich die
überhaupt brauche ...
Ich habe den nachfolgenden Code aus verschiedenen Archiv-Beiträgen
zusammengestellt, aber  _
leider weiss ich keinen Rat mehr und bitte Euch um Hilfe.

Sub test()
    Dim sku, nextsku, lsku As Variant
    Dim ersteadresse, letzteadresse As String
   Dim firstaddress As String
    x = Worksheets("gelöschte aas").UsedRange.Rows.Count
    y = Application.WorksheetFunction.VLookup(Worksheets("gelöscht").Range
("A1:A10"), Sheets("   _
FB-Übersicht CR").Range("A:A"), 1, False)
    With Sheets("FB-Übersicht CR").Columns(1)
    Set sku = .Find(what:=Sheets("Gelöscht").Cells(1, 1), LookIn:=xlValues)
        If Not sku Is Nothing Then
            ersteadresse = AA.Address
            lsku = Sheets("Gelöscht").Range("A:a").SpecialCells
(xlLastCell).Address
        Do
            Sheets("FB-Übersicht CR").Rows(sku.Row).EntireRow.Copy
Destination:=Sheets("Gelö _
schte AAs"). _
            Cells(x + 1, 1).EntireRow
        Set nextsku = .FindNext(sku)
        Loop While Not AA Is Nothing And ersteadresse  AA.Address
        End If
    End With
'    Application.ScreenUpdating = True
End Sub

Ich bin der totale VBA-Anfänger und habe sicherlich im code oben einiges
durcheinander gebracht, falsch gemacht, etc. denn mir wird immer nur der 1.
gefundene kopiert - die Suche wird nicht fortgesetzt ...? Das Löschen habe
ich nicht drin im code, weil ich erst testen wollte ... aber soweit komm
ich ja schon gar nicht ...
Ich bedanke mich schon mal für Eure Mühe & Verständnis für den Anfänger!
VG Dani
Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: VBA:find schleife
15.06.2012 15:03:47
guentherh
wenn ich richtig lese, solltest Du "AA" durch"sku" ersetzen (3x)
Gruß,
Günther
AW: VBA:find schleife
15.06.2012 17:17:02
fcs
Hallo Dani,
versuche dein Glück mal mit folgender nicht getesteten Variante.
Gruß
Franz
Sub test()
Dim sku As Range
Dim ersteadresse As String, bolDelete As Boolean
Dim wksCR As Worksheet, wksGeloescht As Worksheet, wksAAs As Worksheet
Dim LastRowAAs As Long, Rowgeloescht As Long
Set wksAAs = Worksheets("gelöschte aas")
Set wksCR = Worksheets("FB-Übersicht CR")
Set wksGeloescht = Worksheets("Gelöscht")
Application.ScreenUpdating = False
With wksAAs
LastRowAAs = wksGeloescht.Cells(.Rows.cout, 1).End(xlUp).Row
End With
With wksGeloescht
Rowgeloescht = wksGeloescht.Cells(.Rows.cout, 1).End(xlUp).Row
End With
For Rowgeloescht = 1 To Rowgeloescht
If wksGeloescht.Cells(Rowgeloescht, 1)  "" Then
With wksCR.Columns(1)
Set sku = .Find(what:=wksGeloescht.Cells(Rowgeloescht, 1), LookIn:=xlValues, lookat:= _
xlWhole)
If Not sku Is Nothing Then
ersteadresse = sku.Address
Do
LastRowAAs = LastRowAAs + 1
wksAAs.Rows(LastRowAAs).PasteSpecial Paste:=xlFormats
wksAAs.Rows(LastRowAAs).PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
wksAAs.Cells(LastRowAAs, 6).Value = Date
sku.EntireRow.Clear
bolDelete = True
Set sku = .FindNext(after:=sku)
Loop Until ersteadresse = sku.Address
End If
End With
End If
Next Rowgeloescht
With wksCR
.Activate
If bolDelete = True Then
With .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End With
End If
End With
Application.ScreenUpdating = True
End Sub

Anzeige
AW: VBA:find schleife
15.06.2012 19:10:18
Dani
Hallo Franz, Günther,
@Franz - 1000 Dank für das Erstellen des Codes. Leider erhalte ich einen "Laufzeitfehler 1004" an dem Punkt wksAAs.Rows(LastRowAAs).PasteSpecial Paste:=xlFormats (nach dem DO). Was muss ich da korrigieren?
@Günther, vielen Dank für die Nachricht - leider haben die Änderungen von "AA" auf "SKu" nicht geholfen.
Vielen Dank vorab!
Dani
Anzeige
AW: VBA:find schleife
15.06.2012 19:40:31
fcs
Hallo Dani,
da waren mir im Blindflug doch ein paar Flüchtigkeitsfehler passiert. Ich hab die3 Blätter jetzt mal nachgebaut.
So sollte es jetzt funktionieren.
Gruß
Franz
Sub geloeschte_entfernen()
Dim sku As Range
Dim bolDelete As Boolean
Dim wksCR As Worksheet, wksGeloescht As Worksheet, wksAAs As Worksheet
Dim LastRowAAs As Long, Rowgeloescht As Long
Set wksAAs = Worksheets("gelöschte aas")
Set wksCR = Worksheets("FB-Übersicht CR")
Set wksGeloescht = Worksheets("Gelöscht")
Application.ScreenUpdating = False
With wksAAs
LastRowAAs = .Cells(.Rows.Count, 1).End(xlUp).Row
End With
With wksGeloescht
Rowgeloescht = .Cells(.Rows.Count, 1).End(xlUp).Row
End With
For Rowgeloescht = 1 To Rowgeloescht
If wksGeloescht.Cells(Rowgeloescht, 1)  "" Then
With wksCR.Columns(1)
Set sku = .Find(what:=wksGeloescht.Cells(Rowgeloescht, 1), LookIn:=xlValues, _
lookat:=xlWhole)
If Not sku Is Nothing Then
Do
LastRowAAs = LastRowAAs + 1
sku.EntireRow.Copy
wksAAs.Rows(LastRowAAs).PasteSpecial Paste:=xlPasteFormats
wksAAs.Rows(LastRowAAs).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
wksAAs.Cells(LastRowAAs, 6).Value = Date
sku.EntireRow.Clear
bolDelete = True
Set sku = .FindNext(after:=sku)
Loop Until sku Is Nothing
End If
End With
End If
Next Rowgeloescht
With wksCR
.Activate
If bolDelete = True Then
With .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End With
End If
End With
Application.ScreenUpdating = True
End Sub

Anzeige
PERFEKT !!!
15.06.2012 20:07:37
Dani
Das klappt HERVORRAGEND!!! Vielen, vielen, vielen Dank Franz!
Da ich neu im Forum bin habe ich noch die Frage, wie oft & lange ich Euch Spezialisten "belästigen" darf? Selbstverständlich erst nachdem ich erfolglos die Archiv-Suche durchstöbert und ähnliche Codes versucht habe anzupassen.
Sonnige Grüße aus Stgt
Dani
Anzeige
... doch noch 1 Frage
15.06.2012 22:42:36
Dani
Guten ABend Franz,
ich habe die ganze Zeit bis jetzt versucht, noch einen Punkt aufzunehmen aber ich krieg es nicht hin. Würdest Du mir bitte nochmal behilflich sein?
Das Blatt wksGeloescht enthält ja die zu löschenden Artikel als Suchbegriff - anhand dessen dann die Aktionen ausgeführt werden. In der Spalte L steht pro Artikel-Nr. auch der Text, warum diese Artikel-Nr. gelöscht wird. Diesen Text würde ich ganz gerne in dem Blatt wksAAs in der Spalte J anzeigen lassen.
Was muss im code geändert/ergänzt werden?
Vielen Dank nochmal & Grüße
Dani
Anzeige
pack einfach noch ne Variable dazu ...
16.06.2012 08:46:09
Matthias
Hallo
Könnte man so machen:
Hab das Eingefügte fett markiert mit einem '* dahinter
Option Explicit
Sub geloeschte_entfernen()
Dim sku As Range
Dim bolDelete As Boolean
Dim wksCR As Worksheet, wksGeloescht As Worksheet, wksAAs As Worksheet
Dim LastRowAAs As Long, Rowgeloescht As Long
Dim Grund$ '*
Set wksAAs = Worksheets("gelöschte aas")
Set wksCR = Worksheets("FB-Übersicht CR")
Set wksGeloescht = Worksheets("Gelöscht")
Application.ScreenUpdating = False
With wksAAs
LastRowAAs = .Cells(.Rows.Count, 1).End(xlUp).Row
End With
With wksGeloescht
Rowgeloescht = .Cells(.Rows.Count, 1).End(xlUp).Row
End With
For Rowgeloescht = 1 To Rowgeloescht
If wksGeloescht.Cells(Rowgeloescht, 1)  "" Then
 Grund = wksGeloescht.Cells(Rowgeloescht, 12).Value '*
With wksCR.Columns(1)
Set sku = .Find(what:=wksGeloescht.Cells(Rowgeloescht, 1), LookIn:=xlValues, _
lookat:=xlWhole)
If Not sku Is Nothing Then
Do
LastRowAAs = LastRowAAs + 1
sku.EntireRow.Copy
wksAAs.Rows(LastRowAAs).PasteSpecial Paste:=xlPasteFormats
wksAAs.Rows(LastRowAAs).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
wksAAs.Cells(LastRowAAs, 6).Value = Date
wksAAs.Cells(LastRowAAs, 7).Value = Grund
sku.EntireRow.Clear
bolDelete = True
Set sku = .FindNext(after:=sku)
Loop Until sku Is Nothing
End If
End With
End If
Next Rowgeloescht
With wksCR
.Activate
If bolDelete = True Then
With .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End With
End If
End With
Application.ScreenUpdating = True
End Sub
https://www.herber.de/bbs/user/80582.xls
Gruß Matthias
Anzeige
Einfach FANTASTISCH!!
16.06.2012 10:15:15
Dani
BESTEN DANK, Matthias!
Wahrscheinlich denke ich komplizierter als wie es letzten Endes ist ...
Ich bewundere Euch "Zauberer" :-)
AW: VBA:find schleife
15.06.2012 19:42:52
Franc
Das am Anfang bei bei den 2 "count" das "n" fehlt hast schon beseitigt richtig?
Ansonsten änder das wie folgt ab (fehlt denk hinten nur noch mal das "paste")
wksAAs.Rows(LastRowAAs).PasteSpecial Paste:=xlPasteFormats
wksAAs.Rows(LastRowAAs).PasteSpecial Paste:=xlPasteValues
Anzeige
AW: VBA:find schleife
15.06.2012 20:11:59
Dani
Hallo Franc - ja, das count hatte ich schon korrigiert aber das beim pasten was fehlte habe ich nicht entdeckt. Jetzt weiss ich aber, wie es richtig heissen müsste und ich hoffe, dass ich in Zukunft das auch so schnell werde erblicken können :-)
Auch Dir besten Dank für die sofortige Hilfe!
VG
Dani
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

VBA: Die .Find-Funktion für effektives Suchen und Löschen in Excel


Schritt-für-Schritt-Anleitung

  1. Öffne deinen Excel-Arbeitsbereich und stelle sicher, dass die benötigten Tabellenblätter vorhanden sind: "FB-Übersicht CR", "gelöscht" und "gelöschte AAs".

  2. Öffne den VBA-Editor (Alt + F11) und füge ein neues Modul ein (Rechtsklick auf "VBAProject" > Einfügen > Modul).

  3. Kopiere den folgenden Code in das Modul:

    Sub geloeschte_entfernen()
       Dim sku As Range
       Dim bolDelete As Boolean
       Dim wksCR As Worksheet, wksGeloescht As Worksheet, wksAAs As Worksheet
       Dim LastRowAAs As Long, Rowgeloescht As Long
       Dim Grund As String
    
       Set wksAAs = Worksheets("gelöschte aas")
       Set wksCR = Worksheets("FB-Übersicht CR")
       Set wksGeloescht = Worksheets("Gelöscht")
       Application.ScreenUpdating = False
    
       LastRowAAs = wksAAs.Cells(wksAAs.Rows.Count, 1).End(xlUp).Row
       Rowgeloescht = wksGeloescht.Cells(wksGeloescht.Rows.Count, 1).End(xlUp).Row
    
       For Rowgeloescht = 1 To Rowgeloescht
           If wksGeloescht.Cells(Rowgeloescht, 1) <> "" Then
               Grund = wksGeloescht.Cells(Rowgeloescht, 12).Value
               With wksCR.Columns(1)
                   Set sku = .Find(what:=wksGeloescht.Cells(Rowgeloescht, 1), LookIn:=xlValues, lookat:=xlWhole)
                   If Not sku Is Nothing Then
                       Do
                           LastRowAAs = LastRowAAs + 1
                           sku.EntireRow.Copy
                           wksAAs.Rows(LastRowAAs).PasteSpecial Paste:=xlPasteFormats
                           wksAAs.Rows(LastRowAAs).PasteSpecial Paste:=xlPasteValues
                           Application.CutCopyMode = False
                           wksAAs.Cells(LastRowAAs, 6).Value = Date
                           wksAAs.Cells(LastRowAAs, 7).Value = Grund
                           sku.EntireRow.Clear
                           bolDelete = True
                           Set sku = .FindNext(after:=sku)
                       Loop Until sku Is Nothing
                   End If
               End With
           End If
       Next Rowgeloescht
    
       With wksCR
           If bolDelete = True Then
               With .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
                   .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
               End With
           End If
       End With
       Application.ScreenUpdating = True
    End Sub
  4. Führe das Makro aus, um die Artikel-Nr. zu suchen, zu löschen und die entsprechenden Daten zu übertragen.


Häufige Fehler und Lösungen

  • Laufzeitfehler 1004: Dieser kann auftreten, wenn du versuchst, auf eine Zelladresse zuzugreifen, die nicht existiert. Achte darauf, dass die Zeilen und Spalten in deinen Tabellenblättern korrekt referenziert sind.

  • Nichts wird kopiert: Überprüfe, ob die Artikel-Nr. in der Tabelle "gelöscht" tatsächlich in der "FB-Übersicht CR" vorhanden sind. Wenn die Werte abweichen, wird die .Find-Funktion keine Übereinstimmungen finden.

  • Fehler bei der Verwendung von .Find: Stelle sicher, dass du LookIn:=xlValues und lookat:=xlWhole richtig setzt, um genaue Übereinstimmungen zu finden.


Alternative Methoden

  • Verwendung von VBA-Suchfunktionen: Anstelle von .Find kannst du auch die WorksheetFunction VLookup oder die Match-Funktion verwenden, um Werte zu suchen.

  • Excel-Filter: Manuell kannst du auch die Filterfunktion von Excel verwenden, um die Daten schnell zu suchen und zu analysieren.


Praktische Beispiele

  1. Artikel löschen und Grund dokumentieren: In der Spalte L deiner Tabelle "gelöscht" kannst du einen Grund für die Löschung angeben, der dann in die Tabelle "gelöschte AAs" in die entsprechende Spalte übertragen wird.

  2. Daten in einer neuen Tabelle aggregieren: Du kannst zusätzliche Funktionen einfügen, um die Daten nach dem Löschen zu aggregieren oder zusammenzufassen.


Tipps für Profis

  • Fehlerbehandlung einfügen: Implementiere On Error Resume Next, um Fehler während der Ausführung des Makros zu ignorieren und diese später zu analysieren.

  • Performance-Optimierung: Deaktiviere ScreenUpdating zu Beginn des Codes, um die Ausführungsgeschwindigkeit zu erhöhen, und aktiviere es am Ende wieder.

  • Verwendung von vba.find: Nutze die .Find-Funktion, um gezielt nach Werten in großen Datenmengen zu suchen, da diese Methode wesentlich schneller ist als eine Schleife.


FAQ: Häufige Fragen

1. Wie kann ich meine Suche anpassen, um nach Teilstrings zu suchen?
Du kannst die lookat-Option in der .Find-Funktion auf xlPart setzen, um auch Teilstrings zu finden.

2. Was ist der Unterschied zwischen .Find und VLookup?
Die .Find-Funktion sucht nach einem bestimmten Wert in einem Bereich und gibt die Zellreferenz zurück, während VLookup einen Wert in der ersten Spalte einer Tabelle sucht und einen Wert aus einer angegebenen Spalte zurückgibt.

3. Kann ich das Makro so anpassen, dass es automatisch bei Änderungen in der Tabelle ausgeführt wird?
Ja, du kannst das Makro mit einem Worksheet_Change-Ereignis verknüpfen, sodass es automatisch ausgeführt wird, wenn sich Werte in der Tabelle ändern.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige