VBA .find.(...).row funktion - Alle Zeilen/Treffer auslesen?

Antwort erstellen

Smilies
:D :) :( :o :shock: :? 8-) :lol: :x :P :razz: :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: :badgrin: :doubt:
BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet
Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: VBA .find.(...).row funktion - Alle Zeilen/Treffer auslesen?

Re: VBA .find.(...).row funktion - Alle Zeilen/Treffer ausle

Beitrag von snb » 18. Jun 2018, 08:38

Aber fehlende Beispieldatei...

Deswegen keine optimale Lösung.

Re: VBA .find.(...).row funktion - Alle Zeilen auslesen? [Er

Beitrag von theRock » 18. Jun 2018, 07:48

Hey Leute,

besten Danke,
hatte mich am WE nochmal rangewagt nachdem sich die Lage bei mir etwas beruhigt hatte.
erfolgriehc gelöst hatte ich es nun mit der replace. Methode von sloboarder, Den erste Treffer ersetzt, dann an der ersetzten(gefundenen) Zeilennummer mein Code durchlaufen lassen, zweiten treffer ersetzt, falls vorhanden und erneut meinen code durchlaufen lassen etc...
Vielen Dank, wieder eine Menge gelernt :-)
Tolles Forum, tolle User!

Re: VBA .find.(...).row funktion - Alle Zeilen/Treffer ausle

Beitrag von Gast » 16. Jun 2018, 06:28

a) alle FundZellen werden gelöscht oder verändert (so wie im Hilfebeispiel)
dann muss die Abbruchprüfung lauten:

Code: Alles auswählen
Loop While c is Nothing


Loop While Not c is Nothing

Loop Until c is Nothing

Re: VBA .find.(...).row funktion - Alle Zeilen/Treffer ausle

Beitrag von DerHoepp » 15. Jun 2018, 19:41

Moinsen,

noch zum Thema der falschen Onlinehilfe. Die ist zwischenzeitlich ein GitHub projekt. Jeder darf Änderungen vorschlagen und wird dann sogar als conributor geführt.

Viele Grüße
derHöpp

Re: VBA .find.(...).row funktion - Alle Zeilen/Treffer ausle

Beitrag von slowboarder » 15. Jun 2018, 12:45

Hi

wenn man mit dem .FindNext arbeitet, muss man drei Problemfälle unterscheiden:

a) alle FundZellen werden gelöscht oder verändert (so wie im Hilfebeispiel)
dann muss die Abbruchprüfung lauten:
Code: Alles auswählen
Loop While c is Nothing

die Prüfung c.Address <> firsaddress darf nicht erfolgen, weil sie dann einen Fehlerabbruch bewirkt

b) alle FundZellen bleiben unverändert erhalten (die Veränderungen finden in anderen Zellen statt) und es werden keine Zeilen gelöscht
dann muss die Abbruchprüfung lauten:
Code: Alles auswählen
c.Address <> firstaddress

die Prüfung c is Nothing kann man dann in der Schleife weglassen, weil sie nie wahr wird (sie muss nur einmalig vor der Schleife stattfinden, um zu prüfen ob die Schleife überhaupt gestartet werden muss)

schwieriger ist Fall c:
c) die Fundzellen können abhängig von anderen Bedingungen gelöscht oder verändert werden, die können aber auch erhalten bleiben
in diesem Fall braucht man in der Schleife beide Prüfungen:
- alle Fundstellen entfernt (c is Nothing)
- Schleife beginnt wieder von vorne. das Loop while c.Address <> fristaddress ist hierbei aber ungeeignet, denn es könnte ja sein, dass diese Fundstelle gelöscht oder verändert wurde, und dann ist es eine Endlosschleife.
die Prüfung auf c is Nothing muss aber dann zuerst erfolgen, um Fehlerabbrüche zu vermeiden.

Code: Alles auswählen
Sub test()
Dim c As Range
Dim ZeileLetzterFund As Long

With Worksheets(1).Range("A:A")
    Set c = .Find(2, LookIn:=xlValues)
    If Not c Is Nothing Then
        ZeileLetzterFund = c.Row
        Do
            If c.Row Mod 2 = 0 Then c.Value = 5
           
            Set c = .FindNext(c)
        If c Is Nothing Then Exit Do
        If c.Row <= ZeileLetzterFund Then Exit Do
            ZeileLetzterFund = c.Row
        Loop
    End If
End With
End Sub


Gruß Daniel

Re: VBA .find.(...).row funktion - Alle Zeilen/Treffer ausle

Beitrag von theRock » 15. Jun 2018, 09:30

Entschuldigt leute, ich weiß das hier wirklich sehr zu schätzen.
bin nur momentan etwas am struggeln und bei mir ist noch eine (private) Baustelle aufgekommen, deswegen das kurze und wenige Feedback von mir.

so wie RPP63 es sagt ist es richtig, ich benötige die Zeilen um in diesen entsprechend weiterarbeiten zu können. Das war bei einer einmaligen ID ja immer easy über find.(...).row erledigt

Ich dachte die FindNext Schleife kann ich so umauen das ich mir aus der gefunden Addresse die Zeile rausnehme. Schaue mir aber auch die specialcells Methode an!
Wenn ich soweit bin gebe ich mehr Feedback danke euch wirklich sehr!

Mit den zwei Gedankenanstößen habt ihr mir schon sehr geholfen.
Ein konkretes Makro wird schwer da es mittlerweile >500 Zeilen groß ist :)

Re: VBA .find.(...).row funktion - Alle Zeilen/Treffer ausle

Beitrag von RPP63 » 15. Jun 2018, 08:49

Ich hab Dich doch gar nicht persönlich gemeint, Sabina! :wink:
Die Schleife geistert ja bereits seit geraumer Zeit durch diesen Thread.
Mir ging es "nur" darum, den Thread mal wieder in die richtige Richtung zu schubsen.

Gruß Ralf

Re: VBA .find.(...).row funktion - Alle Zeilen/Treffer ausle

Beitrag von Flotter Feger Gast » 15. Jun 2018, 08:43

Hallo Ralf,

ich weiß das ... wollte nur höflich sein und auf seine Frage antworten ... nicht, dass mir wieder unterstellt wird, ich wäre Arrogant und würde nicht mal auf einfachste Probleme vernünftig antworte.

Ist manchmal schon ein starkes Stück, was man sich hier bieten läßt ... ja ich weiß ... selbst schuld ... ich muss hier nicht mitmachen ...

Sabina

Re: VBA .find.(...).row funktion - Alle Zeilen/Treffer ausle

Beitrag von RPP63 » 15. Jun 2018, 08:17

Was hat das denn jetzt noch mit der Threaderöffnung zu tun?
Zur konkreten Find-FindNext-Schleife, die hier seit geraumer Zeit benutzt wird:
Sowas macht man schneller und einfacher mit der Range.Replace-Methode (siehe auch meinen verlinkten Thread)!
Anyway sucht der TE doch die einzelnen Zeilen(!), in denen die ID gefunden wird, um in den Zeilen in manchen Spalten etwas zu ändern.

Dafür hat er bereits zwei Vorschläge mit SpecialCells (Wahrheitswert oder sichtbar bei Filter).

Vielleicht bekommen wir ja mal konkret gesagt, was das Makro machen soll …

Gruß Ralf

Re: VBA .find.(...).row funktion - Alle Zeilen/Treffer ausle

Beitrag von Flotter Feger Gast » 15. Jun 2018, 08:06

Hallo,

wenn jeder Fund mit anderen Werten überschrieben werden soll, dann muss doch Schluss sein, wenn der Wert nict mehr gefunden wird ... na dann doch einfach so ...
Ist aber tatsächlich nicht der Sinn an Range.Find ... aber gut.
Code: Alles auswählen
Sub test()
Dim c As Range
Dim firstaddress As String

With Worksheets(1).Range("A:A")
    Set c = .Find(2, LookIn:=xlValues)
    If Not c Is Nothing Then
        firstaddress = c.Address
        Do
            c.Value = 5
            Set c = .FindNext(c)
        Loop While Not c Is Nothing
    End If
End With
End Sub

Sabina

Re: VBA .find.(...).row funktion - Alle Zeilen/Treffer ausle

Beitrag von M. Gottschalk » 15. Jun 2018, 07:59

Hallo,

da du den Wert nachdem du suchst, ersetzt, kann er die erste Zelle nicht mehr finden. Insofern must du deine Bedingung für das Ende der Schleife wie folgt abändern:
Code: Alles auswählen
Loop Until c Is Nothing

Re: VBA .find.(...).row funktion - Alle Zeilen/Treffer ausle

Beitrag von theRock » 15. Jun 2018, 07:57

hmm so will er auch nicht, jemand noch einen Tipp?

Code: Alles auswählen
Sub test()
Dim c As Range
Dim firstaddress As String

With Worksheets(1).Range("A:A")
    Set c = .Find(2, LookIn:=xlValues)
    If Not c Is Nothing Then
        firstaddress = c.Address
        Do
            c.Value = 5
            Set c = .FindNext(c)
        Loop While c.Address <> firstaddress
    End If
End With
End Sub

Re: VBA .find.(...).row funktion - Alle Zeilen/Treffer ausle

Beitrag von theRock » 15. Jun 2018, 07:47

Zuersteinmal danke für die superschnelle und massive Ressonanz hier. Wow.
bin gestern leider nicht mehr dazu bekommen hier vorbei zu schauen.

Ralf A hat geschrieben:
auch mal den Fall dsa eine ID in zwei oder drei zeilen zu finden ist.


...das sollte natürlich Anlass sein, mal über die Datenstruktur nachzudenken. ID's heißen nicht umsonst ID. Ausnahme, es handelt sich um Sekundärschlüssel...


Ja da hast du Recht, jedoch ist es in der Tmplate Datei auch so das es keine Doppelten ID's gibt. aus dem template baut sich ein neues Dokument auf, da können auch mal 2 Doppelte Abschnitte dabei sein, sprich 2 x die selbe ID, jetzt etwas zu komplex das alles zu erklären. Aber im Grunde hast du Recht, ja :)

Ralf A hat geschrieben:...FindNext ist hier das passende Stichwort...


Danke werde ich mir anschauen :)

slowboarder hat geschrieben:Hi

wenn die 1000 als fix-wert so in der Zelle steht, kannst du auch so vorgehen:
du ersetzt die 1000 durch den Wahrheitswert WAHR (dieser dürfte ja in den IDs regulär nicht vorkommen)
über die .SpecialCells kannst du dann ohne großen aufwand gezielt die Zellen mit Wahrheitswert abfragen
am schluss setzt du dann wieder die ursprüngliche ID für den Wahrheitswert ein.
Code: Alles auswählen
dim Zelle as range
with beispiel.Range("IDs")
        if worksheetfunction.CountIf(.cells, 1000) > 0 Then
            .Replace 1000, True, xlwhole
            for each Zelle in .SpecialCells(xlcelltypeconstants, 4)
                 --- hier dann der Code zum Bearbeiten
                 --- Zelle ist eine Zelle in der Zeile, die die ID enthält
             Next
             .Replace true, 1000
         end if
end with


gruß Daniel


sieht nach einem Iinteressanten workaround aus danke :)
juvee hat geschrieben:Hi,

die allseits unbeliebte Onlinehilfe spuckt dieses schöne Beispiel aus

In diesem Beispiel werden alle Zellen im Bereich A1:A500 des ersten Arbeitsblatts gefunden, die den Wert 2 enthalten, und ändert diesen Wert in 5.

Code: Alles auswählen
With Worksheets(1).Range("a1:a500")
    Set c = .Find(2, lookin:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            c.Value = 5
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With



Warum in die Ferne schweifen, wenn das gute nur einen Tastenklick auf F1 entfernt ist?

VG Juvee


Gefällt mir an sich gut, soll ja aber ein Fehler drin sein laut den Restkommentaren :D

@All danke für die Hilfe und sorry für die späte Rückmeldung hier :)

Re: VBA .find.(...).row funktion - Alle Zeilen/Treffer ausle

Beitrag von RPP63 » 15. Jun 2018, 06:25

Moin!
Bezüglich der VBA-Hilfe schaut euch mal diesen Thread an,
der übrigens auch gut zu diesem Thema passt:
https://www.ms-office-forum.net/forum/s ... =begnadete
(ab #6 wird es interessant)

Daniels Code mit den Wahrheitswerten empfinde ich als sehr interessante Alternative.
Wobei man mal überprüfen müsste, ob der Autofilter und nachfolgende Schleife über die SpecialCells(xlCellTypeVisible) nicht schneller ist.
(dürfte sich aber wohl nichts nehmen)

Gruß Ralf

Re: VBA .find.(...).row funktion - Alle Zeilen/Treffer ausle

Beitrag von slowboarder » 15. Jun 2018, 06:01

Viele Wege führen nach Rom.

Nach oben