Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema ListBox
BildScreenshot zu ListBox ListBox-Seite mit Beispielarbeitsmappe aufrufen

Listbox

Betrifft: Listbox von: willfried
Geschrieben am: 04.07.2013 14:51:32

Hallo Excel Profis,
habe hier ein kleines problem mit meiner Listbox. hier mal der Code.

Private Sub UserForm_Initialize()
With Me.listbox
    
Dim rngC         As Range
Dim rngZelle                  As Range
Dim rngZelle1                 As Range

  listbox.Clear
 
  For Each rngC In Range(Cells(ActiveCell.Row, 11), Cells(ActiveCell.Row, 22))
    If Len(rngC) Then
      With listbox
        .AddItem rngC.Value
      .Selected(.ListCount - 1) = True
      End With
    End If
  Next


    For Each rngZelle In Worksheets("daten").Range("E5:E392")
        If IsEmpty(rngZelle) Then Exit Sub
        Me.listbox.AddItem rngZelle.Value
    Next rngZelle
    
End With


With Me.ListBox1


    
    For Each rngZelle In Worksheets("daten").Range("I5:I392")
        If IsEmpty(rngZelle) Then Exit Sub
        Me.ListBox1.AddItem rngZelle.Value
    Next rngZelle
    
End With


End Sub
Zu meinem Problem, das Einlesen der Werte funktioniert, nur sollen keine doppelten Einträge vorhanden sein, bzw. die Wwerte aus der ersten Schleife sollen markiert sein.

Hat jemand eine Idee das der doppelte Eintrag rauskommt und nur einer markiert wird?
Danke schon mal für Eure Zeit.

  

Betrifft: AW: Listbox von: Klaus M.vdT.
Geschrieben am: 04.07.2013 15:50:50

Hi,
dein Code ist sehr unaufgeräumt und unstrukturiert. Lass mich raten (nicht böse gemeint): alles irgendwo aufgeschnappt und reinkopiert, aber keinen Plan was da passiert?
Referenzierungen unnötig oder falsch, Referenzierung um DIM herum usw ...

Also habe ich zuerst mal deinen Code aufgeräumt:

Private Sub UserForm_Initialize()
    
Dim rngC         As Range
Dim rngZelle     As Range
REM Dim rngZelle1    As Range 'wozu? Diese Variable kommt nirgendwo vor ...

With Me.ListBox
  .Clear
  For Each rngC In Range(Cells(ActiveCell.Row, 11), Cells(ActiveCell.Row, 22))
    If Len(rngC) Then
        .AddItem rngC.Value
        .Selected(.ListCount - 1) = True
    End If
  Next rngC
  
  For Each rngZelle In Worksheets("daten").Range("E5:E392")
        If IsEmpty(rngZelle) Then Exit Sub
        .AddItem rngZelle.Value
    Next rngZelle
End With
    
For Each rngZelle In Worksheets("daten").Range("I5:I392")
    If IsEmpty(rngZelle) Then Exit Sub
    Me.ListBox1.AddItem rngZelle.Value
Next rngZelle

End Sub
Jetzt stelle ich fest: in deinem Code sind ZWEI Listboxen, und zwar Namens (1) "ListBox" und (2) "ListBox1".
die (1) Listbox befüllst du einmal von Spalte 11 bis 22 aus der aktiven Zeile, DANACH befüllst du sie weiter aus Worksheets("daten").Range("E5:E392"). Sollte hier eine leere Zelle vorkommen, brichst du den kompletten Code ab (Exit Sub) so dass (2) ListBox1 niemals eine Chance bekommt auch befüllt zu werden.

(2) ListBox1 befüllst du aus Worksheets("daten").Range("I5:I392"), auch hier mit einer rigorosen Abbruch-Bedingung.


Jetzt die Frage: Was genau möchtest du erreichen? Aus deiner Frage im Zusammenhang mit deinem Code werde ich nicht schlau.

Ich vermute, du möchtest eine der ListBoxen aus einem definiertem Range füllen, ab Zeile 5 und bis zur ersten leeren Zeile. Dabei möchtest du doppelte Einträge vermeiden.
- liege ich richtig?
- falls ja: WELCHE Listbox? (1) Listbox oder (2) ListBox1 ?

Wie auch immer: einen Musterdatei wäre sehr gut! Ich möchte dir keine halbseidene Lösung reinstricken, nur weil ich die Datenbasis nicht kenne.

Grüße,
Klaus M.vdT.


  

Betrifft: Frage zu "If Len(rngC) Then" von: Martin
Geschrieben am: 04.07.2013 18:01:41

Hallo,

ich habe eine allgemeine Frage zu folgender If-Abfrage:

If Len(rngC) Then

Warum muss es nicht heißen:
If Len(rngC) > 0 Then
?

Gehe ich recht in der Annahme, dass Null immer "Falsch" entspricht und bei jeder If-Abfrage mit Rückgabewert einer Zahl (wie in diesem Fall mit "LEN") ein "> 0" weggelassen werden kann, wenn das Ergebnis ungleich Null sein soll?

Viele Grüße

Martin


  

Betrifft: If Len(rngC) ergibt WAHR also <>0 kwT von: Matthias L
Geschrieben am: 04.07.2013 18:08:56




  

Betrifft: Danke! owT von: Martin
Geschrieben am: 04.07.2013 18:51:52

owT


  

Betrifft: hat sich gerade überschnitten ... kwT von: Matthias L
Geschrieben am: 04.07.2013 19:00:49




  

Betrifft: Hab ich Dich verwirrt ? von: Matthias L
Geschrieben am: 04.07.2013 18:59:56

Hallo

Hab ich Dich verwirrt?
If Len(rngC) ergibt WAHR also <>0 und das natürlich nur wenn ein Inhalt in der Zelle steht.
Deine Annahme ist also genau richtig: 0 = FALSCH (in VBA -> False)
Bei der IF-Abfrage wird alo (bei Inhalt) ein Wert >0 zurückgegeben und der ist WAHR
Also wird der IF-Zweig ausgeführt. Wäre die Zelle leer brächte Len(Zelle) 0(Null) als Ergebnis
und der Else-Zweig wird ausgeführt

Gruß Matthias


 

Beiträge aus den Excel-Beispielen zum Thema "Listbox"