AW: Userform, Steuerelemente hinzufügen
25.07.2013 11:16:20
fcs
Hallo kultnoob,
das Sortieren funktioniert innerhalb der Tabelle mit der Entsprechenden Excelfunktion einfacher, als Arrays im Code umzusortieren.
Ich hab das jetzt so gelöst.
1. Ich hab ein zusätzliches Array für die Anzahlwerte deklariert.
2. Beim Erstellen der Arrays für die Textboxen, denen ein Comboboxeintrag zugeordnet wurde, werden auch die Anzahlwerte aus Spalte B eingelsen
3. Die Auswahlliste der Comboboxen wird vom 0. bis zum vorletzten Eintrag abgearbeitet.
Dabei werden ab Zeile 22 die Textboxwerte in Spalte D, die Anzahlwerte in Spalte E und der Comboboxwerte in Spalte F eingetragen.
4. Der Zellbereich mit den eingetragenen Werten wird sortiert.
Die passende Sortierung muss du ggf. noch ändern.
5. Die Werte mit den Comboxeinträgen werden wieder gelöscht in Spalte F
6. Für den letzten Combobox-Auswahlwert wird die Summe gebildet und in die Folgezeile eingetragen.
Gruß
Franz
Private Sub cmbFertig_Click()
Dim Zeile As Long, b, Zeile_L As Long
Dim arrWerteBox(), arrWerteCombo() As String, arrAnzahl(), Summe_Letzte
With ActiveWorkbook.Sheets(2)
'Texboxwerte und Comboboxauswahlen in Arrays einlesen
b = 0
Zeile_L = 21
For Zeile = 22 To .UsedRange.Rows.Count
If .Cells(Zeile, 1) "" Then
Zeile_L = Zeile
b = b + 1
ReDim Preserve arrWerteBox(1 To b)
ReDim Preserve arrWerteCombo(1 To b)
ReDim Preserve arrAnzahl(1 To b)
arrWerteBox(b) = Me.Controls("TextBox" & b)
If Me.Controls("ComboBox" & b).ListIndex -1 Then
arrWerteCombo(b) = Me.Controls("ComboBox" & b).Value
End If
arrAnzahl(b) = .Cells(Zeile, 2) 'Anzahl aus Spalte B einlesen
End If
Next Zeile
'Zeilen mit Daten ab Zeile 22 in Spalte 4 (D)
Zeile_L = 21
With Me.Controls("ComboBox" & 1)
'Liste der Combobox-Auswahlwerte abarbeiten bis vorletzen Eintrag
For Zeile = 0 To .ListCount - 2
For b = 1 To UBound(arrWerteCombo)
If arrWerteCombo(b) = .List(Zeile, 0) Then
Zeile_L = Zeile_L + 1
ActiveWorkbook.Sheets(2).Cells(Zeile_L, 4) = arrWerteBox(b)
ActiveWorkbook.Sheets(2).Cells(Zeile_L, 5) = arrAnzahl(b)
ActiveWorkbook.Sheets(2).Cells(Zeile_L, 6) = arrWerteCombo(b)
End If
Next b
Next
End With
'Sortieren
If Zeile_L > 22 Then
With .Range(.Cells(22, 4), .Cells(Zeile_L, 6))
'Sortieren nach Wert aus Spalte A
.Sort key1:=.Range("A1"), order1:=xlAscending, Header:=xlNo
'oder
'Sortieren nach Eintrag in Combobox und Wert aus Spalte A
' .Sort key1:=.Range("C1"), order1:=xlAscending, _
key2:=.Range("A1"), Order2:=xlAscending, Header:=xlNo
End With
End If
'Comboboxeinträge in Tabelle wieder löschen
.Range(.Cells(22, 6), .Cells(Zeile_L, 6)).ClearContents
'Anzahl-Werte zu Textboxen mit letztem Comboboxeintrag aufsummieren
With Me.Controls("ComboBox" & 1)
Summe_Letzte = 0
For b = 1 To UBound(arrWerteCombo)
If arrWerteCombo(b) = .List(.ListCount - 1, 0) Then
Summe_Letzte = Summe_Letzte + arrAnzahl(b)
End If
Next b
Zeile_L = Zeile_L + 1
ActiveWorkbook.Sheets(2).Cells(Zeile_L, 4) = .List(.ListCount - 1, 0)
ActiveWorkbook.Sheets(2).Cells(Zeile_L, 5) = Summe_Letzte
ActiveWorkbook.Sheets(2).Cells(Zeile_L, 6).ClearContents
End With
'restliche Zeilen leeren in Spalte D bis F
Do Until .Cells(Zeile_L, 1) = ""
Zeile_L = Zeile_L + 1
.Range(.Cells(Zeile_L, 4), .Cells(Zeile_L, 6)).ClearContents
Loop
End With
'Unload Me
End Sub