Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
280to284
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
280to284
280to284
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Suchroutine flexibel gestalten

Suchroutine flexibel gestalten
20.07.2003 10:53:29
Lothar Ehret
Hallo Excel-Gemeinde,
ich habe wieder mal ein (für Euch Excel-Spezialisten hoffentlich kleines) Problem, ähnlich dem von Thomas M. (www.herber.de/forum/messages/283107.html).
Mit nachfolgendem Code suche ich im Bereich J6:L20618 den Wert einer in diesem Bereich selektierten Zelle. Jede Fundstelle wird hochgezählt und in einer MsgBox angezeigt.
Diese MsgBox möchte ich durch eine Userform ersetzen, in welcher sämtliche Daten der entsprechenden Zeile (Fundstelle) in Labels angezeigt werden. Beim Aufrufen einer Userform aus der For-Next-Schleife wird jedoch die Suchroutine abgebrochen. Will ich die Suche über einen Command-Button in der Userform fortsetzen und die nächste Fundstelle anzeigen lassen, müßte ich den Suchbereich in Abhängigkeit der aktuellen Fundstelle flexibel gestalten.
Hat jemand eine Idee, wie ich das anstelle?
Vielen Dank im voraus für jede Hilfe.
Gruß
Lothar

Sub Wert_suchen()
Dim c As New Collection
Dim r As Range
Dim r1 As Range
Dim r2 As Range
Dim ur1 As Range
Dim sh As Worksheet
Dim j As Integer
Dim k As Integer
Set sh = ActiveSheet
Set r2 = Range("J6")
If Intersect(Range("J6:L20618"), ActiveCell) Is Nothing Then
MsgBox "Bitte einen gültigen Wert anklicken!"
End If
Set rngalt = ActiveCell
suchwert = ActiveCell.Value
Set ur1 = sh.Range("J6:L20618")
Set r = ur1.Find(suchwert, lookat:=xlWhole, MatchCase:=True, after:=r2)
Set r1 = r
Do While Not r Is Nothing
c.Add sh.Name
c.Add r
Set r = ur1.FindNext(r)
If r.Address = r1.Address Then Set r = Nothing
Loop
If IsError(c.Count) Then Exit Sub
j = 1
k = c.Count
For i = 1 To c.Count Step 2
Set sh = Worksheets(c.Item(i))
sh.Activate
c.Item(i + 1).Select
Cancel = True
Mldg = MsgBox("Fundstelle " & j & " von " & (k / 2) & "   -  Weiter suchen?", vbYesNoCancel)
If Mldg = vbCancel Then GoTo a
If Mldg = vbYes Then GoTo b
If Mldg = vbNo Then GoTo c
a:      rngalt.Select
Exit Sub
b:      j = j + 1
Next
rngalt.Select
c:
End Sub

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Suchroutine flexibel gestalten
20.07.2003 14:14:33
Ivan
hi Lothar
ich hätte für dich schon eine fertige suchabfrage
die treffer in der listbox in einer userform listet!
allerdings müsten wir alles anpassen und du benötigst
noch 2 listboxen eine userform und die textboxen die dir den value auslesen
ja und einen commandbutton namens suchen auch noch
wenn du es möchtest dann schicke ich dir den code mit beschreibung.
gruss
ivan

AW: Suchroutine flexibel gestalten
20.07.2003 15:48:57
Lothar Ehret
Hallo Ivan,
Dein Vorschlag hört sich interessant an. Ich wäre Dir für den Code dankbar. Anpassen kann ich ihn vielleicht auch alleine.
Vielen Dank im voraus,
Lothar

Anzeige
AW: Suchroutine flexibel gestalten
20.07.2003 16:13:43
Ivan


 hi Lothar
also du benötigst
1 commandb.Suche
1 Combobox oder textbox für die sucheingabe(combobox ist mir lieber)
2 Listboxen
und je nach dem wie viele felder du listen möchtes textboxen 1-11
bei mir sind es 11 vorn,nachn,plz unsw.
1 userform1
'suche wird ausgelöst
 Private Sub Userform_Activate()
  Suche.Caption = "Suche"
 End Sub
