Moin Officer! ALso die Sub dient zum Einlesen der Daten in die LIstbox auf einer Userform. Hätte man auch in die Userform.initialize packen können. Da wäre alles gleich zusammen und man muss keine extra Sub starten. Aber egal. Unten mal mit einigen Kommentaren. VG
Sub Dia_Init()
' Die SUB initiiert eine Listbox in einer Userform - beschreibt sie also mit Werten.
'Dazu liest die Prozedur aus einem Blatt Liste in Spalte A die Zeilen aus, bis eine leere Zeile kommt.
' Es wird in Zeile 3 begonnen. Wenn ein WErt gefunden wird, wird das Jahr des Eintrages in ein Datenfeld geschrieben.
' Im Anschluß wird das Datenfeld an die Listbox übergeben und die Userform1 angezeigt. DAnn sollten die Jahre in der Box sein.
Dim Jahre() 'ist ein Datenfeld
Dim Zähler As Integer
'DAtenfeld initiieren, erstmal auf 0.
Zähler = 0
ReDim Preserve Jahre(Zähler)
Jahre(Zähler) = Null
'Startwert für doe Zeile
x = 3
' Hier wird die gesamte Liste Eintrag für Eintrag durchlaufen, aber halt erst ab Zeile 3 - es gibt nämlich eine Überschrift und danach eine Leerzeile.
While Not IsEmpty(Sheets("Liste").Cells(x, 1).Value)
' Hier wird dem Datenfeld Jahre ein Wert zugefügt.
If IsNull(Jahre(Zähler)) Then 'prüft, ob der letzte Eintrag im Datenfeld leer ist
'wenn ja, dann einfach das Jahr in dieses Feld eintragen
Jahre(Zähler) = Year(Sheets("Liste").Cells(x, 1).Value)
ElseIf (Jahre(Zähler)) <> Year(Sheets("Liste").Cells(x, 1).Value) Then 'hier wird nochmal geprüft, ob der letzte Wert nicht schon das Jahr ist
'ist nicht das selbe Jahr wie in de Zelle also eintragen
'Zähler hochsetzten, Datenfeld neu dimensioniern und dann im zugefügten Feld das neue Jahr eintragen
Zähler = Zähler + 1
ReDim Preserve Jahre(Zähler)
Jahre(Zähler) = Year(Sheets("Liste").Cells(x, 1).Value)
End If
'in die nächste Zeile
x = x + 1
Wend 'die SChleife geht so lange, bis eine leere Zelle kommt
'jetzt die Jahre aus dem Datenfeld an die LIstbox übergeben.
If IsNull(Jahre(0)) Then 'prüfen ob das Datenfeld was enthält. Wenn im ersten Feld Null steht, ist es leer
' wenn das Feld leer ist, wird die Box hier geleert, dabei wird geprüft, wieviele Einträge sie hat und dann von unten nach oben
' jeder Eintrag rausgenommen.
' wäre mE kürzer mit UserForm1.ListBox1.clear auch gegangen.
While UserForm1.ListBox1.ListCount >= 1 'solange machen, wie Einträge vorhanden sind, Listcount gibt die Anzahl an
If UserForm1.ListBox1.ListIndex = -1 Then 'wenn das aktive Feld der Listbox nichtgesetzt ist, dann auf dem letzten Wert setzen
UserForm1.ListBox1.ListIndex = UserForm1.ListBox1.ListCount - 1 'setzt auf den letzen Wert, Da die Zählung bei 0 beginnt, wird -1 gerechnet
End If
UserForm1.ListBox1.RemoveItem (UserForm1.ListBox1.ListIndex) 'jetzt das Element das ausgewählt ist löschen
Wend
'jetzt solle die Box leer sein. Wie geschrieben, könnte auch kürzer und damit schneller gehen
Else
'DAtenfeld enthält wert, dann das Feld direkt zuweisen. DAmit stehen alle Werte drin
UserForm1.ListBox1.List() = Jahre()
'Userform anzeigen, damit man die Jahre auswählen kann
UserForm1.Show
End If
End Sub
|