Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1340to1344
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Suchen in Schleife

Suchen in Schleife
17.12.2013 19:52:34
Albert
Hallo zusammen,
ich hab zwar gegoogelt, dennoch hab ich das Gefühl, nicht die richtigen Stichworte gewählt zu haben.
Nun versuch ich es hier, mein Problem zu beschreiben.
Also....
Ich verwende nachfolgende Schleife, um Commandbutton zu beschriften.
Private Sub CommandButton608_Click()
Dim I As Long
'Erster Tag
For I = 100 To 600 Step 100
Controls("CommandButton" & I).Caption = "Mustermann, Max"
Next I
'Zweiter Tag
For I = 101 To 601 Step 100
Controls("CommandButton" & I).Caption = "Dorfmeier, Hans"
Next I
'Dritter Tag
For I = 102 To 602 Step 100
Controls("CommandButton" & I).Caption = "Petersen, Peter"
Next I
'Vierter Tag
For I = 103 To 603 Step 100
Controls("CommandButton" & I).Caption = "Hansen, Hans"
Next I
'Fünfter Tag
For I = 104 To 604 Step 100
Controls("CommandButton" & I).Caption = "Tomsen, Tom"
Next I
'Sechster Tag
For I = 105 To 605 Step 100
Controls("CommandButton" & I).Caption = "Bertsen, Bert"
Next I
'Siebter Tag
For I = 106 To 606 Step 100
Controls("CommandButton" & I).Caption = "Andresen, Andreas"
Next I
End Sub
Nun bin ich auf der Suche nach einer Suchroutine, die
a. mit drei Suchbegriffen zurechtkommt,
b. die Tabelle nur einmal von oben nach unten durchläuft und
c. keine doppelten Werte benennt.
Die Suche soll die Stelle mit den "Nachnamen, Vornamen" ersetzen.
Wär euch echt dankbar.
Gruß
A.

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Suchen klappt, nächster Treffer wird nicht gewählt
17.12.2013 22:11:28
Albert
Hallo zusammen,
das Suchen denke ich klappt soweit, aber die Suchfunktion nimmt den nächsten Treffer nicht auf, sondern nur den ersten.
Wie erkenne ich den Fehler? Habt ihr eine Idee?
Sub suche()
'Erster Tag
For I = 100 To 600 Step 100
With Sheets("Regelschichtplan")
Set rngDatum = .UsedRange.Find(what:=CDate(Wochenplan2.Label100.Caption),  _
LookIn:=xlFormulas, lookat:=xlWhole, SearchOrder:=xlByRows)
If Not rngDatum Is Nothing Then
Set rngName = .Range("D6:D" & Range("D2000").End(xlUp).Row).Find(what:= _
Wochenplan2.Kunde.Value, LookIn:=xlFormulas, lookat:=xlWhole, SearchOrder:=xlByRows)
If Not rngName Is Nothing Then
If Cells(rngName.Row, rngDatum.Column).Value = Left(Wochenplan2. _
Schichtgruppe.Value, 1) Then
Controls("CommandButton" & I).Caption = Cells(rngAbteilung.Row,  _
1).Value
End If
End If
End If
End With
Next I
End Sub
Danke und Gruß
A.

Anzeige
Excel schießt sich auf eine absolute Zelle ein
17.12.2013 23:01:34
Albert
Hi...
Weiß niemand weiter?
Jetzt hab ich mal ne Msgbox eingebaut und rausbekommen, dass sich Excel bei der Suche auf die absolute Zelle MQ8 einschießt.
Wo liegt mein Fehler?
Sub test ()
'Erster Tag
For I = 100 To 600 Step 100
With Sheets("Regelschichtplan")
Set rngDatum = .UsedRange.Find(what:=CDate(Wochenplan2.Label100.Caption),  _
LookIn:=xlFormulas, lookat:=xlWhole, SearchOrder:=xlByRows)
If Not rngDatum Is Nothing Then
Set rngName = .UsedRange.Find(what:=Wochenplan2.Kunde.Value, LookIn:= _
xlFormulas, lookat:=xlWhole, SearchDirection:=xlNext, SearchOrder:=xlByRows)
If Not rngName Is Nothing Then
MsgBox Cells(rngName.Row, rngDatum.Column).Value
MsgBox Cells(rngName.Row, rngDatum.Column).Address
'                                If Cells(rngName.Row, rngDatum.Column).Value = Left( _
Wochenplan2.Schichtgruppe.Value, 1) Then
'                                   Controls("CommandButton" & I).Caption = Cells(rngName.Row,  _
1).Value
'                                End If
End If
End If
End With
If Controls("CommandButton" & I).Caption  "" Then
Controls("CommandButton" & I).Enabled = True
Else
Controls("CommandButton" & I).Enabled = False
End If
Next I
End Sub