'suchen
  Private Sub Suche_Click()
      On Error Resume Next
    If Err.Number <> 0 Then
        MsgBox "Kein Eintrag vorhanden!", vbCritical, "Schreiben Sie was rein"
   End If
           Dim As String
           
           Dim As String
            Dim Found As Range
             Dim FirstAddress As String
              Dim As Integer    ' Zeile
                i = 0
    If ComboBox1.Text = "" Then
        MsgBox "Kein Eintrag vorhanden!", vbCritical, "Was soll ich den suchen?"
        Suche.SetFocus
     Else
    End If
           e = ComboBox1.Text
          If e = "" Then Exit Sub
           ListBox1.Clear
           ListBox2.Clear
    With ActiveSheet
        Set Found = .Cells.Find(e, LookAt:=xlPart)
        If Not Found Is Nothing Then
            FirstAddress = Found.Address
            ListBox1.ColumnCount = 1
            ListBox1.AddItem Found
            ListBox1.List(i, 1) = Cells(Found.Row, 13)
            ListBox2.AddItem Found.Row
            i = i + 1
            Do
                Found.Activate
                Set Found = Cells.FindNext(After:=ActiveCell)
                On Error Resume Next
                If Found.Address = FirstAddress Then Exit Do
                ListBox1.AddItem Found
                ListBox1.List(i, 1) = Cells(Found.Row, 13)
                ListBox2.AddItem Found.Row
                i = i + 1
            Loop
        End If
    End With
    Suche.Caption = "Neue Suche"
    End Sub
'Hier erfolgt die Ausgabe des gesuchten
'in der listbox1
  Private Sub ListBox1_Click()
    Dim index As Integer
    If Not loeschen Then
        ListBox2.ListIndex = ListBox1.ListIndex
        zeile = ListBox2.List(ListBox2.ListIndex)
        For index = 1 To 11
            Me.Controls("TextBox" & CStr(index)).Value = Cells(zeile, index)
        Next
    End If
End Sub
bei fragen posten
hoffe ich habe alles richtig beschrieben
gruss
ivan

Anzeige
AW: Suchroutine flexibel gestalten
20.07.2003 18:22:45
Lothar Ehret
Hi Ivan,
danke für den Code. Ich werde ihn ausprobieren. Komme aber erst morgen früh dazu.
Gruß
Lothar

AW: Suchroutine flexibel gestalten
20.07.2003 18:42:36
Ivan
Hi Lothar
OK BIS MORGEN.
by
ivan

AW: Suchroutine flexibel gestalten
21.07.2003 11:38:48
Lothar Ehret
Hallo Ivan,
ich habe Deinen Code probiert. Der Original-Code funktioniert wunderbar.
Nachdem ich ihn allerdings für meine Bedürfnisse etwas abgeändert habe, stehe ich jetzt doch vor einem Problem:
Da ich nach einer selektierten Zelle suchen lassen will, schreibe ich beim Aufruf der Userform in die ComboBox1 den Wert von ActiceCell. Gleichzeitig soll die entsprechende Zeile eingelesen und angezeigt werden. Soweit funktioniert alles.
Wenn ich jetzt aber über den CommandButton Suche die Suche starte, bleibt der Code in

Private Sub ListBox3_Change() an der Stelle zeile = ListBox2.List(ListBox2.ListIndex)
hängen mit der Bemerkung: Eigenschaft List konnt nicht abgerufen werden. Index des Eigenschaftsfeldes ungültig.
Ändern von ListIndex auf -1 oder 1 in der Suchroutine bringen keine Änderung.
Auch das Entfernen von Listbox3 (damit zähle ich nur die Fundstellen hoch) bringt nichts, da er dann bei 

Private Sub ListBox2_Change() an der gleichen Stelle hängenbleibt.
Ein Ändern der Change- in eine Click-Prozedur hilft ebenfalls nichts. (Mit der Änderung in Change will ich umgehen, daß ich erst in eine ListBox klicken muß, damit die Werte in die Userform das erste mal eingelesen werden).
Falls Du Zeit finden würdest, mal einen Blick auf meine Code-Änderungen zu werfen, wäre ich Dir sehr dankbar. Wie gesagt, Dein Original-Code funktioniert einwandfrei.
Vielen Dank im voraus,
Lothar
Public LetzteZelle As Range

Private Sub CboCANCEL_Click()
LetzteZelle.Select
Unload Me
End Sub

