Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: ListBox befüllen

ListBox befüllen
13.02.2009 11:33:00
Lenni
Moin Excellianer!
Im Archiv habe ich sehr sehr viele Beispiele zum Befüllen einer ListBox gefunden. Ich konnte aber leider nix meiner unten stehenden Fragestellung zuordnen.
Mit folgenden Code befülle ich eine ListBox in einem UserForm.


Private Sub UserForm_Activate()
Me.ListBox1.RowSource = "Tabelle1!B10:B50"
End Sub


Wenn aber leere Felder im Bereich B10:B50 der Tabelle1 sind, dann werden diese mit übernommen. Dazwischen und - vor allem - vom letzten Eintrag bis zum Ende der Liste.
Das empfinde ich als sehr unschön! Deshalb meine Frage: Kann man es realisieren, dass nur (!) die Einträge der Liste aus der Tabelle1 in der ListBox1 erscheint? Wie geht das?
Vielen Dank!
Viele Grüße aus dem hohen Norden!
Lenni

Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ListBox befüllen
13.02.2009 11:38:00
Tino
Hallo,
fülle diese mit einer Schleife und der AddItem-Methode und Filtere die Leeren Zellen aus.
Gruß Tino
AW: ListBox befüllen
13.02.2009 11:57:00
Lenni
Hallo Tino!!
Danke für Deine Antwort Tino! ...und ich schmunzel so vor mich hin: Du traust es mir also zu bzw. Du bist der Meinung, das ich in VBA soweit sein müßte, es selber zu schaffen!! ...und deshalb Dein "Anschubser".
O.K. Tino! Das empfinde ich als ein großes Lob!! ...und ich werde mich jetzt "an die Arbeit" machen!! Es wird aber seine Zeit brauchen. Sollte ich es nicht schaffen, melde ich mich noch mal! ...oder sollte ich es schaffen, die Lösung hier natürlich posten!
Drück mir die Daumen!! Melde mich!!
Gruß
Lenni

Anzeige
noch eine mit Beispiel
13.02.2009 12:05:00
Tino
Hallo,
dies mit einer (zwei) Area zu machen.
Beispiel:

Dim MeArea, MeAreaList() As String
Dim i As Integer, ii As Integer
MeArea = [Tabelle1!B10:B50] 'Zellbereich
For i = 1 To UBound(MeArea) 'Area Filtern
If MeArea(i, 1)  "" Then
ReDim Preserve MeAreaList(ii)
MeAreaList(ii) = MeArea(i, 1)
ii = ii + 1
End If
Next i
ListBox1.List = MeAreaList
Erase MeArea: Erase MeAreaList


Gruß Tino

Anzeige
AW: noch eine mit Beispiel
13.02.2009 12:47:00
Lenni
Danke Tino! ...also bei Deinem "Anschubser" trennt sich die "Spreu vom Weizen"... ...und ich bin da eher die Spreu... ;-((
Meine Überlegungen enden irgendwie immer im Nirvana....
Ist es entscheidend, das die ListBox1 in einem Page einer MultiPage ist?! ...meiner Meinung nach doch wohl eher nicht. Ich meine, ich kann doch Objekte immer   direkt "ansprechen"  ... ...oder?! Und muss nicht im VBA-Code darauf Rücksicht nehmen, dass sie irgendwo drinne sind... ?!?
Dein zweites Beispiel mit Area wirft Fehlermeldungen raus.
  • Tino, darf ich Dich bitten, mir ein Beispiel mit einer Schleife zu posten und - wenn es Dir nix ausmacht - mir ein wenig zu erklären, was eine Schleife eigentlich ist und wie sie grundsätzlich umgesetzt wird. Aber nur, wenn es Dir nix ausmacht!!

  • Ich meine das ungefähr so: Josef Ehrenberger hat mir mal zum Thema Matrixformeln diesen Link gepostet:
    http://www.online-excel.de/excel/singsel.php?f=26
    Das war wie eine Offenbarung für mich!! Hast Du ähnliche Tips?!
    UND: Ich bin langsam so weit, dass ich VBA mit Hilfe eines Buches erarbeiten will. Doch welches? Es muss mich wirklich da abholen, wo ich stehe und mit einfachen Beispielen erklären. Es gibt da viele Bücher... ...aber welches ist das richtige für mich (Bücher sind sehr teuer!! ...und ich will nicht erst beim 17. das Richtige gefunden haben!). Hast Du hier einen Tip?!
    Danke für Dein konkretes Tun und Handeln (...das mit der "Mühe" passt ja nicht wirklich!) und Deine Hilfe!
    Gruß
    Lenni

    Anzeige
    AW: noch eine mit Beispiel
    13.02.2009 13:08:00
    Tino
    Hallo,
    so direkt habe ich da nichts,
    ich habe mich halt irgendwann mal damit beschäftigt, gelesen und getestet.
    Heute ist dies irgendwo in meinem Hinterstübchen drin.
    Eine Multiseite kann man sich so vorstellen, ist wie eine Userform auf der Userform wobei jedes Register eine Userform ist und die Elemente darauf muss man entsprechend ansprechen.
    (Hoffentlich bekomme ich jetzt keine Schimpfe mit den wirklichen Profis, bei solch einem Vergleich)
    Beispiel:
    MultiPage1(0) ist Register 1, MultiPage1(1) wäre Register 2 usw.…
    
    Private Sub UserForm_Initialize()
    Dim MeArea, MeAreaList() As String
    Dim i As Integer, ii As Integer
    MeArea = [Tabelle1!B10:B50] 'Zellbereich
    For i = 1 To UBound(MeArea) 'Area Filtern
    If MeArea(i, 1)  "" Then
    ReDim Preserve MeAreaList(ii)
    MeAreaList(ii) = MeArea(i, 1)
    ii = ii + 1
    End If
    Next i
    MultiPage1(0).ListBox1.List = MeAreaList
    Erase MeArea: Erase MeAreaList
    End Sub
    


    Gruß Tino

    Anzeige
    hier ein Beispiel
    13.02.2009 13:51:00
    Tino
    Hallo,
    habe Dir mal zwei Varianten aufgebaut, am Ende wird ein Timer ausgegeben,
    dies soll Dir nur zeigen warum die Area Variante zu bevorzugen ist.
    Die lesen mit Area, sieht zwar vom Code her länger aus, ist aber um ein vielfaches schneller.
    https://www.herber.de/bbs/user/59426.xls
    Zu Schleifen, schau mal in die Hilfe unter
    For Next
    For Each
    Do Loop
    While...Wend
    Ich denke dies sind die wichtigsten.
    Gruß Tino
    Anzeige
    AW: noch eine mit Beispiel
    13.02.2009 15:21:00
    Horst
    Hi,
    der Vergleich zwischen UF und Multipage hinkt. In unterschiedlichen UF kann es Controls
    mit identischen Namen geben, im MP müssen alle Namen unique sein. Insofern müssen
    die Controls nicht zusätzlich mit dem Containernamen angesprochen werden.
    mfg Horst
    stimmt...
    13.02.2009 17:02:00
    Tino
    Hallo,
    aus irgendeinem Grund habe ich mir das so angewöhnt, diese über die Page anzusprechen.
    Werde auch bei dieser Methode bleiben. ;-)
    Gruß Tino
    Anzeige
    Vielen Dank!!
    13.02.2009 17:24:00
    Lenni
    Danke Tino! ...und auch Dir Horst für Deine Erklärung! So ganz verstehe ich das nicht, werde mich da aber durcharbeiten!
    Deine Beispieldatei mit der gestoppten Zeit ist klasse!! Mit Hilfe Deiner weiteren Erklärungen werde ich mich mal der "Schleifenproblematik" annehmen. Das mit der Area schaue ich mir dann an. Eins nach dem anderen.
    Dafür, dass Du VBA so "nebenbei angenommen hast", ziehe ich den Hut. Finde ich schon ziemlich gut!! Bei einigen Sachen macht es ja auch mir so langsam "klick". Sitze da und schreibe einen kleinen Code... ...und dann funktioniert er auch. Konnte ich vor einem Jahr auch noch nicht. Es ist aber nach wie vor "Schmalspur-VBA" bei mir.
    Ach ja: Ich habe Dein Beispiel - ohne die Stopuhr - mit der Schleife "umgemodelt für mein Hauptprojekt. ES LÄUFT!! ...aber das mit MeArea schau ich mir wie gesagt auch noch an!!
    Vielen Dank Tino!! ...für Deine Super-Hilfe!!
    Gruß
    Lenni

    Anzeige
    ;

    Forumthreads zu verwandten Themen

    Entdecke relevante Threads

    Schau dir verwandte Threads basierend auf dem aktuellen Thema an

    Alle relevanten Threads mit Inhaltsvorschau entdecken
    Anzeige
    Anzeige

    Infobox / Tutorial

    ListBox effizient befüllen in Excel VBA


    Schritt-für-Schritt-Anleitung

    Um eine ListBox in einem UserForm mit Werten aus einer Excel-Tabelle zu befüllen, kannst Du den folgenden Schritte folgen:

    1. Öffne den VBA-Editor (Alt + F11).
    2. Füge ein UserForm hinzu.
    3. Setze eine ListBox (z.B. ListBox1) in das UserForm.
    4. Verwende den folgenden Code, um die ListBox zu befüllen:
    Private Sub UserForm_Activate()
        Me.ListBox1.RowSource = "Tabelle1!B10:B50"
    End Sub
    1. Um leere Zellen zu vermeiden, kannst Du die AddItem-Methode verwenden und eine Schleife implementieren:
    Private Sub UserForm_Initialize()
        Dim MeArea As Variant
        Dim MeAreaList() As String
        Dim i As Integer, ii As Integer
    
        MeArea = [Tabelle1!B10:B50]
    
        For i = 1 To UBound(MeArea)
            If MeArea(i, 1) <> "" Then
                ReDim Preserve MeAreaList(ii)
                MeAreaList(ii) = MeArea(i, 1)
                ii = ii + 1
            End If
        Next i
    
        ListBox1.List = MeAreaList
    End Sub

    Häufige Fehler und Lösungen

    • Fehler: ListBox zeigt leere Einträge an

      • Lösung: Stelle sicher, dass Du die Schleife verwendest, um leere Werte zu filtern. Nutze die AddItem-Methode statt RowSource.
    • Fehler: Zugriff auf ListBox in MultiPage

      • Lösung: Wenn sich die ListBox in einer MultiPage befindet, musst Du den Zugriff anpassen. Beispiel:
    MultiPage1(0).ListBox1.List = MeAreaList

    Alternative Methoden

    Wenn Du die ListBox aus einer Tabelle füllen möchtest, gibt es einige alternative Ansätze:

    1. Direktes Befüllen mit RowSource:

      • Dies ist einfacher, aber nicht optimal, wenn leere Zellen vorhanden sind.
    2. Verwendung von Arrays:

      • Dies kann die Performance verbessern, insbesondere bei großen Datenmengen.
    3. Datenbankabfragen:

      • Wenn Deine Daten in einer externen Quelle gespeichert sind, kannst Du auch ADO verwenden, um die ListBox zu befüllen.

    Praktische Beispiele

    Hier sind einige praktische Beispiele:

    • Beispiel 1: Befüllen ohne leere Einträge

      Private Sub UserForm_Initialize()
      Dim MeArea As Variant
      Dim MeAreaList() As String
      Dim i As Integer, ii As Integer
      
      MeArea = [Tabelle1!B10:B50]
      
      For i = 1 To UBound(MeArea)
          If MeArea(i, 1) <> "" Then
              ReDim Preserve MeAreaList(ii)
              MeAreaList(ii) = MeArea(i, 1)
              ii = ii + 1
          End If
      Next i
      
      ListBox1.List = MeAreaList
      End Sub
    • Beispiel 2: Nutzung von ADO für Datenbankabfragen

      • Hierbei benötigst Du eine Datenbankverbindung, um Daten abzurufen und in die ListBox zu füllen.

    Tipps für Profis

    • Performance verbessern: Vermeide häufige Zugriffe auf die ListBox, indem Du die Daten zuerst in ein Array lädst.
    • Ereignisse deaktivieren: Bei großen Datenmengen kann es helfen, Application.ScreenUpdating = False zu verwenden, um die Anzeige zu optimieren, während die ListBox gefüllt wird.
    • Debugging: Nutze Debug.Print, um den Inhalt von Arrays zu überprüfen, bevor Du sie der ListBox zuweist.

    FAQ: Häufige Fragen

    1. Wie kann ich eine ListBox mit Werten aus mehreren Zellen füllen? Du kannst die AddItem-Methode in einer Schleife verwenden, um die gewünschten Werte hinzuzufügen.

    2. Ist es möglich, eine ListBox in einer MultiPage zu befüllen? Ja, Du musst die ListBox jedoch mit dem entsprechenden MultiPage-Index ansprechen, z.B. MultiPage1(0).ListBox1.List.

    3. Wie kann ich sicherstellen, dass keine Duplikate in der ListBox angezeigt werden? Du kannst ein Dictionary nutzen, um die Einträge zu speichern und Duplikate beim Befüllen zu vermeiden.

    4. Welche Excel-Versionen unterstützen diese Methoden? Die beschriebenen Methoden sind in Excel VBA ab Version 2007 verfügbar.

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Entdecke mehr
    Finde genau, was du suchst

    Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

    Suche nach den besten Antworten
    Unsere beliebtesten Threads

    Entdecke unsere meistgeklickten Beiträge in der Google Suche

    Top 100 Threads jetzt ansehen
    Anzeige