Danke schon mal im Voraus...
A.

Anzeige
Excel schießt gar nicht
18.12.2013 02:06:31
Erich
Hi Albert,
VBA tut hier genau das, was dein Code vorschreibt.
Warum sollte das Ergebnis der Find-Methode beim zweiten Durchlauf in der For-Schleife ein anderes sein?
Wenn dem so wäre, würde ich mich bei Microsoft beschweren!
Da wird ein Code mehrfach durchlaufen, und jedesmal soll ein neues Resultat erscheinen?
Find weiß nicht mal, dass es in einer Schleife aufgerufen wird.
Für das, was du erreichen möchtest, gibt es die Methode FindNext. In der Hilfe zu dieser Methode
findest du auch ein Beispiel.
Leider wird darin etwas wichtiges vergessen, das is der Hilfe zu Find steht:
"Die Angaben für LookIn, LookAt, SearchOrder und MatchByte werden jedesmal gespeichert,
wenn Sie diese Methode verwenden. Falls Sie beim nächsten Aufruf dieser Methode
keine Werte für die Argumente angeben, werden die gespeicherten Werte verwendet.
Die Angabe dieser Argumente ändert die Einstellungen im Dialogfeld Suchen,
und eine Änderung der Einstellungen im Dialogfeld Suchen ändert die gespeicherten Werte,
die verwendet werden, wenn Sie die Argumente nicht angeben. Um Probleme zu vermeiden,
sollten Sie bei jeder Verwendung dieser Methode diese Argumente ausdrücklich angeben."
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Excel schießt gar nicht
18.12.2013 16:47:35
Albert
Hallo Erich,
erstmal herzlichsten Dank für deine Antwort und den notwendigen Hinweis.
Ich hab deine Tipps befolgt und die Suchparameter mit eingefügt.
Der Code sieht nun so aus. ABER... er bleibt bei findnext stehen und sagt, UNBENANNTES ARGUMENT NICHT GEFUNDEN... was auch immer das heißt.
Sub test
'Erster Tag
For I = 100 To 600 Step 100
With Sheets("Regelschichtplan")
Set rngDatum = Sheets("Regelschichtplan").UsedRange.Find(what:=CDate( _
Wochenplan2.Label100.Caption), LookIn:=xlFormulas, lookat:=xlWhole, SearchDirection:=xlNext, SearchOrder:=xlByRows)
If Not rngDatum Is Nothing Then
Set rngName = Sheets("Regelschichtplan").Range("D6:D200").Find(what:= _
Wochenplan2.Kunde.Value, LookIn:=xlFormulas, lookat:=xlWhole, SearchDirection:=xlNext, SearchOrder:=xlByRows)
If Not rngName Is Nothing Then
firstAddress = rngName.Address
Do
If Cells(rngName.Row, rngName.Column).Value = Left( _
Wochenplan2.Schichtgruppe.Value, 1) Then
Controls("CommandButton" & I).Caption = "Hauser, Albert"  _
'Cells(rngName.Row, 1).Value
End If
Set rngName = Sheets("Regelschichtplan").Range("D6:D200"). _
FindNext(what:=Wochenplan2.Kunde.Value, LookIn:=xlFormulas, lookat:=xlWhole, SearchDirection:=xlNext, SearchOrder:=xlByRows)
Loop While rngName Is Nothing And rngName.Address   _
firstAddress
End If
End If
End With
If Controls("CommandButton" & I).Caption  "" Then
Controls("CommandButton" & I).Enabled = False
Else
Controls("CommandButton" & I).Enabled = True
End If
Next I
Set rngName = Nothing
Set rngDatum = Nothing
End Sub
Wär dir um weitere Hilfe echt dankbar.
Gruß
A.

