Hilfe bei generierten ComboBoxen

Hallo liebe Leute,

ich bin ein Anfänger in VBA und folgendes Problem:
Ich möchte über 100 Spalten hinweg jeweils den gleichen Filter anhand von Comboboxen schreiben.

Ich habe herrausgefunden, wie VBA mir diese automatisch erstellt und an die Größe der Zelle anpasst:

(Habe zu Testzwecken noch keine 100 Boxen generiert, nur 7)

Sub NewCboBox1(i)
Dim rngZelle As Range
Set rngZelle = Cells(13, i)
Cells(13, i).Select
Set cbo = ActiveSheet.OLEObjects.Add( _
ClassType:=„Forms.ComboBox.1“, _
Link:=False, _
DisplayAsIcon:=False, _
Left:=Range(Cells(rngZelle.Row, 1), _
Cells(rngZelle.Row, rngZelle.Column - 1)). _
Width, _
Top:=Range(Cells(1, rngZelle.Column), _
Cells(rngZelle.Row - 1, rngZelle.Column)). _
Height, _
Width:=rngZelle.Width + 1, _
Height:=rngZelle.Height + 1).Object
End Sub

Sub erstelle_kombi()
For i = 26 To 32
NewCboBox1 (i)
Next i
End Sub

Auch habe ich die automatische beschriftung beim Start hinbekommen:

Private Sub Workbook_Open()
For i = 121 To 124 ’ 121-124 sind die indexe der Boxen
Set cbo2 = Worksheets(„Content_Liste“).OLEObjects.Item(i).Object
cbo2.List = _
Array(„all“, „red“, „blue“, „yellow“, „green“, „empty“)
Next i

nun stellt sich die Frage, wie ich zu den automatischen Einträgen auch die entsprechenden Makro’s zuweise.
Beim googln bin ich darauf gestoßen, dass man Klassenmodule erstellen soll. Das bekomme ich einfach nicht hin.

Ich brauche echt Hilfe!

Danke im Vorraus

Hallo D,

Sub NewCboBox1(i)
Dim rngZelle As Range

End Sub

man sieht du benutzt kein Option Explicit, ich kann dir sehr empfehlen, benutze es immer.
Probier mal diesen Code:

Sub NewCboBox1(i)
Dim rngZelle As Range, cbo As Object
Set rngZelle = Cells(13, i)
Set cbo = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", \_
 Link:=False, DisplayAsIcon:=False)
With cbo
 .Left = rngZelle.Left
 .Top = rngZelle.Top
 .Width = rngZelle.Width + 1
 .Height = rngZelle.Height + 1
End With
End Sub

Schau mal zu Add, ggfs kann Link und DisplayasIcon soeiso False ist wenn es nicht angegeben wird, könnte also ggfs. gelöscht werden die Angabe.

nun stellt sich die Frage, wie ich zu den automatischen
Einträgen auch die entsprechenden Makro’s zuweise.
Beim googln bin ich darauf gestoßen, dass man Klassenmodule
erstellen soll. Das bekomme ich einfach nicht hin.

Füge ein Klassenmodul ein, benenne es clsComboBox.

In das Klassenmodul schreibst du den Code für alle Comboboxen, z.B.:

Option Explicit

Public WithEvents CoBox As MSForms.ComboBox

Private Sub CoBox_Change()
MsgBox CoBox.Name & " - " & CoBox.Value
End Sub

Die Ereignisse für CoBox, hier das _Change-Ereignis wählst du analog zu _Change, _SelectionChange für ein Worksheet im Tabellenblattmodul halt hier für CoBox im Klassenmodul aus.

In ein Standardmodul, Modul1 o.ä. schreibst du

Option Explicit

Public MyComboBox() As New clsComboBox

Sub Verbinden()
' Code by Nepunmuk
Dim myOLEObject As OLEObject, intAnzahl As Integer
For Each myOLEObject In Worksheets("Tabelle1").OLEObjects
 If myOLEObject.ProgId = "Forms.ComboBox.1" Then
 intAnzahl = intAnzahl + 1
 ReDim Preserve MyComboBox(1 To intAnzahl)
 Set MyComboBox(intAnzahl).CoBox = myOLEObject.Object
 End If
Next
End Sub

Damit wird das Klassenmodul mit den ComboBoxen verbunden.
Das ist beim Start der Mappe nötig und immer dann wenn du im Klassenmodul etwas abgeändert hast. D.h. nach jeder Codeänderung im Klassenmodul mußt du die Prozedur Verbinden laufen lassen.

Zum Start, schreibe einfach in das Modul „DieseArbeitsmappe“

Option Explicit

Private Sub Workbook_Open()
Call Verbinden
End Sub

Gruß
Reinhard

Hallo Reinhard,

Danke für deine Hilfe.
Zuerst , Sorry, dass ich erst jetzt reagiere, aber war Krank…

Deine Idee klappt schon ganz gut, werde diesen Anstz auch benutzen!

jedoch habe ich mein Problem nicht gut beschrieben, wie ich gesehen habe…

Ich habe ca 117 Spalten, die ich jeweils mit einem Filter belegen möchte.
Also:

  • der Filter für Spalte 26 soll in dieser Zeile nach Farben in der Spalte 26 filtern
  • der Filter für Spalte 27 soll in dieser Zeile nach Farben in der Spalte 27 filtern
  • ect…

Ich werde weiter daran rumbasteln und hoffe auf weitere gute Ideen!

Viele Grüße
D

Ich habe es hinbekommen!
Das Du
„MsgBox CoBox.Name & " - " & CoBox.Value“
als Testanweisung hingeschrieben hast war echt genial!
Vielen Vielen Dank!!!

Ich habe die Anweisung in meinem Klassenmodul wie folgt geändert:

Option Explicit

Public WithEvents CoBox As MSForms.ComboBox

Private Sub CoBox_Change()
Dim i As Integer
Dim j As Integer
Dim cbo2 As ComboBox

MsgBox Mid(CoBox.Name, 9)

i = Mid(CoBox.Name, 9) + 24
MsgBox i
MsgBox Mid(CoBox.Name, 9)
Select Case CoBox.Text
Case „all“
Filter_zu (i)
Case „red“
Rot (i)
Case „yellow“
Gelb (i)
Case „green“
Gruen (i)
Case „empty“
leer (i)
End Select
End Sub

wobei z.B Rot (i) als einfaches Modul hinterlegt ist, mit folgenden Befehl:

Sub Rot(i)
’ Rot Makro
ActiveSheet.Range("$A$11:blush:EH$300").AutoFilter Field:=i, Criteria1:=„r“
End Sub

Vieleicht gibt es da schönere wege, der funzt aber.

PS: er filtert nach r, da ich eine bedingte formatierung hinterlegt habe, die das feld rot färbt, wenn ein r eingegeben wird.