Excel Userform Listbox


jerry0110

Erfahrenes Mitglied
#1
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
 

jerry0110

Erfahrenes Mitglied
#3
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

jerry0110

Erfahrenes Mitglied
#6
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?
 

jerry0110

Erfahrenes Mitglied
#7
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
 

jerry0110

Erfahrenes Mitglied
#9
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.
 

Zvoni

Erfahrenes Mitglied
#10
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
 

jerry0110

Erfahrenes Mitglied
#13
Bei RowSourceType habe ich noch nichts geschrieben.

Habe jetzt mal das so geschrieben:

Code:
    Suchübersicht.ListBox1.RowSource = "'Lieferant';'Art'"
    Suchübersicht.ListBox1.RowSourceType = "Value list"
Klappt aber auch nicht
 
Zuletzt bearbeitet:

Zvoni

Erfahrenes Mitglied
#14
GROLL
Wie selten dämlich hat MS denn das gelöst?????
Visual Basic:
Form.ListBox.RowSource="Tabelle1!A4:C8"
'Das ist für 3 Spalten mit 5 Zeilen an WERTEN!
'Die Spalten-Überschriften müssen in der Zeile darüber stehen
In deinem Fall stehen die Spalten-Überschriften in "A1:S1"
Und du musst den Objekt-Namen der Tabelle angeben.
Du musst bei RowSource die Zeile mit den Überschriften weglassen.
Und wie ich vermutet habe: Du musst eine Range als String angeben!!

EDIT: Du bist übrigens in die gleiche Falle getappt wie ich: RowSourcetype und wie du RowSource da eben angegeben hast, gilt für ACCESS (NICHT FÜR EXCEL!)

Anbei ein Beispiel. Geh in den VBA-Editor, wähle die Userform aus, starte sie, und click irgendwo auf die Userform
 

Anhänge

jerry0110

Erfahrenes Mitglied
#15
Auch wenn ich

Code:
    Suchübersicht.ListBox1.RowSource = "Strecken Aktiv!A1:S1"
eingebe, dann kommt immer der Fehler:

Laufzeitfehler 380: Eigenschaft RowSorce konnte nicht gesetzt werden. Ungültiger Eingenschaftenwert.
 

Zvoni

Erfahrenes Mitglied
#16
ObjektName der Tabelle!!!
Nicht den Namen des Blattes (was man unten in den Reitern lesen kann)!
1552912495041.png
Tabelle1 ist der Objektname, "Strecken aktiv" ist die Beschriftung
 

Zvoni

Erfahrenes Mitglied
#17
Nachtrag: Schmeiss die Listbox wo sie hingehört: In den Abfall!
Für mehrspaltige Sachen (bei denen du Überschriften willst/brauchst) nimm ein ListView im Report-Style
 

Zvoni

Erfahrenes Mitglied
#18
Auch wenn ich

Code:
    Suchübersicht.ListBox1.RowSource = "Strecken Aktiv!A1:S1"
eingebe, dann kommt immer der Fehler:

Laufzeitfehler 380: Eigenschaft RowSorce konnte nicht gesetzt werden. Ungültiger Eingenschaftenwert.
Wenn dann müssen deine Überschriften in A1:S1 stehen, aber in der RowSource gibst du an "A2:S28" (die 28 sind jetzt geraten)
Schau dir meine Beispielmappe oben an, dann siehst du was ich meine