10.09.2015, 13:52
Hallo,
ich bin neu hier und auch nicht ganz so bewandert in VBA. Allerdings kann ich mir hin und wieder auch vorgegebenen Code für meine Bedürfnisse anpassen, was in diesem Fall aber nicht ganz nach meinen Vorstellungen funktioniert.
Ausgangslage:
Im Tabellenblatt „Daten für die Auswertung“ stehen in meiner angehängten Beispieldatei in jeder Spalte unsortierte und auch doppelt vorkommende Werte.
Aufgabe:
Im Tabellenblatt „Kriterien“ möchte ich nun für jede einzelne Spalte in „Daten für die Auswertung“ ein eigenes Dropdown-Feld zur Auswahl der Daten haben. Hierbei sollen die Daten je nach Art entweder numerisch oder alphabetisch sortiert sein und keine Duplikate innerhalb jedes Dropdown-Feldes enthalten.
Mein Lösungsansatz:
Über ein im Internet gefundenes und von mir angepasstes Makro pro Spalte lasse ich mir die Daten in das Tabellenblatt „Hilfsdaten“ entsprechend sortiert kopieren. Das funktioniert soweit auch ganz prima.
Die in Spalte A angezeigte Liste bekomme ich wiederum über einen gefundenen und modifizierten VBA-Code in die ComboBox „CmbBoxAuftraggeber“ auf dem Tabellenblatt „Kriterien“. Wenn ich dort einen Wert auswähle, schreibt er sich automatisch in eine extra Zelle mit Namen „krtAuftraggeber“ auf dem gleichen Tabellenblatt, das ich dann hinterher in weiteren Schritten dort auslesen möchte.
So weit, so gut.
Mein Problem:
Wenn ich jetzt versuche, den gleichen Weg für die ComboBox „cmbBoxAuftragsart“ analog einzusetzen, bekomme ich in der ComboBox nicht die von mir gewünschten Werte, sondern immer die drei ersten Einträge aus Spalte A und nicht aus Spalte B zur Auswahl. Hier mal der "duplizierte Code, der nicht das gewünschte Ergebnis bringt:
Ich gehe mal ganz stark davon aus, dass es nur ein minimales Problem in der Syntax ist, da der Code ja bei der ersten ComboBox funktioniert, aber dafür sind meine VBA-Kenntnisse dann doch zu gering.
Ich würde mich sehr freuen, wenn mir jemand hier helfen und vielleicht sogar meinen Fehler finden könnte J Gerne nehme ich auch Tipps entgegen, wie ich mein Vorgehen noch optimieren könnte. Ganz wichtig scheint mir auch noch die Tatsache zu sein, dass es sich im Original um deutlich mehr Datensätze (ca. 30.000) handelt, als im Beispiel.
2015-09-10 Filtern und Listen_ComboBox_neutral.xlsm (Größe: 80,4 KB / Downloads: 8)
Herzlichen Dank für die Unterstützung schon mal vorab und falls ich irgendetwas vergessen habe zu erklären, dann lasst es mich wissen
VBA4Beginner
ich bin neu hier und auch nicht ganz so bewandert in VBA. Allerdings kann ich mir hin und wieder auch vorgegebenen Code für meine Bedürfnisse anpassen, was in diesem Fall aber nicht ganz nach meinen Vorstellungen funktioniert.
Ausgangslage:
Im Tabellenblatt „Daten für die Auswertung“ stehen in meiner angehängten Beispieldatei in jeder Spalte unsortierte und auch doppelt vorkommende Werte.
Aufgabe:
Im Tabellenblatt „Kriterien“ möchte ich nun für jede einzelne Spalte in „Daten für die Auswertung“ ein eigenes Dropdown-Feld zur Auswahl der Daten haben. Hierbei sollen die Daten je nach Art entweder numerisch oder alphabetisch sortiert sein und keine Duplikate innerhalb jedes Dropdown-Feldes enthalten.
Mein Lösungsansatz:
Über ein im Internet gefundenes und von mir angepasstes Makro pro Spalte lasse ich mir die Daten in das Tabellenblatt „Hilfsdaten“ entsprechend sortiert kopieren. Das funktioniert soweit auch ganz prima.
Code:
Sub Auftraggeber_ohne_duplikate_sortiert_kopieren()
Dim lngLetzteAuftraggeber As Long
Worksheets("Hilfsdaten").Columns("A").ClearContents 'Inhalte der Spalte A in Tabelle "Hilfsdaten" löschen
'Mit dem Spezialfilter Spalte M aus Tabelle "Daten für die Auswertung" ohne Duplikate
'in Spalte A der Tabelle "Hilfsdaten" kopieren
With Sheets("Daten für die Auswertung")
lngLetzteAuftraggeber = .Cells(.Rows.Count, "M").End(xlUp).Row
Sheets("Daten für die Auswertung").Range("M1:M" & lngLetzteAuftraggeber).AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=Sheets("Hilfsdaten").Range("A1"), Unique:=True
End With
'aufgezeichneter und nachbehandelter Code zum Sortieren der Spalte A
With Sheets("Hilfsdaten")
lngLetzteAuftraggeber = .Cells(.Rows.Count, "A").End(xlUp).Row
.Range("A1:A" & lngLetzteAuftraggeber).ClearFormats 'Formate löschen
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=Range("A1"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With .Sort
.SetRange Range("A1:A" & lngLetzteAuftraggeber)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
lngLetzteAuftraggeber = .Cells(.Rows.Count, "A").End(xlUp).Row
End With
End Sub
Die in Spalte A angezeigte Liste bekomme ich wiederum über einen gefundenen und modifizierten VBA-Code in die ComboBox „CmbBoxAuftraggeber“ auf dem Tabellenblatt „Kriterien“. Wenn ich dort einen Wert auswähle, schreibt er sich automatisch in eine extra Zelle mit Namen „krtAuftraggeber“ auf dem gleichen Tabellenblatt, das ich dann hinterher in weiteren Schritten dort auslesen möchte.
Code:
Private Sub CmbBoxAuftraggeber_DropButtonClick()
'Variable deklarieren
Dim WiederholungenAuftraggeber As Integer
'Schleife zum Füllen der ComboBox mit den Daten aus Blatt "Hilfsdaten"
'Spalte A ab Zeile 2 bis zur letzten gefüllten Zeile
For WiederholungenAuftraggeber = 2 To Sheets("Hilfsdaten").Range("A65536").End(xlUp).Row
CmbBoxAuftraggeber.AddItem Sheets("Hilfsdaten").Cells(WiederholungenAuftraggeber, 1)
Next
End Sub
Private Sub CmbBoxAuftraggeber_Click()
Range("krtAuftraggeber").Value = CmbBoxAuftraggeber.Value
End Sub
So weit, so gut.
Mein Problem:
Wenn ich jetzt versuche, den gleichen Weg für die ComboBox „cmbBoxAuftragsart“ analog einzusetzen, bekomme ich in der ComboBox nicht die von mir gewünschten Werte, sondern immer die drei ersten Einträge aus Spalte A und nicht aus Spalte B zur Auswahl. Hier mal der "duplizierte Code, der nicht das gewünschte Ergebnis bringt:
Code:
Private Sub CmbBoxAuftragsart_DropButtonClick()
'Variable deklarieren
Dim WiederholungenAuftragsart As Integer
'Schleife zum Füllen der ComboBox mit den Daten aus Blatt "Hilfsdaten"
'Spalte B ab Zeile 2 bis zur letzten gefüllten Zeile
For WiederholungenAuftragsart = 2 To Sheets("Hilfsdaten").Range("B65536").End(xlUp).Row
CmbBoxAuftragsart.AddItem Sheets("Hilfsdaten").Cells(WiederholungenAuftragsart, 1)
Next
End Sub
Private Sub CmbBoxAuftragsart_Click()
Range("krtAuftragsart").Value = CmbBoxAuftragsart.Value
End Sub
Ich gehe mal ganz stark davon aus, dass es nur ein minimales Problem in der Syntax ist, da der Code ja bei der ersten ComboBox funktioniert, aber dafür sind meine VBA-Kenntnisse dann doch zu gering.
Ich würde mich sehr freuen, wenn mir jemand hier helfen und vielleicht sogar meinen Fehler finden könnte J Gerne nehme ich auch Tipps entgegen, wie ich mein Vorgehen noch optimieren könnte. Ganz wichtig scheint mir auch noch die Tatsache zu sein, dass es sich im Original um deutlich mehr Datensätze (ca. 30.000) handelt, als im Beispiel.
2015-09-10 Filtern und Listen_ComboBox_neutral.xlsm (Größe: 80,4 KB / Downloads: 8)
Herzlichen Dank für die Unterstützung schon mal vorab und falls ich irgendetwas vergessen habe zu erklären, dann lasst es mich wissen
VBA4Beginner