'suche wird ausgelöst;
'beim Aufruf wird die Zeile von ActiveCell gleich eingelesen.
'soweit funktioniert es wunderbar

Private Sub Userform_Activate()
Dim index1 As Integer
Set LetzteZelle = ActiveCell
Suche.Caption = "Suche"
Me.ComboBox1.Text = ActiveCell.Value
Me.ListBox1.Clear
Me.ListBox2.Clear
Me.ListBox3.Clear
Me.ListBox1.AddItem ActiveCell.Value
Me.ListBox2.AddItem ActiveCell.Row
Me.ListBox3.AddItem ("1")
ListBox1.ListIndex = 0
ListBox2.ListIndex = 0
ListBox3.ListIndex = 0
zeile1 = ListBox2.List(ListBox2.ListIndex)
For index1 = 1 To 11 'Spalten, die eingelesen werden sollen
Me.Controls("TextBox" & CStr(index1)).Value = Cells(zeile1, index1)
Next
End Sub

'suchen

Private Sub Suche_Click()
Dim index As Integer
On Error Resume Next
If Err.Number <> 0 Then
MsgBox "Kein Eintrag vorhanden!", vbCritical, "Bitte Suchbegriff eingeben!"
'    Me.ComboBox1.SetFocus
End If
Dim e As String
Dim r2 As Range
Dim s As String
Dim Found As Range
Dim FirstAddress As String
Dim i As Integer ' Zeile
Set r2 = Range("A6") 'Daten befinden sich erst ab Zeile 6
i = 1 'muß i = 6 sein, wenn erst ab der 6.Zeile gesucht werden soll?
If ComboBox1.Text = "" Then
MsgBox "Kein Eintrag vorhanden!", vbCritical, "Suchbegriff ???"
Me.ComboBox1.SetFocus
'Suche.SetFocus
Else
End If
e = ComboBox1.Text
If e = "" Then Exit Sub
ListBox1.Clear
ListBox2.Clear
ListBox3.Clear
With ActiveSheet
Set Found = .Cells.Find(e, LookAt:=xlPart, MatchCase:=True, After:=r2) 'für Phrase suchen
'Set Found = .Cells.Find(e, LookAt:=xlWhole) 'für Wort oder Zahl suchen
If Not Found Is Nothing Then
FirstAddress = Found.Address
ListBox1.ColumnCount = 1
ListBox1.AddItem Found
ListBox1.List(i, 1) = Cells(Found.Row, 13)
ListBox2.AddItem Found.Row
ListBox3.AddItem i
i = i + 1
Do
Found.Activate
Set Found = Cells.FindNext(After:=ActiveCell)
On Error Resume Next
If Found.Address = FirstAddress Then Exit Do
ListBox1.AddItem Found
ListBox1.List(i, 1) = Cells(Found.Row, 13)
ListBox2.AddItem Found.Row
ListBox3.AddItem i
i = i + 1
Loop
End If
End With
Label_Fundstellen.Caption = ((i - 1) & " Fundstellen") 'Anzeigen der Anzahl Fundstellen im Label_Fundstellen
ListBox1.ListIndex = 0 'ändern in -1 oder 1 bringt nichts
ListBox2.ListIndex = 0 'ändern in -1 oder 1 bringt nichts
ListBox3.ListIndex = 0 'ändern in -1 oder 1 bringt nichts
ListBox3.SetFocus
Suche.Caption = "Neue Suche"
End Sub

'Hier erfolgt die Ausgabe des gesuchten


Private Sub ListBox1_Change()
Dim index As Integer
If Not loeschen Then
ListBox2.ListIndex = ListBox1.ListIndex
ListBox3.ListIndex = ListBox1.ListIndex
zeile = ListBox2.List(ListBox2.ListIndex)
For index = 1 To 11 'Spalten, die eingelesen werden sollen
Me.Controls("TextBox" & CStr(index)).Value = Cells(zeile, index)
Next
End If
End Sub



Private Sub ListBox2_Change()
Dim index As Integer
If Not loeschen Then
ListBox1.ListIndex = ListBox2.ListIndex
ListBox3.ListIndex = ListBox2.ListIndex
zeile = ListBox2.List(ListBox2.ListIndex)
For index = 1 To 11 'Spalten, die eingelesen werden sollen
Me.Controls("TextBox" & CStr(index)).Value = Cells(zeile, index)
Next
End If
End Sub



