Hallo Helmut, Servus
ich fühle mich geehrt das du von uns beiden den Code auskommentiert haben möchtest um VBA zu lernen.
Das begrüsse ich immer, macht dich selbstaendiger im Umgang mit VBA. meinen Teil kommentiere ich dir.
Was Herbert Grom angeht ist sein: - Set hsh = CreateObject("Scripting.Dictionary") - technisch fortschrittlicher.
Hier gebe ich offen zu das mir jedes Fachwissen dazu fehlt, weil mein Wissen aus der Zeit von Excel 7, 97, 2003 stammt, manche Befehle von Kollegen als technisch überaltert angesehen werden. Aus Kompatilitaets Gründen, weil viele alte Dateien auf dem Markt sind, bleibt diese Programmiersprache bestehen! Für Anfaenger ist sie vielleicht sogar leichter zu verstehen!
Hier also das was ich dir technisch kommentieren kann, das andere wie Set hcs muss dir Herbert bitte selbst erklaeren.
mfg Piet
Original Beispiel von Herbert Grom, ComboBox2 von mir erweitert auf 3 Spalten: - (für Lagerplatz direkt Anzeige)
Private Sub ComBox_Haus_Change()
'Original Code von Herbert Grom für "ComBox_Laenge"
'** von mir auf 3 Spalten erweitert um den Lagerplatz direkt mit anzuzeigen
LoAnzahl = Application.WorksheetFunction.CountIf(wksDB.Range("N4:N" & Loletzte), ComBox_Haus. _
Value)
LoFirstRow = Application.Match(ComBox_Haus.Value, wksDB.Range("N1:N" & Loletzte), 0)
Set hsh = CreateObject("Scripting.Dictionary")
'alte Original ComboBox von Herber Grom auf 3 Spalten erweitert
With ComBox_Laenge
.Clear: n = 0
For LoRowIn = LoFirstRow To LoFirstRow + LoAnzahl - 1
If wksDB.Cells(LoRowIn, 17).Text "" Then
.AddItem wksDB.Cells(LoRowIn, 17)
'2. Spalte für Leitern Art
.List(n, 1) = wksDB.Cells(LoRowIn, 20)
'3. Spalte wird mit Lagerplatz befüllt
.List(n, 2) = wksDB.Cells(LoRowIn, 7)
n = n + 1
End If
Next LoRowIn
End With
End Sub
Hier der kommentierte Code von UserForm1, meine eigene ListBox Version:
'Original Code von Herbert Grom! - auf ListBox überarbeitet von Piet
Public Loletzte&, LoFirstRow&
Dim LoRowIn&, LoAnzahl&, LoMatch&, hsh As Object, i%, iOrtCount%
Dim WKS As String, Txt As String, n As Integer 'neue Variable
Private Sub ListBox2_Click()
End Sub
Private Sub UserForm_Initialize()
'** Diese Programmiertechnik ist mir völlig neu, ich kann sie technisch nicht erklaeren!
Set hsh = CreateObject("Scripting.Dictionary")
With wksDB
Loletzte = IIf(IsEmpty(.Cells(Rows.Count, 2)), .Cells(Rows.Count, 2).End(xlUp).Row, Rows. _
Count)
For i = 4 To Loletzte
If .Cells(i, 1).Text "" Then hsh(.Cells(i, 1).Text) = 0
Next
End With
ListBox1.List = Application.Transpose(hsh.Keys)
ComboBox1.ListIndex = -1 'ComboBo Anzeige löschen
ListBox1.SetFocus
End Sub
Private Sub ListBox1_Click()
'Variable von Herbert Grom übernommen
Loletzte = IIf(IsEmpty(wksDB.Cells(Rows.Count, 2)), wksDB.Cells(Rows.Count, 2).End(xlUp).Row, _
Rows.Count)
LoAnzahl = Application.WorksheetFunction.CountIf(wksDB.Range("N4:N" & Loletzte), ListBox1. _
Value)
LoFirstRow = Application.Match(ListBox1.Value, wksDB.Range("N1:N" & Loletzte), 0)
'** die Progarmmierung über .AddItem ist technisch vielleicht altmodisch, überholt, sie _
funktioniert aber einwandfrei!
'** sie stammt aus der Zeit Excel 7,97,2003, kann weg. Kommpatibilitaet mit alten Excel _
Dateien nicht abgeschafft werden!
'ListBox1 befüllt beim Klick ListBox2 und löscht ComboBox1
With ListBox2 '** ListBox2 hat 4 Spalten!!
.Clear: n = 0: Txt = "" '** Txt ist überflüssig, kann gelöcht werden!
ComboBox1.Clear 'ComboBox Inhalt immer löschen
'Schleife zum ListBox1 füllen
For LoRowIn = LoFirstRow To LoFirstRow + LoAnzahl - 1
'nur laden wenn Gebaeude Text vorliegt
If wksDB.Cells(LoRowIn, 17).Text "" Then
'Werkstoff Nummer (nur 2.Stelle!) ermitteln = (0,1,2,3) als Zahl für Cells(WKS+4)
WKS = Mid(wksDB.Cells(LoRowIn, 3), 2, 1) 'Zahl zum laden aus Matrix "H" ( _
Werkstoff)
.AddItem wksDB.Cells(LoRowIn, 17) 'Laenge füllen Spalte "Q"
.List(n, 1) = Matrix.Cells(WKS + 4, 8) 'Werkstoff aua Matrix "H" laden (WKS+4)
.List(n, 2) = wksDB.Cells(LoRowIn, 20) 'Leitern Art laden Spalte T
.List(n, 3) = wksDB.Cells(LoRowIn, 7) 'Lagerraum laden Spalte "G"
n = n + 1 'ComboBox direkt mitladen
'in ComboBox: Leiter Länge laden Spalte "U" (sortiert, ohne doppelte!)
If wksDB.Cells(LoRowIn, 21) > 0 Then _
ComboBox1.AddItem wksDB.Cells(LoRowIn, 21)
End If
Next LoRowIn
End With
Label2 = n & " Leitern vorhanden"
End Sub
Private Sub ComboBox1_Change()
If ComboBox1.Text = "" Then Exit Sub
'Variable von Herbert Grom übernommen
Loletzte = IIf(IsEmpty(wksDB.Cells(Rows.Count, 2)), wksDB.Cells(Rows.Count, 2).End(xlUp).Row, _
Rows.Count)
LoAnzahl = Application.WorksheetFunction.CountIf(wksDB.Range("N4:N" & Loletzte), ListBox1. _
Value)
LoFirstRow = Application.Match(ListBox1.Value, wksDB.Range("N1:N" & Loletzte), 0)
'ComboBox1 befüllt beim Klick ListBox2 mit gewünschter Leiter Länge in meter
With ListBox2
.Clear: n = 0
For LoRowIn = LoFirstRow To LoFirstRow + LoAnzahl - 1
'Befüllung der ListBox .List(n) wie oben kommentiert!
'hier in Abhaengigkeit von der gewünschten Leiter Länge!!
If wksDB.Cells(LoRowIn, 17).Value = ComboBox1.Text Then
WKS = Mid(wksDB.Cells(LoRowIn, 3), 2, 1)
.AddItem wksDB.Cells(LoRowIn, 17)
.List(n, 1) = Matrix.Cells(WKS + 4, 8)
.List(n, 2) = wksDB.Cells(LoRowIn, 20)
.List(n, 3) = wksDB.Cells(LoRowIn, 7)
n = n + 1
End If
Next LoRowIn
End With
Label2 = n & " Leitern vorhanden"
End Sub