Anzeige
FindNext-Parameter u.a.
18.12.2013 17:44:49
Erich
Hi Albert,
da gab es jetzt wohl ein Missverständnis: Der längere Text, den ich aus der Hilfe zu Find zititert habe,
bezieht sich tatsächlich genau auf die Methode Find, nicht jedoch auf FindNext.
Letztere hat nur einen einzigen Parameter: After:=...
Schau dir die Hilfe zu FindNext und das dortige Beispiel noch mal an.
Dein Code ist so für mich natürlich nicht testbar, weil ich dazu die entsprechende Umgebung bräuchte.
Ich weiß nicht einmal, ob sich die vielen Controls in einem Tabellenblatt oder einer UserForm
befinden. (Wegen "Wochenplan2.Label100.Caption" ist es eine UF, oder?)
Ich weiß auch nicht genau, wonach und in welchen Daten du suchst.
CDate weist darauf hin, dass es Datumse sind, manchmal muss man aber nach CLng oder CDbl suchen lassen.
Noch ein paar Bemerkungen zu deinem Code:
Für notwendig halte ich die Verwendung von Option Explicit als oberste Zeile jedes Moduls.
"With Sheets("Regelschichtplan")" ist gut, du solltest das With dann aber auch benutzen.
Ich habe noch ein "With .Range("D6:D200")" reingeschriebhen, da das zweifach gebraucht wird.
Nur so, zum Verständnis: "SearchOrder:=xlByRows)" sollte man beim Find eigentlich immer angeben.
Beim Find in Range("D6:D200") ist es aber überflüssig, da ja ohnehin nur in einer einzigen Spalte gesucht wird.
Und schon kann man es doch wieder weglassen (muss aber nicht).
So wie du deinen Code einrückst, ist das für mich eher unübersichtlich.
So habe ich ihn mal etwas umgestaltet:

Option Explicit            ' immer zu empfehlen
Sub nicht_test2()
With Sheets("Regelschichtplan")
For I = 100 To 600 Step 100
Set rngDatum = .UsedRange.Find(what:=CDate(Wochenplan2.Label100.Caption), _
LookIn:=xlFormulas, lookat:=xlWhole, SearchOrder:=xlByRows)
If Not rngDatum Is Nothing Then
With .Range("D6:D200")
Set rngName = .Find(what:=Wochenplan2.Kunde.Value, _
LookIn:=xlFormulas, lookat:=xlWhole)
If Not rngName Is Nothing Then
firstAddr = rngName.Address
Do
If Cells(rngName.Row, rngName.Column).Value = _
Left(Wochenplan2.Schichtgruppe.Value, 1) Then
'Cells(rngName.Row, 1).Value
Controls("CommandButton" & I).Caption = "Hauser, Albert"
End If
Set rngName = .FindNext(After:=rngName)
Loop While rngName Is Nothing And rngName.Address  firstAddr
End If
End With
End If
Controls("CommandButton" & I).Enabled = _
(Controls("CommandButton" & I).Caption = "") ' kann True oder False sein
Next I
End With
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: FindNext-Parameter u.a.
18.12.2013 21:20:35
Albert
Hi Erich,
also...
Ich weiß nicht warum, aber vor ner Stunde hat es nicht geklappt.
Nun sitz ich wieder davor und das Makro läuft durch.
ABER, es findet nur eine Adresse, somit nur einen Namen.
Wo könnte es denn noch klemmen? Übrigens, ich habe deinen Code verwendet.
Gruß
A.

Nachtrag
18.12.2013 21:29:14
Albert
Ergebnisse werden in die Button nur eingetragen, wenn man sich im Sheet Regelschichtplan befindet!!!!