Private Sub ListBox3_Change()
Dim index As Integer
If Not loeschen Then
ListBox1.ListIndex = ListBox3.ListIndex
ListBox2.ListIndex = ListBox3.ListIndex
zeile = ListBox2.List(ListBox2.ListIndex)
For index = 1 To 11 'Spalten, die eingelesen werden sollen
Me.Controls("TextBox" & CStr(index)).Value = Cells(zeile, index)
Next
End If
End Sub


Anzeige
AW: Suchroutine flexibel gestalten
21.07.2003 13:27:40
Ivan
HI LOTHAR
leider versthe ich nicht was du damit meinst.
mit "den Wert von ActiceCell"
du brauchst den code nicht umbauen,du wirst ja ein leere spalte haben
wo du ganz einfach eine nr. vergibst 1-1000 beliebig.
wenn du dann nach zb.2suchst wird 2 gefunden und die dazu gehörigen inhalte der zeile in den textboxen gelistet soferne du textboxen angelegt hast.das einzige was du ändern kanst u solltest wäre 1 To 11 anzahl der textboxen.
du kannst der combobox1(Rowsource zuweisen auf die spalten die am meisten suchst auch sagen was sie dir zeigen soll dann brauchst nix eingeben.
sondern nur auf die combobox1 klicken.zb .deine active cell
eine kleine beschreibung der suchabfrage.
wenn man in combobox1 einen suchbegriff eingibt.
dann wird die dahinterligende active tabelle durchsucht.(egal welche)
egal ob die daten ab a6 beginnen!
BEI EINEM TREFFER WIRD DANN IN LISTBOX1 DER TREFFER GELISTET.
und erst nach einem klick in die listbox1,dann in die textboxen1-11 verteilt.
listbox2 zeigt dir die zeilennummer.
wenn du jetzt einen neuen suchbegriff eingibst und wieder suchen klickst
hast du die ergebnisse wieder in listbox1.
wenn du dem ergebniss folgen möchtest aus der listbox1,
dann genügt ein doppelklick in die listbox1.nach der abfrage natürlich.
beispiel,ich verwende hyperlinks .
'Bei doppelklick In Listbox1 HYPERLINK folgen.

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Sheets("DB").Activate
On Error Resume Next
If Err.Number <> 0 Then
End If
Range("B" & CStr(ListBox2.List(ListBox2.ListIndex))).Hyperlinks(1).Follow
End Sub

ich hoffe du verstehst das ganze jetzt besser.
gruss
ivan

Anzeige
AW: Suchroutine flexibel gestalten
21.07.2003 17:31:39
Lothar Ehret
Hallo Ivan
vielen Dank für Deine Mühe.
Der Code funktioniert jetzt;
es lag doch an Listbox_Change statt Listbox_Click, wie es in Deinem Code steht.
Ich dachte, ich kann mir damit den ersten Treffer gleich anzeigen lassen,
ohne erst in die Listbox klicken zu müssen, aber das haut wohl nicht hin.
Grüße
Lothar

AW: Suchroutine flexibel gestalten
21.07.2003 18:21:40
Ivan
HI LOTHAR
das kann ja nicht so gehen mit "gleich listen lassen".
weil wenn du mehr treffer hast,was is dann???
wo sollen die denn gelistet werden.
die suchabfrage ist eine abfrage damit man eben mehr
treffer finden kann.
eine einfache suche mit einem treffer da würde es dann schon gehn.
aber nicht mit diesem code:))lol
gruss
ivan

Anzeige
AW: Suchroutine flexibel gestalten
21.07.2003 22:12:13
Lothar Ehret
Hi Ivan,
ich möchte eigentlich zwei Dinge mit einer Klappe erschlagen:
1. Eine Zeile soll bei Maus-Rechtsklick komplett in einer Userform (zusammen mit zusätzlichen Informationen aus anderen Tabellen) dargestellt werden. Dazu brauche ich die Suchroutine eigentlich nicht.
2. In dieser Userform soll dann aber über eine Schaltfläche bei Bedarf eine Suche nach einem bestimmten Wert dieser Zeile (steht entweder in Spalte J oder L) erfolgen und die Treffer aufgelistet werden.
Gruß,
Lothar

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige