Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1576to1580
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

.Find hört nicht auf

.Find hört nicht auf
27.08.2017 15:25:07
_Domi_
Hallo zusammen,
ich habe folgendes Problem:
Ich bastle eine Suche mit einer Userform.
Diese greift Daten aus dem Tabellenblatt "Auflistung" (Spalte C, steht ein name; spalte D, steht eine Adresse; Spalte E, steht ein Text)
Das folgende Script ändert die Zelle nicht und ich weiß nicht warum...
letzteZeile = Sheets("Auflistung").UsedRange.SpecialCells(xlCellTypeLastCell).Row
Set objSH = Sheets("Auflistung")
With objSH
Set rngSearch = .Range("C6:E" & letzteZeile).Find(Me.TextBox1.Value, LookIn:=xlValues, LookAt:=IIf(chkPart, xlWhole, xlPart))
If Not rngSearch Is Nothing Then
strFirst = rngSearch.Address
Do
' ListBox hinzufügen
Set rngSearch = .Range("C6:E" & letzteZeile).FindNext(rngSearch)
Loop While Not rngSearch Is Nothing And rngSearch.Address strFirst
Else
ListBox1.AddItem "Kein Treffer!"
End If
End With
Wo ist mein Fehler?
Gruß Domi

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: .Find hört nicht auf
27.08.2017 15:47:30
Nepumuk
Hallo Domi,
kann ich nicht nachvollziehen. Das Suchen stoppt wenn die erste gefundene Zelle wiedergefunden wird.
Ich war so frei dein Makro etwas zu optimieren:
Private Sub CommandButton1_Click()
    
    Dim letzteZeile As Long
    Dim strFirst As String
    Dim rngSearch As Range
    
    With Worksheets("Auflistung")
        
        letzteZeile = .UsedRange.SpecialCells(xlCellTypeLastCell).Row
        
        With .Range("C6:E" & CStr(letzteZeile))
            
            Set rngSearch = .Find(TextBox1.Text, LookIn:=xlValues, LookAt:=IIf(chkPart, xlWhole, xlPart))
            
            If Not rngSearch Is Nothing Then
                
                strFirst = rngSearch.Address
                
                Do
                    
                    ' ListBox hinzufügen
                    ListBox1.AddItem rngSearch.Value
                    
                    Set rngSearch = .FindNext(rngSearch)
                    
                Loop Until rngSearch.Address = strFirst
                
                Set rngSearch = Nothing
                
            Else
                
                ListBox1.AddItem "Kein Treffer!"
                
            End If
        End With
    End With
End Sub

Gruß
Nepumuk
Anzeige
AW: .Find hört nicht auf
27.08.2017 16:05:53
_Domi_
Hallo Nepumuk,
erstmal danke für deine Optimierung!
Soweit funktioniert die Suche wenn ich mit längerem Text suche.
Jedoch braucht es ewig (Dann stürzt Excel ab), wenn ich z.B. nach "e" suche, kann man das optimieren?
Gruß Domi
AW: .Find hört nicht auf
27.08.2017 16:20:25
Nepumuk
Hallo Domi,
von wie vielen Datenzeilen die durchsucht werden reden wir da? Welche Excelversion benutzt du?
Gruß
Nepumuk
AW: .Find hört nicht auf
27.08.2017 16:28:48
_Domi_
Hallo Nepumuk,
ich benutze Excel 2016.
Es sind 2 Einträge vorhanden, deswegen verstehe ich es nicht..
Wenn ich z.B. nach 2 Buchstaben suche funktioniert es in sekundenschnelle...
Bei manchen Buchstaben kann ich auch 1stellig suchen bei manchen aber eben nicht..
Gruß Domi
Anzeige
AW: .Find hört nicht auf
27.08.2017 16:47:36
Nepumuk
Hallo Domi,
ich kann keinen Unterschied zwischen meinem Excel 2013 und Excel 2016 messen. Daran liegt es also nicht. Lösch mal in einer Kopie der Mappe alle Tabellenblätter außer der "Auflistung" und allen VBA-Code dann lade sie hoch.
Gruß
Nepumuk
AW: .Find hört nicht auf
27.08.2017 17:05:52
_Domi_
Hallo Nepumuk,
anbei die Datei.
Habe dir ein paar Testfelder eingefügt.
Suche ich nach "te" oder "test" stürzt die Datei ab.
Suche ich nach "straße" oder "info" funktioniert es?

Die Datei https://www.herber.de/bbs/user/115799.xlsm wurde aus Datenschutzgründen gelöscht


Gruß Domi
Anzeige
AW: .Find hört nicht auf
27.08.2017 18:04:20
Nepumuk
Hallo Domi,
Excel ist nicht abgestürzt sondern du hast es in eine Endlosschleife gezwungen. Der Fehler, das Weitersuchen mit FindNext befindet sich zwischen If i 0 Or Anzahl = 0 Then und End If
Ich hab noch ein bisschen am Code gebastelt: https://www.herber.de/bbs/user/115801.xlsm
Gruß
Nepumuk
AW: .Find hört nicht auf
27.08.2017 18:17:57
Luschi
Hallo Domi,
Du hast einen Riesen-Klops im Code, diese Schleife
Do While i wird nie durchlaufen:

- i ist nicht initialisiert (Dim i As Integer)
- durch die fehlende Direktive: Option Explicit
- hat i den Wert 'leer' statt '0'
- und der o.g. Vergleich (i  0 werden kann
- wird
  Set rngSearch = .FindNext(rngSearch)
auch nie ausgeführt- und die Do / Loop While Not rngSearch Is Nothing And rngSearch.Address  _
strFirst - Schleife läuft sich tot

Gruß von Luschi
aus klein-Paris
Anzeige
AW: .Find hört nicht auf
27.08.2017 20:32:03
_Domi_
Hallo Nepumuk und Luschi,
danke dir Nepumuk für die Optimierung funktioniert einwandfrei!
Danke Luschi für die genannten Fehler! Hätte ich alleine nicht gefunden..
Nepumuk hat Sie gleich direkt beseitigt :)
Eine Frage noch:
In der Beispieldatei sortiert er die Ergebnisse immer schon nach dem Alphabet, in meine Datei allerdings nicht woran kann das liegen, bzw. hat jemand eine Lösung zum Sortieren?
Grußd Domi
AW: .Find hört nicht auf
27.08.2017 21:05:06
Nepumuk
Hallo Domi,
kopiere folgende Prozedur in das Modul des UserForms:
Private Sub QuickSort(ByVal pvlngLBound As Long, ByVal pvlngUBound As Long, _
        ByVal pvlngColumn As Long, ByRef probjControl As MSForms.Control, _
        ByVal pvenmSortValue As SORT_VALUE, ByVal pvenmSortOrder As XlSortOrder)

    
    Dim ialngIndex1 As Long, ialngIndex2 As Long, ialngIndex3 As Long
    Dim vntTemp As Variant, vntBuffer As Variant
    
    ialngIndex1 = pvlngLBound
    ialngIndex2 = pvlngUBound
    
    With probjControl
        
        Do
            If pvenmSortOrder = xlAscending Then
                Select Case pvenmSortValue
                    Case Sort_Text
                        vntTemp = .List((pvlngLBound + pvlngUBound) \ 2, pvlngColumn)
                        Do While .List(ialngIndex1, pvlngColumn) < vntTemp
                            ialngIndex1 = ialngIndex1 + 1
                        Loop
                        
                        Do While vntTemp < .List(ialngIndex2, pvlngColumn)
                            ialngIndex2 = ialngIndex2 - 1
                        Loop
                    Case Sort_Numeric
                        vntTemp = CDbl(.List((pvlngLBound + pvlngUBound) \ 2, pvlngColumn))
                        Do While CDbl(.List(ialngIndex1, pvlngColumn)) < vntTemp
                            ialngIndex1 = ialngIndex1 + 1
                        Loop
                        
                        Do While vntTemp < CDbl(.List(ialngIndex2, pvlngColumn))
                            ialngIndex2 = ialngIndex2 - 1
                        Loop
                    Case Sort_Date
                        vntTemp = CDate(.List((pvlngLBound + pvlngUBound) \ 2, pvlngColumn))
                        Do While CDate(.List(ialngIndex1, pvlngColumn)) < vntTemp
                            ialngIndex1 = ialngIndex1 + 1
                        Loop
                        
                        Do While vntTemp < CDate(.List(ialngIndex2, pvlngColumn))
                            ialngIndex2 = ialngIndex2 - 1
                        Loop
                End Select
            Else
                Select Case pvenmSortValue
                    Case Sort_Text
                        vntTemp = .List((pvlngLBound + pvlngUBound) \ 2, pvlngColumn)
                        Do While .List(ialngIndex1, pvlngColumn) > vntTemp
                            ialngIndex1 = ialngIndex1 + 1
                        Loop
                        
                        Do While vntTemp > .List(ialngIndex2, pvlngColumn)
                            ialngIndex2 = ialngIndex2 - 1
                        Loop
                    Case Sort_Numeric
                        vntTemp = CDbl(.List((pvlngLBound + pvlngUBound) \ 2, pvlngColumn))
                        Do While CDbl(.List(ialngIndex1, pvlngColumn)) > vntTemp
                            ialngIndex1 = ialngIndex1 + 1
                        Loop
                        
                        Do While vntTemp > CDbl(.List(ialngIndex2, pvlngColumn))
                            ialngIndex2 = ialngIndex2 - 1
                        Loop
                    Case Sort_Date
                        vntTemp = CDate(.List((pvlngLBound + pvlngUBound) \ 2, pvlngColumn))
                        Do While CDate(.List(ialngIndex1, pvlngColumn)) > vntTemp
                            ialngIndex1 = ialngIndex1 + 1
                        Loop
                        
                        Do While vntTemp > CDate(.List(ialngIndex2, pvlngColumn))
                            ialngIndex2 = ialngIndex2 - 1
                        Loop
                End Select
            End If
            If ialngIndex1 <= ialngIndex2 Then
                
                For ialngIndex3 = 0 To .ColumnCount - 1
                    vntBuffer = .List(ialngIndex1, ialngIndex3)
                    .List(ialngIndex1, ialngIndex3) = .List(ialngIndex2, ialngIndex3)
                    .List(ialngIndex2, ialngIndex3) = vntBuffer
                Next
                
                ialngIndex1 = ialngIndex1 + 1
                ialngIndex2 = ialngIndex2 - 1
                
            End If
        Loop Until ialngIndex1 > ialngIndex2
    End With
    
    If pvlngLBound < ialngIndex2 Then Call QuickSort(pvlngLBound, _
        ialngIndex2, pvlngColumn, probjControl, pvenmSortValue, pvenmSortOrder)
    If ialngIndex1 < pvlngUBound Then Call QuickSort(ialngIndex1, _
        pvlngUBound, pvlngColumn, probjControl, pvenmSortValue, pvenmSortOrder)
    
End Sub

Ganz oben unter Option Explicit kommen folgende Zeilen:
Private Enum SORT_VALUE
    Sort_Text
    Sort_Numeric
    Sort_Date
End Enum

Der Aufruf muss als letzte Zeile der Füllroutine stehen:
Call QuickSort(0, ListBox1.ListCount - 1, 0, ListBox1, Sort_Text, xlAscending)

Die erste 0 ist der kleinste Index der ListBox und darf nicht geändert werden. Die 0 an der dritten Spalte gibt an dass die erste Spalte der ListBox sortiert wird. Sort_Text gibt an dass Text sortiert wird, du kannst aber auch nach Datum (Sort_Date) oder nach Zahlen (Sort_Numeric) sortieren, je nachden was die Spalte enthält. xlAscending gibt an, dass die Liste aufsteigend sortiert wird. Willst du absteigend sortieren dann musst du da xlDescending eingeben.
Gruß
Nepumuk
Anzeige
AW: .Find hört nicht auf
27.08.2017 22:29:06
_Domi_
Hallo Nepumuk,
Vielen Dank!
Funktioniert nun alles problemlos :)
Gruß Domi

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige