Excel VBA: Probleme mit findNext Methode

Hallo,

habe folgende Funktion geschrieben:

Function entrytest(bereich As Range, suchText As String)

Dim foundCell As Range
Dim text As String
Set foundCell = bereich.Find(what:=suchText, LookIn:=xlValues)
firstAddress = foundCell.Address
Do
text = text + foundCell.Address
Set foundCell = bereich.FindNext(foundCell)
Loop While Not foundCell Is Nothing and foundcell.address firstAddress

End

Das Problem: Die FindNext-Methode liefert mir immer Nothing zurück, obwohl der Suchstring mehrmals vorkommt. Find arbeitet aber korrekt.

Jemand eine Idee an was das liegen kann?

Also bei mir funktioniert es problemlos. Vielleicht solltest Du mal ohne Makro probieren, ob es funktioniert, sprich, die Suche einfach ganz normal über dan Suchen-Dialog durchführen und dann auf „Weitersuchen“ klicken. Wenn das auch zu nichts führt, liegt es nicht am Code, sondern daran, dass Du nur denkst, dass der Begriff mehrfach vorkommt, was aber in Wirklichkeit nicht der Fall ist.

Ich persönlich glaube ja, dass Dein „bereich“ falsch ist. Ergänze mal „bereich.select“ irgendwo im Code, dann siehst Du, ob der wirklich stimmt, also alle gewünschten Zellen enthält. Ich vermute wie gesagt, dass das nicht der Fall ist. Und sollte das so sein, kann ich nur wieder sagen: Nicht immer im Blindflug programmieren, sondern gucken, was man tut!

Bist Du übrigens sicher, dass Du die Adressen einfach nur aneinander kleben willst? Ich denke, dass da noch irgendein Trennzeichen zwischen fehlt, oder? Sonst kann man damit doch wenig anfangen.

Achso, und der Artikel wäre im Excel-Brett (Tabellenkalkulation) fast noch besser aufgehoben gewesen, weil es offenbar VBA betrifft und nicht VB. Aber das ist egal, hier geht genauso :wink:

Kristian

Das Problem: Die FindNext-Methode liefert mir immer Nothing
zurück, obwohl der Suchstring mehrmals vorkommt. Find arbeitet
aber korrekt.

Hi pman,
wie hast du überprüft daß Find korrekt arbeitet?
Da Kristian sagt daß dein Code funktioniert gibts da einige Hauptverdächtige an denen es liegen könnte daß du kein Ergebnis erhälst.
Den Hauptverdächtigen siehst du im piegel *grins*
Weiterhin wäre wie gesagt zu prüfen ob du im richtigen Bereich suchst.
Weiterhin machen Daten (also Mehrzahl von datum) oft Schwierigkeiten.
Weiterhin Groß/Kleinschreibung. Problematisch sind auch Leerzeichen am Ende eines Zelleneintrages.
F8 im Vba-Editor kennst du!?
Gruß
Reinhard

habe jetzt folgendes geschrieben (gemäß Excel-Hilfe):

Dim text As String
With ActiveSheet.Range(„G6:G14“)
Set c = .Find(suchtext, LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
text = c.Address
Do
text = text + c.Address
Set c = .FindNext©
Loop While Not c Is Nothing And c.Address firstAddress
End If
End With

Die Variable text dient nur zu Testzwecken und soll nicht weiter stören.
Tatsache ist, dass in G7 und G8 ‚100‘ drin steht und er immer nur den Eintrag in G7 findet, sprich FindNext ‚nothing‘ liefert.
Habe den Verdacht, dass es sich um einen Bug von Excel handelt. Könnt ihr mal vielleicht den Code ebenfalls so eingeben und in die beiden Zellen ‚100‘ schreiben.

Weiss echt nicht mehr weiter

Die Variable text dient nur zu Testzwecken und soll nicht weiter stören.

Okay. Das „text = c.Address“ kannst Du Dir trotzdem sparen, weil das wegen der folgenden Schleife doppelt gemoppelt ist.

Tatsache ist, dass in G7 und G8 ‚100‘ drin steht und er immer nur den Eintrag in G7 findet, sprich FindNext ‚nothing‘ liefert.

Und genau das kann ich noch immer nicht nachvollziehen. Bei mir findet er´s. Schick notfalls mal Dein File, und ich probiere das mal bei mir aus.

Kristian

Tabellen-Funktion nicht = ‚normale‘ VBA-Funktion

Hallo,

habe folgende Funktion geschrieben:

… File zugeschickt …

Achsoooo, Du hast versucht, eine TABELLEN-Funktion zu schreiben, die Du also in einer Tabellenzelle verwendest und von da aus aufrufst. Das hättest Du gleich sagen sollen. Ich habe das nämlich immer nur mit einer reinen VBA-Funktion getestet, und das ist ein Unterschied.

Warum das nicht klappt, kann ich Dir auch nicht sagen. Fakt ist jedoch, dass sich Tabellenfunktionen anders verhalten, weil sie Einschränkungen unterliegen. So kann man z.B. nicht schreibend auf irgendwelche Zellen oder Objekte in der Tabelle zugreifen. Wenn man das versucht, kommt immer #WERT raus.

Das „FindNext“ scheint auch so ein Fall zu sein, aber wie gesagt - keine Ahnung, warum. In erster Näherung würde ich behaupten, dass man in Tabellenfunktionen lediglich einfache Berechnungen vornehmen kann, weiter nichts. Dass das „Find“ noch funktioniert, wäre dann schon eine Ausnahme.

Du müsstest mal probieren, statt mit „FindNext“ mehrfach mit „Find“ zu arbeiten. Da Du offenbar nur eine Spalte durchsuchen willst, ist das recht einfach, indem Du den Suchbereich nach und nach oben abschneidest. Vielleicht klappt das ja.

Ansonsten musst Du Dir überlegen, ob für das, was Du vorhast, eine Tabellenfunktion überhaupt sinnvoll ist und diese Variante ggf. streichen.

Kristian

Was ist denn der Unterschied zwischen Tabellen-Fkt. und VBA-Fkt.?

Was ist denn der Unterschied zwischen Tabellen-Fkt. und VBA-Fkt.?

Na das habe ich doch gerade beschrieben.

Eine Tabellenfunktion wird als Formel von einer Zelle aus aufgerufen, wohingegen eine reine VBA-Funktion, wie ich sie genannt habe, nur innerhalb von VBA aufgerufen und genutzt wird.

Kristian

Also wer sich für eine Lösung interessiert: Habe es ohne Find bzw. FindNext gelöst

For Each c In bereich
If Not c.Find(„100“, LookIn:=xlValues) Is Nothing Then

End If
Next

Ehm … na das ist ja nun mit Verlaub auch ein bissl blödsinnig :wink: Dann kannst Du auch gleich folgendes schreiben:

For Each c In bereich
 If c.Value 100 Then do something
Next c

Das „c“ fehlte übrigens hinter dem „Next“.

Kristian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Kristian,

Also wer sich für eine Lösung interessiert: Habe es ohne Find
bzw. FindNext gelöst
For Each c In bereich
If Not c.Find(„100“, LookIn:=xlValues) Is Nothing Then
End If
Next

Ehm … na das ist ja nun mit Verlaub auch ein bissl
blödsinnig :wink: Dann kannst Du auch gleich folgendes
schreiben:

For Each c In bereich
If c.Value 100 Then do something
Next c

Irgendwie habe ich das Gefühl das Nichtfinden liegt am Unterschied zwischen
„100“
und
100

Das „c“ fehlte übrigens hinter dem „Next“.

Naja, Vba braucht das c nicht und einige Leute lassen es gerne weg, aber ich schreibe es nahezu immer hin denn es macht mir den Code leichter lesbar da ich eindeutig weiß auf wen genau sich das Next bezieht, besondern wenn da viele If’s und For vermengt sind.

Gruß
Reinhard

Irgendwie habe ich das Gefühl das Nichtfinden liegt am
Unterschied zwischen „100“ und 100

Das Gefühl habe ich eigentlich nicht. Dachte ich auch als erstes dran, aber spätestens im Beispielfile wurde klar, dass das keine Rolle spielt. Ich gehe davon aus, dass es der besagte Unterschied zwischen Tabellenfunktion und reiner VBA-Funktion ist.

Das „c“ fehlte übrigens hinter dem „Next“.

Naja, Vba braucht das c nicht

Ich dachte mich erinnern zu können, dass der Interpreter immer meckert, wenn man´s nicht schreibt. Im Gegensatz zu VBS, wo man es nicht schreiben DARF.

Kristian

Das „c“ fehlte übrigens hinter dem „Next“.

Naja, Vba braucht das c nicht

Ich dachte mich erinnern zu können, dass der Interpreter immer
meckert, wenn man´s nicht schreibt. Im Gegensatz zu VBS, wo
man es nicht schreiben DARF.

Hallo Kristian,
ich bin sicher man kann es in Vba weglassen. Aber lassen wir das, ist ja ruckzuck ausprobiert.
Danke für die Information zu VBS. Das kenne ich zwar nicht aber das kann sich ja mal ändern und es würde mich sicher Stunden kosten herauszufinden warum da der Debugger, sofern es einen gibt, laufend das c moniert. Darauf dass nur „Next“ ohne Variable erlaubt ist, darauf käme ich irgendwie erstmal überhaupt nicht:frowning:
Gruß
Reinhard

Kristian