AW: 2. Nachtrag
18.12.2013 22:40:40
Albert
Hi Erich,
ich hab noch einen...
Bin die Schritte nochmal und nochmal mit F8 durchgegangen.
Dann kam mir der Blitz, dass die For-Schleife mit dem 100er Schritt nur sechs Durchläufe macht.
Das ist zu wenig. Also hab ich die Schleife mal auf 1000 aufgemacht und die Schrittweite bei 1 belassen.
Die Schleife für die CommandButton kommt jetzt etwas später.
Dennoch findet der Code nur eine Stelle und somit auch nur einen Namen. Shit....
Sub test()
With Sheets("Regelschichtplan")
Set rngDatum = .UsedRange.Find(what:=CDate(Wochenplan2.Label100.Caption), _
LookIn:=xlFormulas, lookat:=xlWhole, SearchOrder:=xlByRows)
For I = 0 To 1000 '100 To 600 Step 100
If Not rngDatum Is Nothing Then
With .Range("D6:D200")
Set rngName = .Find(what:=Wochenplan2.Kunde.Value, LookIn:=xlFormulas, lookat:= _
xlWhole)
If Not rngName Is Nothing Then
firstAddr = rngName.Row
Do
If Sheets("Regelschichtplan").Cells(rngName.Row, rngDatum.Column - 10).Value  _
= Left(Wochenplan2.Schichtgruppe.Value, 1) Then
Debug.Print Sheets("Regelschichtplan").Cells(rngName.Row, 1).Value
For n = 100 To 600 Step 100
Controls("CommandButton" & n).Caption = Sheets("Regelschichtplan"). _
Cells(rngName.Row, 1).Value
Next n
End If
Set rngName = .FindNext(After:=rngName)
'Debug.Print Sheets("Regelschichtplan").Cells(rngName.Row, 1).Value ' _
Controls("CommandButton" & I).Caption = Sheets("Regelschichtplan").Cells(rngName.Row, 1).Value
Loop While rngName Is Nothing And rngName.Row  firstAddr
End If
End With
End If
End Sub
Gruß
A.

Anzeige
Beispielmappe nötig
19.12.2013 01:38:11
Erich
Hi Albert,
oben schrieb ich schon mal:
"Dein Code ist so für mich natürlich nicht testbar, weil ich dazu die entsprechende Umgebung bräuchte.
Ich weiß nicht einmal, ob sich die vielen Controls in einem Tabellenblatt oder einer UserForm
befinden. (Wegen "Wochenplan2.Label100.Caption" ist es eine UF, oder?)
Ich weiß auch nicht genau, wonach und in welchen Daten du suchst."
Natürlich hängt es auch von deinen Daten ab, was wo wie oft gefunden werden kann.
Wie sollte ich ohne Kenntnis der Daten und der Programmumgebung (UserForm?)
etwas Sinnvolles dazu schreiben können?
Wie soll ich wissen, ob es angeraten ist, statt 6 nun 100 oder 1000 mal zu suchen?
Bitte lad mal eine Beispielmappe hoch. Ach ja: Es wäre schön, wenn da Option Explicit" drin stünde...
Am Zeilen-Einrücken und dem Zeilenumbruch, damit die Codezeilen nicht zu lang werden,
könntest du auch noch arbeiten. Ich kann nur sagen: Das lohnt sichz auf Dauer!
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Beispielmappe nötig
19.12.2013 10:30:07
Albert
Moin Erich,
ich hab die Datei zum Upload vorbereitet, aber sie hat noch immer über 1Mb und das ist immer noch zu viel.
Wie kann ich dir sonst die Datei weiterleiten?
Gruß
A.

warum so groß?
19.12.2013 10:47:28
Erich
Hi Albert,
ja, das sehe ich auch so: 1Mb ist sicher zu viel für eine Beispielmappe.
Warumj ist die Mappe überhaupt so groß? Sind da zigtausend Datensätze drin? Oder hunderte Tabellenblätter?
Da lässt sich doch sicher einiges reduzieren. 20 oder 30 Datensätze pro Monat
und 3 oder 4 Monate reichen doch sicher für die Darstellung des Problems aus.
Oft ist auch viel Ballast in Beispielmappen drin, der mit dem aktuellen Problem überhaupt nichts zu tun hat.
Wenn du deine Mappe verkleinert hochlädst, hat das auch den Vorteil, dass alle Antworter sie hier sehen können.
Das verbessert deine Chance auf eine Lösung. :-)
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
Zwischenmeldung - offen
20.12.2013 13:28:46
Erich
Hi Albert,
an deinem Code bin ich dran. Es wird aber etwas dauern, denn da ist schon mehr zu tun.
Ich lasse den Thread offen - vielleicht schaut ja noch jemand rein.
Ich melde mich - Grüße aus Kamp-Lintfort von Erich

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige