Seite 1 von 2

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

BeitragVerfasst: 14. Jun 2018, 13:29
von theRock
Hallo zusammen
ich habe da schon wieder eine Frage.
In meinem Code suche ich folgendermaßen nach der Passenden zeile, in der auch Änderungen durchgeführt werden sollen. In diesem Beispiel z.B einfach nach der Zeile in der die ID "1000" zu finden ist.

Set beispiel = Sheets("Data")
hit = beispiel.Range("IDs").Find(What:="1000", LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).row

daraufhin bekomme ich die nötige Zeile mit der ich weiter Arbeiten kann, soweit so gut. Ich habe jedoch, leider nicht anders machbar, auch mal den Fall dsa eine ID in zwei oder drei zeilen zu finden ist.

Woraufhin ich dann auch gerne in allen 3 zeilen eine Änderung durchführen würde. Ich müsste zunächst herausfinden wieviel Treffer/in wie vielen Zeilen die ID1000 steck. Sind dann es mehr als >1 dann müsste eine Art Schleife aufgebaut werden. Zunächst läuft der Rest des Codes mit Treffer 1 ab, anschließend mit Treffer 2, etc...

Jemand eine Idee wie man soetwas umsetzten kann?

Gruß
:)

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

BeitragVerfasst: 14. Jun 2018, 13:38
von M. Gottschalk
Hallo,

deine Lösung solltest du so finden

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

BeitragVerfasst: 14. Jun 2018, 13:51
von Ralf A
...FindNext ist hier das passende Stichwort...

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

BeitragVerfasst: 14. Jun 2018, 13:56
von slowboarder
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

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

BeitragVerfasst: 14. Jun 2018, 14:05
von Ralf A
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...

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

BeitragVerfasst: 14. Jun 2018, 15:25
von juvee
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

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

BeitragVerfasst: 14. Jun 2018, 16:08
von Flotter Feger Gast
Warum in die Ferne schweifen, wenn das gute nur einen Tastenklick auf F1 entfernt ist?

Das frag ich mich in diesem Forum fast nur noch ... :|

@theRock:
könntest auch mal Feedback geben in deinen anderen Threads

Sabina

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

BeitragVerfasst: 14. Jun 2018, 18:09
von slowboarder
juvee hat geschrieben:Warum in die Ferne schweifen, wenn das gute nur einen Tastenklick auf F1 entfernt ist?
VG Juvee


naja, was immer du unter gut verstehst.
Der Beispielcode enthält einen Programmierfehler und bricht mit einer Fehlermeldung ab.
So was sollte in einem Hilfebeispiel nicht vorkommen.

Gruß Daniel

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

BeitragVerfasst: 14. Jun 2018, 19:31
von juvee
@ Daniel,

du hast natürlich recht mit deiner Kritik. Etliche Beispiele der Online-Hilfe sind wenig bis gar nicht hilfreich.

Und leider habe ich einfach das Beispiel nur kopiert, weder gedanklich durchdrungen noch getestet, weil es mir auf den Hinweise auf findnext in einer do while Schleife ankam.

Microsoft sollte sich schämen!

VG Juvee

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

BeitragVerfasst: 14. Jun 2018, 21:51
von TM_
Hallo,
mal so nebenbei. Wenn ich alle bestimmten Einträge aus einer Spalte brauche, benutze ich einfach den Filter...
Lg. TM

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

BeitragVerfasst: 15. Jun 2018, 06:01
von slowboarder
Viele Wege führen nach Rom.

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

BeitragVerfasst: 15. Jun 2018, 06:25
von RPP63
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

BeitragVerfasst: 15. Jun 2018, 07:47
von theRock
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

BeitragVerfasst: 15. Jun 2018, 07:57
von theRock
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

BeitragVerfasst: 15. Jun 2018, 07:59
von M. Gottschalk
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