Anzeige
Archiv - Navigation
660to664
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
660to664
660to664
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Cells.Find findet tlw. Quatsch, Error handler?

Cells.Find findet tlw. Quatsch, Error handler?
02.09.2005 22:21:52
Martin
Hallo,
ich will aus einer Tabelle Werte entnehmen und die in einem anderen Blatt suchen, wenn gefunden, soll ein Wert von der zweiten Tabelle in die erste kopiert werden.
-Zwei For Next Schlifen dauern zu lange, also versuchte ich es mit Cells.Find.
das Problem: Wenn der Wert nicht gefunden wurde, muß dieser Fehler aufgefangen werden. Wenn ich es mit ON ERROR RESUME NEXT mache, sucht sich das Cells.Find ziemlich viel Quatsch zusammen (20% der Werte sind FALSCH!)- woran liegt das und wie kann man es besser machen:
Code:

Sub DatenJoiner()
Dim Suchen As String
Dim Zeile As Integer
On Error Resume Next
For a = 2 To 2700
Suchen = Worksheets("Data").Cells(a, 2)
Worksheets("ZIEL").Activate
Zeile = Cells.Find(what:=Suchen, after:=Range("A1")).Row
Worksheets("Data").cells(a,3) = Worksheets("ZIEL").cells(Zeile,1)
Next a
End Sub

jeder Tipp hilft
Martin

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Cells.Find findet tlw. Quatsch, Error handler?
02.09.2005 22:25:54
Ramses
Hallo
Zeile = Cells.Find(what:=Suchen, after:=Range("A1")).Row
If Not Zeile Is Nothing Then
---Deine Code wenn gefunden
Gruss Rainer
AW: Cells.Find findet tlw. Quatsch, Error handler?
02.09.2005 22:34:59
Martin
geht leider nicht, Typenunverträglich
Martin
AW: Cells.Find findet tlw. Quatsch, Error handler?
02.09.2005 22:48:34
Ramses
Hallo
Ich dachte das ginge schon, ... hast du doch geschrieben ? :-)
Lass das ".Row" weg, dann sollte es gehen.
Gruss Rainer
AW: Cells.Find findet tlw. Quatsch, Error handler?
02.09.2005 23:12:12
Martin
Geht wegen dem NOT Zeile nicht, Zeile ist nicht Boole'sche, sonder ein Integer, deswegen kein NOT, gibt es soetwas wieEMPTY, Zeile =0 oder Zeile = LEER?
- Ging vorher schon, aber eben nicht mit der Abfrage.
Sonst ist die idee IMHO schon richtig, ich will abfangen, daß ZEILE leer ist.
Und Zeile brauche ich, weil ich ja, den Wert aus der gefundenen Zeile verwenden muß um die Daten zu finden, die ich rüberkopieren will.
Vll aber auch mit ACTIVATE und dann den Wert der activierten Zeile auslesen?
Hmm... - das fängt den Fehler auch nicht ab.
Irgendwie kmpliziert, nicht
Martin
Anzeige
AW: Cells.Find findet tlw. Quatsch, Error handler?
02.09.2005 23:22:04
Ramses
Hallo
"...Geht wegen dem NOT Zeile nicht, Zeile ist nicht Boole'sche, ..."
Wer sagt das ?
Dann stimmt dein Code im grundsätzlichen Aufbau schon nicht.
Hier mal ein Beispiel das funktioniert
Sub Extinguisher_MultiSeek()
    '(C) by Ramses
    'Sucht in der gesamten Mappe nach einem Begriff und kopiert die
    'gefundene Zeile in eine zu definfierende Ergebnistabelle
    'Addiert den Wert rechts von der gefundenen Zelle
    'und erstellt gleichzeitig Hyperlinks auf die Fundstellen
    'in der Ergebnistabelle
    Dim sResultName As String
    Dim sWks As Worksheet, tarWks As Worksheet
    Dim sRng As Range
    Dim sAddress As String
    Dim Qe As Integer, i As Integer
    Dim fString As Integer, fUnit As Integer
    'Suchbegriff
    Dim sFind As Variant
    Dim cr As Long
    fString = 0
    fUnit = 0
    'Name_der_Zieltabelle
    'Bitte Anpassen !!!!
    sResultName = "Suchergebnis"
    'Prüfzyklus
    For i = 1 To Worksheets.count
        If Worksheets(i).name = sResultName Then
            Qe = MsgBox("Ergebnistabelle existiert schon!" & vbCrLf & _
                "Tabelle löschen ?", vbCritical + vbYesNo, "Wie weiter ... ?")
            If Qe = vbNo Then
                MsgBox "Makro wird abgebrochen"
                Exit Sub
            End If
            Application.DisplayAlerts = False
            Worksheets(i).Delete
            Application.DisplayAlerts = True
            Exit For
        End If
    Next i
    'Suchbegriff anfordern
    sFind = InputBox("Bitte Suchbegriff eingeben:", "Suche nach", "Feuerlöscher")
    If sFind = "" Then
        Qe = MsgBox("Kein Suchbegriff angegeben", vbInformation + vbOKOnly, "Abbruch")
        Exit Sub
    End If
    'Alternativ Suchbegriff auf Zelle definieren
    'sFind = Worksheets(sresultname).Range("B1")
    'Ergebnistabelle vorbereiten
    Worksheets.Add.name = sResultName
    Set tarWks = Worksheets(sResultName)
    With tarWks
        .Range("A1") = "Suchkriterium"
        .Range("B1") = sFind
        .Range("A3") = "Tabellenname"
        .Range("B3") = "Anzahl"
    End With
    'Startzeile für Ergebnisse definieren
    cr = 4
    For Each sWks In Worksheets
        If sWks.name <> tarWks.name Then
            'Suchbegriff suchen
            Set sRng = sWks.Cells.Find(What:=sFind, _
                LookAt:=xlPart, LookIn:=xlFormulas)
            If Not sRng Is Nothing Then
                'Fundstellen merken
                sAddress = sRng.Address
                Do
                    Application.Goto sRng, True
                    'Eintragen in ERgebnistabelle
                    tarWks.Cells(cr, 1) = sWks.name
                    'Hyperlink auf Suchergebnis erstellen
                    tarWks.Cells(cr, 1).Hyperlinks.Add Anchor:=tarWks.Cells(cr, 1), _
                        Address:="", SubAddress:=sWks.name & "!" & sRng.Address, TextToDisplay:=sWks.name
                    'Zellwert übertragen
                    tarWks.Cells(cr, 2) = sRng.Offset(0, 1).Value
                    'zeilenzähler aktivieren
                    cr = cr + 1
                    'Zählvariablen updaten
                    fString = fString + 1
                    fUnit = fUnit + sRng.Offset(0, 1).Value
                    'Nächsten Suchbegriff in der Tabelle suchen
                    Set sRng = sWks.Cells.FindNext(after:=ActiveCell)
                    'Wenn nicht vorhanden
                    'gehts zur nächsten Tabelle
                    If sRng.Address = sAddress Then Exit Do
                Loop
            End If
        End If
        NextStart:
    Next sWks
    tarWks.Select
    Qe = MsgBox("Suchbegriff: " & sFind & " wurde " & fString & " mal gefunden." & vbCrLf & _
        "Total werden: " & fUnit & " benötigt. ", vbInformation + vbOKOnly, "Suche abgeschlossen")
