Excel Userform Listbox

jerry0110

Erfahrenes Mitglied
Hallo zusammen,

ich habe im Internet nach einer Lösung gesucht, wie ich beim öffnen der Userform Listbox, diese mit Daten fülle.
Habe den Code angepasst.

Habe den Code gefunden. Jedoch sagt er mir immer, dass ich außerhalb des gültigen Bereichs bin. Verstehe aber nicht warum.

Visual Basic:
    Dim arr As Variant
    Dim arrF() As Variant
    Dim i As Long
    Dim k As Long
    Dim m As Long
    Dim lastrow As Long
    Dim lastcol As Long
    
    
    lastrow = Worksheets("alle RG").Cells(Rows.Count, 1).End(xlUp).Row
    lastcol = Worksheets("alle RG").Cells(1, Columns.Count).End(xlToLeft).Column
    
    
    arr = Sheets("alle RG").Range("A1:AJ" & lastrow)

        For i = 1 To UBound(arr)
            If arr(i, lastcol) = "Ja" Then
                m = m + 1
                For k = 1 To UBound(arr, 2)
                    ReDim Preserve arrF(1 To UBound(arr, 2), 1 To m)
                    arrF(k, m) = arr(i, k)
                Next
            End If
        Next
    ListBox1.ColumnCount = UBound(arrF)
    ListBox1.Column = arrF
 
Ich hab den Fehler entdeckt.

Weil in Spalte AJ z. b. ein Ja und nicht ein ja steht findet er nichts.
Und dann gibt er aus, dass es im Ungültigen Bereich ist.

Hab das jetzt angepassst von ja in Ja und direkt hat er alles gefunden.

Wie kann ich das anpassen, dass er diesen Fehler dann nicht mehr anzeigt?
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    4,7 KB · Aufrufe: 1
Code:
If lcase(arr(i, lastcol)) = "ja" Then
Dann ist die Schreibweise egal (JA, ja, Ja, jA ist alles gültig)
 
Ich habe noch mal eine Frage zur Suche selber.
Das Script hab ich jetzt so angepasst, dass ich mit Globalen Variablen arbeite und sobald ich einen Button drücke, übergebe ich für die Suche den Begriff der Überschrift und dann noch das was er suchen soll.
Das klappt auch immer wenn es sich um ein Wort handelt. Jetzt hab ich aber folgendes. Ich möchte nicht nach einen Wort sondern nach einer Zahl die kleiner 30 ist suchen.

Visual Basic:
Sub Suchfunktion()

    Dim arr As Variant
    Dim arrF() As Variant
    Dim i As Long
    Dim k As Long
    Dim m As Long
    Dim lastrow As Long
    Dim lastcol As Long
    Dim c As Range
    Dim rngBereich As Range
   
    Set rngBereich = Sheets("alle RG").Columns("A:AR")
    Set c = rngBereich.Find(txtSuche, LookIn:=xlValues, lookat:=xlPart)
   
    lastrow = Worksheets("alle RG").Cells(Rows.Count, 1).End(xlUp).Row
    lastcol = Worksheets("alle RG").Cells(1, Columns.Count).End(xlToLeft).Column

    arr = Sheets("alle RG").Range("A1:AR" & lastrow)

    If Not c Is Nothing Then
        For i = 1 To UBound(arr)
            If LCase(arr(i, c.Column)) = suchbegriff Then
                m = m + 1
                For k = 1 To UBound(arr, 2)
                    ReDim Preserve arrF(1 To UBound(arr, 2), 1 To m)
                    arrF(k, m) = arr(i, k)
                Next
            End If
        Next
    End If
    Suchübersicht.ListBox1.ColumnCount = UBound(arrF)
    Suchübersicht.ListBox1.Column = arrF

End Sub

Wenn ich bei Suchbegriff z. B. <30 suche dann findet er nichts.
Im anderen Makro übergebe ich die Werte so:

Visual Basic:
Private Sub CommandButton9_Click()

    txtSuche = "Kabeltiefe"
    suchbegriff = "<30"
    Suchübersicht.Show

End Sub

Aber dann ist ja für mein Verständnis, dass es dann so übersetzt wird:

Visual Basic:
If LCase(arr(i, c.Column)) = <30 Then

Und das ist ja falsch. Es müsste ja <= heißen oder?
Wie kann ich das lösen?
 
Ok wenn man wieder lange drüber nachdenkt, dann kommt die Lösung irgendwann.
Einfach eine If Abfrage zwischen gemacht.

Visual Basic:
Sub Suchfunktion()

    Dim arr As Variant
    Dim arrF() As Variant
    Dim i As Long
    Dim k As Long
    Dim m As Long
    Dim lastrow As Long
    Dim lastcol As Long
    Dim c As Range
    Dim rngBereich As Range
    
    Set rngBereich = Sheets("alle RG").Columns("A:AR")
    Set c = rngBereich.Find(txtSuche, LookIn:=xlValues, lookat:=xlPart)
    
    lastrow = Worksheets("alle RG").Cells(Rows.Count, 1).End(xlUp).Row
    lastcol = Worksheets("alle RG").Cells(1, Columns.Count).End(xlToLeft).Column

    arr = Sheets("alle RG").Range("A1:AR" & lastrow)

    If Not c Is Nothing Then
        For i = 1 To UBound(arr)
            If txtSuche = "Kabeltiefe" Then
                If LCase(arr(i, c.Column)) < 30 Then
                    m = m + 1
                    For k = 1 To UBound(arr, 2)
                        ReDim Preserve arrF(1 To UBound(arr, 2), 1 To m)
                        arrF(k, m) = arr(i, k)
                    Next
                End If

            Else
                If LCase(arr(i, c.Column)) = suchbegriff Then
                    m = m + 1
                    For k = 1 To UBound(arr, 2)
                        ReDim Preserve arrF(1 To UBound(arr, 2), 1 To m)
                        arrF(k, m) = arr(i, k)
                    Next
                End If
            End If
        Next
    End If
    Suchübersicht.ListBox1.ColumnCount = UBound(arrF)
    Suchübersicht.ListBox1.Column = arrF

End Sub
 
Wenn dein Suchbegriff eine Zahl anstatt eines Textes ist, kannst du die IsNumeric-Funktion verwenden.
IsNumeric-Funktion (Visual Basic für Applikationen)
Code:
If IsNumeric(arr(i, c.Column)) Then
   If arr(i, c.Column)<30 Then  'Bei numerischen Werten brauchst du kein LCase
     ......
   End If
Else
    If LCase(arr(i, c.Column))=suchbegriff Then
       .....
    End If
End If
 
Ich habe hierzu noch mal eine Frage.
Ich versuche in die Listbox die Überschrift der Datei hinzubekommen.

Visual Basic:
Sub Suchfunktion()

    Dim arr As Variant
    Dim arrF() As Variant
    Dim i As Long
    Dim k As Long
    Dim m As Long
    Dim lastrow As Long
    Dim lastcol As Long
    Dim c As Range
    Dim rngBereich As Range
    
    Set rngBereich = Sheets("Strecken Aktiv").Columns("A:S")
    Set c = rngBereich.Find(txtSuche, LookIn:=xlValues, lookat:=xlPart)
    
    lastrow = Worksheets("Strecken Aktiv").Cells(Rows.Count, 1).End(xlUp).Row
    lastcol = Worksheets("Strecken Aktiv").Cells(1, Columns.Count).End(xlToLeft).Column

    arr = Sheets("Strecken Aktiv").Range("A2:S" & lastrow)

    If Not c Is Nothing Then
        For i = 1 To UBound(arr)
            If arr(i, c.Column) = suchbegriff Then
                    m = m + 1
                    For k = 1 To UBound(arr, 2)
                        ReDim Preserve arrF(1 To UBound(arr, 2), 1 To m)
                        arrF(k, m) = arr(i, k)
                    Next
            End If
        Next
    End If
    Suchübersicht.ListBox1.ColumnCount = UBound(arrF)
    Suchübersicht.ListBox1.Column = arrF
    Suchübersicht.ListBox1.ColumnCount = 19
    Suchübersicht.ListBox1.RowSource = arr
End Sub

Habe in den Code

Suchübersicht.ListBox1.ColumnCount = 19
Suchübersicht.ListBox1.RowSource = arr

eingebaut. Aber er sagt immer Typ unverträglich.
Ich habe schon im Internet gesucht und es auch nach Anleitung gemacht.
 
Wieso "RowSource"? Ich dachte es wäre ListBox1.List=arr?
Ich glaube RowSource erwartet eine Range, du bietest aber ein Array an.

Teste mal:
ListBox1.RowSource=Sheets("Strecken Aktiv").Range("A2:S" & lastrow)
Weil aus der Range baust du ja dein Array

Sind aber alles nur Vermutungen (habs sowas schon lang nimma gemacht
 
Zurück