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

Moderator: ModerationP

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

Beitragvon theRock » 14. Jun 2018, 13:29

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ß
:)
theRock
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 23
Registriert: 31. Jan 2018, 08:21

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

Beitragvon M. Gottschalk » 14. Jun 2018, 13:38

Hallo,

deine Lösung solltest du so finden
Viele Grüße,
Matthias

-------------------------------------------------------------------------------------------
Man muß nicht alles wissen, man muß nur wissen, wie man die Lösung findet.
Benutzeravatar
M. Gottschalk
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3238
Registriert: 07. Nov 2013, 13:26

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

Beitragvon Ralf A » 14. Jun 2018, 13:51

...FindNext ist hier das passende Stichwort...
Ciao, Ralf
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.

Bild
Ralf A
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 232
Registriert: 17. Mär 2018, 11:47

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

Beitragvon slowboarder » 14. Jun 2018, 13:56

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
slowboarder
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 24948
Registriert: 18. Apr 2009, 13:33

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

Beitragvon Ralf A » 14. Jun 2018, 14:05

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...
Ciao, Ralf
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.

Bild
Ralf A
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 232
Registriert: 17. Mär 2018, 11:47

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

Beitragvon juvee » 14. Jun 2018, 15:25

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
Ich habe "juvee" am 25.01.2018 gegoogelt. Ich distanziere mich von den ungefähr 252 Einträgen ausdrücklich.
Da binich nich dabei, dat is pri ima, vivaaaaa....lalalala!
juvee
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2090
Registriert: 05. Jun 2014, 12:48

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

Beitragvon Flotter Feger Gast » 14. Jun 2018, 16:08

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
Flotter Feger Gast
 

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

Beitragvon slowboarder » 14. Jun 2018, 18:09

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
slowboarder
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 24948
Registriert: 18. Apr 2009, 13:33

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

Beitragvon juvee » 14. Jun 2018, 19:31

@ 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
Ich habe "juvee" am 25.01.2018 gegoogelt. Ich distanziere mich von den ungefähr 252 Einträgen ausdrücklich.
Da binich nich dabei, dat is pri ima, vivaaaaa....lalalala!
juvee
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2090
Registriert: 05. Jun 2014, 12:48

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

Beitragvon TM_ » 14. Jun 2018, 21:51

Hallo,
mal so nebenbei. Wenn ich alle bestimmten Einträge aus einer Spalte brauche, benutze ich einfach den Filter...
Lg. TM
TM_
 

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

Beitragvon slowboarder » 15. Jun 2018, 06:01

Viele Wege führen nach Rom.
slowboarder
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 24948
Registriert: 18. Apr 2009, 13:33

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

Beitragvon 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
Benutzeravatar
RPP63
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 9856
Registriert: 19. Okt 2012, 17:41
Wohnort: mitten im Pott

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

Beitragvon 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 :)
theRock
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 23
Registriert: 31. Jan 2018, 08:21

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

Beitragvon 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
theRock
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 23
Registriert: 31. Jan 2018, 08:21

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

Beitragvon 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
Viele Grüße,
Matthias

-------------------------------------------------------------------------------------------
Man muß nicht alles wissen, man muß nur wissen, wie man die Lösung findet.
Benutzeravatar
M. Gottschalk
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3238
Registriert: 07. Nov 2013, 13:26

Nächste

Zurück zu Excel Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: knobbi38, MisterBurns und 22 Gäste