End Sub


Gruss Rainer
Anzeige
AW: Cells.Find findet tlw. Quatsch, Error handler?
02.09.2005 23:22:42
Erich
Hallo Martin,
versuch mal

Sub DatenJoiner()
Dim Suchen As String
Dim Zeile As Integer
Dim Erg As Range
For a = 2 To 2700
Suchen = Worksheets("Data").Cells(a, 2)
Worksheets("ZIEL").Activate
Set Erg = Cells.Find(what:=Suchen, after:=Range("A1"))
If Not Erg Is Nothing Then
Zeile = Erg.Row
Worksheets("Data").Cells(a, 3) = Worksheets("ZIEL").Cells(Zeile, 1)
End If
Next a
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: Cells.Find findet tlw. Quatsch, Error handler?
Martin
Hi erich,
sah erst total gut aus, dann findet diese cell.finds Methode aber immer noch Quatsch. ich kann es mir nicht erklären, ich verstehe es einfach nicht. Macht die eine nicht-exakte Sucehe?
Ich habe die von dem Makro gefundenen Werte neben eine Spalte gestellt, die per SVERWEIS die Werte raussucht, SVERWEIS macht meinen Fehler, das Makro findet immer noch in 105 aller Fälle total falsche Werte, ich verstehe es NICHT!
sucht cells.find ggf. nicht den exakten Werte?
Danke für eure Hilfe, den Code von Ramses probiere ich morgen aus.
Gute Nacht,
Martin
Anzeige
AW: Cells.Find findet tlw. Quatsch, Error handler?
03.09.2005 00:08:52
Nepumuk
Hi,
sind da Fragezeichen oder Sterne in deinem Suchbegriff?
Gruß
Nepumuk
Excel & VBA – Beispiele
AW: Cells.Find findet tlw. Quatsch, Error handler?
03.09.2005 00:09:45
Erich
Hallo Martin,
vielleicht müsstest du bei Find noch einen oder mehrere Parameter zusätzlich angeben, etwa (aus der VBA-Hilfe zu Find):
LookAt
Optional Variant. Kann eine der folgenden XlLookAt-Konstanten sein: xlWhole or xlPart.
MatchCase
Optionaler Variant-Wert. Wenn True, wird bei der Suche zwischen Groß- und Kleinschreibung unterschieden. Der Standardwert ist False.
Wenn nichts hilft, lad deine Mappe doch mal hoch, dann werden wir das Problem schon finden. (Mailen ginge auch, meine Adresse steht im Profil.)
Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Cells.Find findet tlw. Quatsch, Error handler?
02.09.2005 23:53:12
Erich
Hallo Martin, nochmal, hoffentlich klarer, kürzer und mit Erläuterung:

Sub DatenJoiner()
' Der Code sucht 2699 in "Data" angegebene Werte in Blatt "ZIEL"
' und überträgt - wenn gefunden - den Inhalt von Spalte A der Zeile,
' in der der gefundene Wert steht, nach Spalte C von "Data".
' Dass ein Suchbegriff mehrfach in "ZIEL" vorkommen kann, wird nicht
' berücksichtigt. Nur die erste Fundstelle wird verarbeitet.
Dim a As Long
Dim Erg As Range
Worksheets("ZIEL").Activate
For a = 2 To 2700
Set Erg = Cells.Find(what:=Worksheets("Data").Cells(a, 2), _
after:=Range("A1"))
If Not Erg Is Nothing Then _
Worksheets("Data").Cells(a, 3) = Cells(Erg.Row, 1)
Next a
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Cells.Find findet tlw. Quatsch, Error handler?
03.09.2005 00:11:25
Franz
Hallo Martin,
Ich habe das Error-Handling modifiziert, so dass bei einem Suchbegriff, der nicht gefunden wird der nächste Suchbegriff abgearbeitet wird. Ist der Suchbegriff "leer" dann wird ebenfalls zum nächsten Suchbegriff gesprungen.
Sub DatenJoiner()
Dim Suchen As String
Dim Zeile As Integer
On Error GoTo naechstes_a
For a = 2 To 2700
Suchen = Worksheets("Data").Cells(a, 2)
If Suchen = "" Then GoTo naechstes_a 'Leere Zellen abfangen
Worksheets("ZIEL").Activate
Zeile = Cells.Find(what:=Suchen, after:=Range("A1")).Row
Worksheets("Data").Cells(a, 3) = Worksheets("ZIEL").Cells(Zeile, 1)
naechstes_a:
Next a
End Sub

Gruß
Franz
Anzeige
LOOKAT muss gesetzt werden
03.09.2005 10:10:31
Martin
Hallo Franz,
Danke, aber dieser Code sagt "Objekt erforderlich" in der SET-Zeile.
Vielen Dank für die ganze Hilfe hier, am Ende war es irgendwie einfach:
Der ursprüngliche Code findet deswegen Mist, weil man FIND sagen muß, daß er immer gaze Zellen vergleicht - sonst macht FIND irgendwelche schwer verständliche Heuristiken und produziert Unsinn.
Man muß ein LOOKAT einbauen:
Set Erg = Cells.Find(what:=Suchen, after:=Range("A1"), LookAt:=xlWhole)
Korrekt und mit richtigen ergebnissen lautet jetzt das macro:

Sub DatenJoinerForum()
Dim Suchen As String
Dim Zeile As Integer
Dim Erg As Range
For a = 2 To 2700
Suchen = Worksheets("Data TEST").Cells(a, 2)
Worksheets("ZIEL TEST").Activate
Set Erg = Cells.Find(what:=Suchen, after:=Range("A1"), LookAt:=xlWhole)
If Not Erg Is Nothing Then
Zeile = Erg.Row
Worksheets("DATA TEST").Cells(a, 12) = Worksheets("ZIEL Test").Cells(Zeile, 5)
End If
Next a
End Sub

VIELEN Herzlichen dank für alle Poster bei meiner Frage, ohne Euch würde ich imme rnoch rumbasteln.
BTW: Doppelter Loop 2500 Einträge der DATA Tabelle gegen 2500 Einträge der Zieltabelle dauert 1 h, wenn man bei Gefunden nicht abricht, Code oben läuft in 2 min durch!
Es lohnt sich CELLS.FIND zu verwenden, auch wenn ich es etwas tückisch finde.
Martin
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige