Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
532to536
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
532to536
532to536
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

VB Suchen zu langsam, und nu?

VB Suchen zu langsam, und nu?
15.12.2004 11:15:19
Korl
Hallo,
ich habe mir eine Datenbank, bestehend aus den Spalten PLZ, Ort, Straße und Personen-Nr. erstellt mit einem eigenen Suchen-Button.
Dieser hat auch auf der kleinen Ebene (ca. 1000 Zeilen) gut seinen Zweck erfüllt. Nun hat sich diese Datenbank aber auf 21.000 Zeilen erhöht.
Jetzt habe ich zwei Probleme:
1. Das Suchen dauert entschieden zu lange, und
2. suche ich nach einer Straße, brauche ich zu lange um den passenden Ort zu finden.
Die in Excel integrierte Funktion "Suchen" läuft schneller.
Meine Frage:
1. Als einfachste Lösung wäre vielleicht die in Excel integrierte Funktion "Suchen" auf meinen eigenen Button legen zu können? Aber wie? Hier bleibt aber mein Problem Nr. 2.
2. Vielleicht suchen lassen nach Abfrage in Orte und die Anzeige wie Autofilter gestalten, bzw. und Suchen nach Straße und die jeweiligen Orte sortiert alphabetisch, anzeigen lassen, ebenfalls nach dem Muster Autofilter.
3. Oder hätte jemand noch eine bessere Idee?
Dies ist mein vorhandener Code fürs "Suchen"

Sub Auswahl()
Dim rng As Range
Dim sBegriff As String, sAdress As String, sFrage As String
sBegriff = InputBox( _
prompt:="Bitte Suchbegriff eingeben:", _
Default:="Hallo")
If sBegriff = "" Then Exit Sub
Set rng = Cells.Find( _
What:=sBegriff, _
Lookat:=xlWhole, _
LookIn:=xlValues, _
MatchCase:=False, _
After:=Range("IV65536"))
If rng Is Nothing Then
Beep
MsgBox "Suchbegriff nicht gefunden!", , _
Application.UserName
Exit Sub
End If
sAdress = rng.Address
rng.Select
' Application.Goto rng, True
sFrage = MsgBox("Fundstelle:" & Space(25) & vbLf & vbLf & _
vbTab & rng.Address(False, False) & vbLf & vbLf & _
"Weitersuchen?", vbYesNo, "Fundstelle")
If sFrage = vbNo Then
Exit Sub
End If
Do
Set rng = Cells.FindNext(After:=rng)
If rng.Address = sAdress Then Exit Sub
rng.Select
' Application.Goto rng, True
sFrage = MsgBox("Fundstelle:" & Space(25) & vbLf & vbLf & _
vbTab & rng.Address(False, False) & vbLf & vbLf & _
"Weitersuchen?", vbYesNo, "Fundstelle")
If sFrage = vbNo Then
Exit Sub
End If
Loop
End Sub

Es wäre schön, wenn mir jemand helfen könnte. Danke schon mal im voraus.
Gruß Korl

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VB Suchen zu langsam, und nu?
Luschi
Hallo Korl,
mit dem .Cells.Find ... wird in allen Zellen der Tabelle gesucht, egal ob nach dem Straßennamen, dem Ort oder der PLZ. Hier solltest Du ein Formular erstellen, wo der User festlegen muuuß, in welcher Spalte der Tabelle (Straße, Ort oder Plz) er suchen will, und diese Festlegungen dann dem Cells-Bereich übergeben.
Excel ist zwar in C++ programmiert und deshalb ist der allgemeine Find-Befehl super-Gut, aber Vba ist eine Interpreter-Sprache und muß erst in den Machinen-Code des Prozessors übersetzt werden, und das Zeile für Zeile.
Gruß von Luschi
aus klein-Paris
AW: VB Suchen zu langsam, und nu?
RR
Damit müsste es schneller gehen:

Sub Auswahl()
XY = InputBox("Was wird gesucht?")
suche:
Selection.Find(What:=XY, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False).Activate
If MsgBox("Weitersuchen?", vbYesNo) = vbYes Then GoTo suche:
End Sub

Anzeige
AW: VB Suchen zu langsam, und nu?
15.12.2004 14:09:46
Korl
Hallo Luschi,
vielen Dank für Deinen Tipp, aber VB und ich verstehen uns noch nicht so gut, dass ich selbst ein Textformular in den Code einbinden könnte. Man soll ja nie, nie sagen, vielleicht pack ich es noch in meinem Alter. ;-)
Hallo RR,
Danke für Deinen geschriebenen Code. Er bleibt aber hier hängen.
Selection.Find(What:=XY, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False).Activate
Habe aber herausgefunden, das wenn ich eine Spalte oder auch alle 4 Spalten markiere, sucht und findet er sehr schnell den gewünschten Eintrag.
Wie lässt sich Dein Code dahingehend noch aktualisieren?
Mein anderes Problem bleibt aber noch. Suche ich eine Straße, muß ich mit unter 10 mal klicken, bis ich den passenden Ort ausfindig gemacht habe.
Könntest Du hier auch helfen?
Gruß Korl
Anzeige
AW: VB Suchen zu langsam, und nu?
RR
Wobei bleibt er hängen? Bei markierten Spalten müsste es eigentlich klappen. Habe leider keine Datei wo ich alle Varianten testen könnte.
AW: VB Suchen zu langsam, und nu?
RR
ST = InputBox("Straße:")
ORT = InputBox("Ort:")
suche:
Selection.Find(What:=ST, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False).Activate
If Cells(ActiveCell.Row, ActiveCell.Column + 1) ORT Then GoTo suche:
If MsgBox("Weitersuchen?", vbYesNo) = vbYes Then GoTo suche:
Nachtrag
RR
Voraussetzung ist, dass der Ort in der Spalte rechts der Straße steht. Sollte der Ort in einer anderen Spalte stehen, muss aber nur statt + 1 ein anderer Wert eingesetzt werden. Bsp: Straße in A, Ort in D entspicht + 3
Anzeige
AW: läuft noch nicht
15.12.2004 18:12:54
Korl
Hallo RR,
Danke für Deine schnelle Reaktion, aber es läuft noch nicht richtig.
"Laufzeitfehler 91: Objektvariable oder With-Blockvariable nicht festgelegt."
Meine Datenbank ist wie folgt angeordnet:
Spalte A= PLZ
Spalte B= Ort
Spalte C= Straße
Spalte D= Nr.
Ich habe auch Deinen Nachtrag berücksichtigt. Die Spalten wurden nach obigen Code angeordnet bzw habe "-1" eingestellt.
Gruß Korl
Neuer Versuch
RR
Hallo,
die Fehlermeldungen tauchen auf, wenn excel die Straße nicht findet. Habe den Code jetzt entsprechend geändert. Es wird jetzt der Bereich C1 bis C21000 nach der Straße durchsucht.

Sub Suche_in_2_Spalten()
On Error GoTo ende:
ST = InputBox("Straße:")
ORT = InputBox("Ort:")
range("C1:C21000").Select
suche:
Selection.Find(What:=ST, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False).Activate
If ActiveCell.Row = 21000 Then GoTo ende:
If Cells(ActiveCell.Row, ActiveCell.Column - 1) <> ORT Then GoTo suche:
If MsgBox("Weitersuchen?", vbYesNo) = vbYes Then GoTo suche:
ende:
MsgBox ("Ende der Suche!")
End Sub

Anzeige
AW: Neuer Versuch
16.12.2004 10:25:01
Korl
Hallo RR,
jetzt ist es so, dass der Code die Spalte "C" (Straße)markiert und darin sucht und sucht, es hört nicht auf. Mußte mit ESC abbrechen.
RR, bitte eine Zwischenfrage von mir. Habe ich die Möglichkeit auch Orte separat suchen zu können? Wenn ich nun die Möglichkeit habe über 2 Spalten suchen zu können, wäre es nicht besser über "Ort" zu beginnen und dann die "Straße"? Orte werden häufiger gesucht als Straßen. Straßen sind nur in größeren Städte notwendig.
Entschuldige bitte, dass ich Dich weiter bemühe.
Gruß Korl
AW: Neuer Versuch
16.12.2004 10:56:09
Korl
Hallo RR,
ich habe mal Deinen Code umgestellt, dass ich die Suche mit "Ort" beginnen kann.

Sub Suche_in_2_Spalten()
On Error GoTo ende:
ORT = InputBox("Ort:")
ST = InputBox("Straße:")
Range("B1:B21000").Select
suche:
Selection.Find(What:=ORT, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False).Activate
If ActiveCell.Row = 21000 Then GoTo ende:
If Cells(ActiveCell.Row, ActiveCell.Column + 1) <> ST Then GoTo suche:
If MsgBox("Weitersuchen?", vbYesNo) = vbYes Then GoTo suche:
ende:
'MsgBox ("Ende der Suche!")
End Sub

Hier habe ich feststellen können, wenn ich einen Ort eingebe den es mindestens 10 mal in der Spalte gibt, läuft der Code sich tod.
z.B.: ich suche als Ort "Hagenow" ohne Straßeneingabe, läuft er hoch und runter bei den ca. 15 mal Hagenow und bleibt dann bei "Hagenow-Granzin" das erste mal stehen.
Hilft Dir diese Info eventuell weiter?
Gruß Korl
Anzeige
Und täglich grüßt....
RR
Hier jetzt die nächste Variante:
Es wird erst der Ort abgefragt, danach die Straße. Wird bei der Abfrage der Straße nichts eingegeben, sucht er nur den Ort.

Sub Suche_in_2_Spalten()
On Error GoTo ende:
ORT = InputBox("Ort:")
ST = InputBox("Straße:")
range("b1:b21000").Select
Suche:
Selection.Find(What:=ORT, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False).Activate
If ActiveCell.Row = 21000 Then GoTo ende:
If ST = "" Then GoTo NoStreet:
If Cells(ActiveCell.Row, ActiveCell.Column + 1) <> ST Then GoTo Suche:
NoStreet:
If MsgBox("Weitersuchen?", vbYesNo) = vbYes Then GoTo Suche:
ende:
MsgBox ("Ende der Suche!")
End Sub

Anzeige
AW: Und täglich grüßt....
16.12.2004 12:09:22
Korl
Hallo RR,
er findet den Ort,da es davon 12 Stück gibt, läuft der Cursor hier immerzu auf und ab und hält nicht an. Ich beende dieses Spiel mit EsC und der Code bleibt stehen an dieser Stelle:
If ActiveCell.Row = 21000 Then GoTo ende:
Kannst Du was mit meiner Schilderung etwas anfangen?
Gruß Korl
AW: Und täglich grüßt....
16.12.2004 12:18:44
Korl
Hallo RR,
suche ich einen Ort von dem ich weiß es gibt nur diesen einen Ort in der Spalte, findet er ihn auch und hält dort an. Aber da die Datenbank so aufgebaut ist, dass ein selbiger Ort so oft erscheint, wie es Straßen im Ort gibt, hat der Code Probleme damit.
Meine Laienhafte Feststellung. ;-)
Gruß Korl
Anzeige
Jetzt aber!
RR
Habe nochmal etwas umgeschrieben und hoffe es klappt jetzt auch. Die Zeile Range(... definiert den zu durchsuchenden Bereich. Sollten es mehr/weniger als 21.000 Zeilen sein, muss der Wert hinter dem : entsprechend angepasst werden.

Sub Suche_in_2_Spalten()
On Error GoTo ende:
Ort = InputBox("Ort:")
ST = InputBox("Straße:")
range("b1:b21000").Select
For Each zelle In Selection
If zelle.Value = Ort Then
If ST = "" Then GoTo NoStreet:
If Cells(zelle.Row, zelle.Column + 1) <> ST Then GoTo EndeIF:
NoStreet:
zelle.Activate
If MsgBox("Weitersuchen?", vbYesNo) = vbNo Then GoTo ende:
EndeIF:
End If
Next
ende:
MsgBox ("Ende der Suche!")
End Sub

Anzeige
AW: Jetzt aber!
16.12.2004 15:34:00
Korl
Hallo RR,
hast Du noch Geduld mit mir?
Jetzt läuft der Code durch und sagt "Ende der Suche!"
Hat aber nichts gefunden, weder den einzelnen Ort noch in Kombination mit Ort und Straße.
Und nu?
Magst Du noch?
Gruß Korl
Rechtschreibung!
RR
Hallo,
ich tippe auf die Schreibweise. Sowohl Ort, als auch Straße müssen exakt richtig geschrieben sein (inkl. Groß- und Kleinschreibung), also so wie der Text auch in den Zellen steht. Bei mir funktioniert es tadellos.
AW: Rechtschreibung?
16.12.2004 18:30:10
Korl
Hallo RR,
jetzt bin am verzweifeln, manche Orte mit Straße findet er und manche nicht. Platzhalter wie "?" oder"*" nimmt er jetzt nicht mehr!? Da man z.B. bei der Straßensuche nicht weiß ob der Name Straße, abgekürzt oder ausgeschrieben, oder mit Punkt versehen wurde, läßt sich solche Straße ganz schlecht finden. Genauso kann es einem auch bei der Schreibweise des Ortes gehen.
Wir sind ja faßt am Ziel, läßt sich nich doch noch etwas am Code pfeilen? ;-)
RR, es muß auch nichts überstürzt werden. Am Freitag und Samstag bin ich leider nicht am Ort.
Gruß Korl
Anzeige
Auf ein Neues!
RR
Hallo,
hier ein nächster Versuch. Platzhalter müssen nicht eingefügt werden! Er findet Textbestandteile auch so. Für Goethestraße reicht z.B. "oet" völlig aus. Es sollten also keine Wünsche mehr offen bleiben. Falls doch, am Montag bin wieder im Büro...zu Hause habe ich keine Zeit;-)

Sub Suche_in_2_Spalten()
On Error GoTo ende:
ORT = InputBox("Ort:")
ST = InputBox("Straße:")
range("B1:B21000").Select
For Each zelle In Selection
If Not zelle.Find(What:=ORT, LookIn:=xlFormulas, LookAt:=xlPart) Is Nothing Then
If ST = "" Then GoTo NoStreet:
If Cells(zelle.Row, 3).Find(What:=ST, LookIn:=xlFormulas, LookAt:=xlPart) Is Nothing Then GoTo EndeIF:
NoStreet:
zelle.Activate
If MsgBox("Weitersuchen?", vbYesNo) = vbNo Then GoTo ende:
EndeIF:
End If
Next
ende:
MsgBox ("Ende der Suche!")
End Sub

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige