Range.Find - Methode arbeitet nicht korrekt ??!

  • Excel

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ereza.

    Range.Find - Methode arbeitet nicht korrekt ??!

    Hi liebes Forum!

    Muss man bei Range.find - etwas spezielles beachten? - Arbeitet die Methode bei einer bestimmten Zeilenanzahl nicht mehr richtig?

    Weil...

    Ich habe folgenden Code:

    Visual Basic-Quellcode

    1. Dim a As Long
    2. Dim b As Long
    3. Dim c As Long
    4. Dim d As Long
    5. Dim equinr_tab22 As Long
    6. Dim rng As Range
    7. Dim zähle1 As Long
    8. Dim zähle2 As Long
    9. Dim posit As Long
    10. Dim kz As Boolean
    11. Tabelle16.Range("K2:K1048576").ClearContents
    12. b = Tabelle22.Cells(Rows.Count, 15).End(xlUp).Row
    13. c = Tabelle16.Cells(Rows.Count, 4).End(xlUp).Row
    14. kz = False
    15. d = 2
    16. For a = 2 To b
    17. equinr_tab22 = Tabelle22.Cells(a, 15)
    18. Set rng = Tabelle16.Range(Tabelle16.Cells(1, 4), Tabelle16.Cells(c, 4)).Find(equinr_tab22, Tabelle16.Cells(1, 4), xlValues)
    19. If rng Is Nothing Then
    20. kz = True
    21. Tabelle16.Cells(d, 11).Value = equinr_tab22
    22. zähle1 = zähle1 + 1
    23. d = d + 1
    24. Else
    25. zähle2 = zähle2 + 1
    26. End If
    27. Next


    Meine Absicht ist es, nach 7-stelligen Zahlen zu suchen...

    Wenn die Zahl NICHT vorkommt, bzw. NICHT GEFUNDEN wird, dann soll diese Zahl in Tabelle16.Cells(d, 11) geschrieben werden...

    So....

    nun ist es für mich leider unverständlich, warum das nicht bei allen Fällen funktioniert. - Denn, um nur ein Beispiel zu nennen....

    Wenn in dem Suchbereich Tabelle16.Range(Tabelle16.Cells(1, 4), Tabelle16.Cells(c, 4)) beispielsweise der Wert: "1004288" vorkommt... und ich suche danach, dann bekommt Excel, beim Abarbeiten trotzdem den Wert, "Nothing" obwohl, die Zahl eigentlich im Suchbereich vorkommt! und das passiert nicht nur bei dieser Zahl, sondern bei vielen vielen weiteren auch.... was nicht sein dürfte...

    Der Suchbereich umfasst mehr als 22000 Zeileneinträge... Nun stellt sich mir die Frage, ob dieses Fehlverhalten, eventuell, darauf zurückzuführen ist...??


    Weiß vl. jemand von euch, woran das liegen könnte??

    und... ich habe es auch nur mit:

    Visual Basic-Quellcode

    1. Set rng = Tabelle16.Range(Tabelle16.Cells(1, 4), Tabelle16.Cells(c, 4)).Find(equinr_tab22)


    probiert... das geht auch nicht, deshalb dachte ich, wenn ich die parameter noch spezifiziere... deshalb habe ich bei lookin auch xlValues gewählt, da ja anscheinend als default-wert xlFormular verwendet wird...

    aber so oder so, haut es leider nicht hin...



    ansonsten, wäre ich auch für eine alternative Methode, anstatt der Find-Methode offen.... ich kenne jz aber nur "Find" in dem Sinne...



    VG Tim
    Hi @ereza!

    Hast du dir schon mal die Office-Doku zu der Funktion angeschaut?
    So wie ich das lese, übergibst du zwar der Find-Funktion zuerst das Suchkriterium und den Bereich, in der gesucht werden soll.
    Was mich aber wundert ist folgendes: Wenn ich mir bei deinem Code Zeile #22 ansehe, dann weist du der Variable equinr_tab22 ein Range-Objekt zu(Worksheet.Cells) und der Compiler gibt dir keine Warnung aus? Gut ich mein es ist Excel und VBA...aber das?

    Probier mal folgendes: Mach aus .Cells(a, 15) ein .Cells(a, 15).Value, dann erhältst du auch eine Wert und kein Range-Objekt ;D
    Und füge in die Find()-Funktion so viele Nothings ein, dass die Signatur stimmt.

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    @Radinator

    In VBA gibt es immer ein Default Member, dieser wird implizit verwendet wenn es geht. Bei Range ist der Default Member Value. Daher funktioniert das auch, ohne in explizit zu schreiben. Nothing in der Find Methode ist schlicht falsch (und auch nicht möglich). Es sind optionale Parameter mit Default Werten. Bei Werte Typen wie Integer usw kann man in VBA nothing nicht verwenden (nur bei Objekten). Als einfach weglassen und man hat den Defaultwert für den optionalen Parameter.

    @ereza ich kann das wieder nicht nachvollziehen. Ich vermute du hast wieder berechnete Werte?
    Das ist meine Signatur und sie wird wunderbar sein!
    hallo Mono

    die Werte sind über eine eine for schleife, direkt übertragen...:

    Visual Basic-Quellcode

    1. For a = 2 To b
    2. status_tab23 = Tabelle23.Cells(a, 9)
    3. If status_tab23 = "LÖVM" Or status_tab23 = "INAK" Then
    4. Tabelle16.Cells(c, 4).Value = Tabelle23.Cells(a, 1)
    5. Tabelle16.Cells(c, 5).Value = Tabelle23.Cells(a, 2)
    6. Tabelle16.Cells(c, 6).Value = Tabelle23.Cells(a, 3)
    7. Tabelle16.Cells(c, 7).Value = Tabelle23.Cells(a, 4)
    8. Tabelle16.Cells(c, 8).Value = Tabelle23.Cells(a, 9)
    9. c = c + 1
    10. Else
    11. End If
    12. Next


    also... in dem fall sind die werte einfach nur kopiert worden...

    ich habe aber auch vorsichtshalber auch probiert, mit gerundeten werten zu arbeiten... funktioniert aber auch nicht.... :(

    was hast du mit:

    Nothing in der Find Methode ist schlicht falsch (und auch nicht möglich)


    nochmals genau gemeint...?

    weil mei ansatz ist ja grundsätzlich richtig mit:

    "wenn du nix findest... also wenn sich 'Nothing' ergibt..., dann..."

    oder?

    weil bei vielen einträgen, haut es ja hin...

    aber eben, bei gewissen wieder nicht... also das verhalten ist inkonsistent... :(

    hast du vl. eine idee, wie ich fehler ausschließen könnte??

    LG Tim
    Also ich kann es wie gesagt nicht nachvollziehen. Vll hängst mal ein Excel Sheet an bei dem das auftritt.
    Kann es mir auch gerade nicht wirklich erklären.
    Das ist meine Signatur und sie wird wunderbar sein!
    hmm... ja ich weiß auch nicht weiter...

    aber...

    ich habe jetzt einfach einen Workaround....

    und zwar... bastle ich mir selber meine "eigene" Find-Methode...

    indem ich einfach mit ner Schleife arbeite...

    also... für jene, die das gleiche Problem haben wie ich.... hier mein Workaround, der die Lösung meines Problems war:

    Visual Basic-Quellcode

    1. Dim a As Long
    2. Dim b As Long
    3. Dim c As Long
    4. Dim d As Long
    5. Dim e As Long
    6. Dim equinr_tab22 As Long
    7. Dim equinr_tab16 As Long
    8. Dim zähle1 As Long
    9. Dim zähle2 As Long
    10. Dim kz As Boolean
    11. Dim kz_gefunden As Boolean
    12. Tabelle16.Range("K2:K1048576").ClearContents
    13. b = Tabelle22.Cells(Rows.Count, 15).End(xlUp).Row
    14. c = Tabelle16.Cells(Rows.Count, 4).End(xlUp).Row
    15. kz = False
    16. kz_gefunden = False
    17. d = 2
    18. For a = 2 To b
    19. equinr_tab22 = Tabelle22.Cells(a, 15)
    20. For e = 2 To c
    21. equinr_tab16 = Tabelle16.Cells(e, 4)
    22. If equinr_tab16 = equinr_tab22 Then
    23. kz_gefunden = True
    24. Else
    25. End If
    26. Next
    27. If kz_gefunden = True Then
    28. zähle2 = zähle2 + 1
    29. ElseIf kz_gefunden = False Then
    30. kz = True
    31. Tabelle16.Cells(d, 11).Value = equinr_tab22
    32. zähle1 = zähle1 + 1
    33. d = d + 1
    34. End If
    35. kz_gefunden = False
    36. Next



    Zur Erklärung... "kz_gefunden" dient als Kennzeichen... wenn der Wert gefunden wurde... --> wenn er gefunden wurde... wird er "true"...

    und dann, nachdem der gewünschte Bereich komplett durchsucht wurde etc... und der nächste Suchvorgang (also mit neuem Wert) durchgeführt wird... wird das Kennzeichen einfach initial wieder auf "false" gesetzt... (entspricht Zeile 44)

    also... wem es was helfen sollte...


    VG Tim

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ereza“ ()