# Excel Userform Listbox



## jerry0110 (6. Februar 2019)

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.


```
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
```


----------



## Zvoni (6. Februar 2019)

Ist Spalte "AJ" auch wirklich die letzte Spalte?


----------



## jerry0110 (6. Februar 2019)

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?


----------



## Zvoni (6. Februar 2019)

```
If lcase(arr(i, lastcol)) = "ja" Then
```
Dann ist die Schreibweise egal (JA, ja, Ja, jA ist alles gültig)


----------



## jerry0110 (6. Februar 2019)

Zvoni hat gesagt.:


> ```
> If lcase(arr(i, lastcol)) = "ja" Then
> ```
> Dann ist die Schreibweise egal (JA, ja, Ja, jA ist alles gültig)



Danke funktioniert


----------



## jerry0110 (11. Februar 2019)

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.


```
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:


```
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:


```
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 (11. Februar 2019)

Ok wenn man wieder lange drüber nachdenkt, dann kommt die Lösung irgendwann.
Einfach eine If Abfrage zwischen gemacht. 


```
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
```


----------



## Zvoni (12. Februar 2019)

Wenn dein Suchbegriff eine Zahl anstatt eines Textes ist, kannst du die IsNumeric-Funktion verwenden.
IsNumeric-Funktion (Visual Basic für Applikationen)

```
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
```


----------



## jerry0110 (18. März 2019)

Ich habe hierzu noch mal eine Frage.
Ich versuche in die Listbox die Überschrift der Datei hinzubekommen.


```
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 (18. März 2019)

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 (18. März 2019)

Ich habe gelesen, dass eine Überschrift nur mit RowSource geht.


----------



## Zvoni (18. März 2019)

Hast du ColumnHeads auf Wahr?
Und was hast du als RowSourceType?


----------



## jerry0110 (18. März 2019)

Bei RowSourceType habe ich noch nichts geschrieben.

Habe jetzt mal das so geschrieben:


```
Suchübersicht.ListBox1.RowSource = "'Lieferant';'Art'"
    Suchübersicht.ListBox1.RowSourceType = "Value list"
```

Klappt aber auch nicht


----------



## Zvoni (18. März 2019)

GROLL
Wie selten dämlich hat MS denn das gelöst?????

```
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


----------



## jerry0110 (18. März 2019)

Auch wenn ich


```
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 (18. März 2019)

ObjektName der Tabelle!!!
Nicht den Namen des Blattes (was man unten in den Reitern lesen kann)!


Tabelle1 ist der Objektname, "Strecken aktiv" ist die Beschriftung


----------



## Zvoni (18. März 2019)

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 (18. März 2019)

jerry0110 hat gesagt.:


> Auch wenn ich
> 
> 
> ```
> ...


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


----------



## jerry0110 (18. März 2019)

Zvoni hat gesagt.:


> 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



Ich guck mal nach Beispielen für ListView

Habe jetzt Suchübersicht.ListBox1.RowSource = "Tabelle2!A1:S1" geschrieben.
Kommt immer noch ein Fehler.


----------



## Zvoni (18. März 2019)

Nicht "A1:S1"!!!!!!
"Tabelle2!A2:Sx" wobei x für deine letzte Zeile steht, und die muss explizit ausgerechnet/angegeben werden.


----------



## jerry0110 (18. März 2019)

Suchübersicht.ListBox1.RowSource = "Tabelle2!A2:S" & lastrow

Auch damit geht das nicht.

ListView geht leider nicht mit Excel 2016 64Bit.


----------



## jerry0110 (18. März 2019)

Habe jetzt 

```
Suchübersicht.ListBox1.RowSource = "A2:S" & lastrow
```
 geschrieben. Und es hat funktioniert. Das Tabelle2! war falsch. Endlich die Lösung.


----------



## jerry0110 (18. März 2019)

So jetzt macht er die Überschrift. Aber wenn ich eine bestimmte Sache vorher suche, dann zeigt er mir alle Datensätze an. Wenn ich das Rowsource wieder rausnehme dann sucht er korrekt.


----------

