Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Auswahl in ComboBox nur mit angezeigten Spalten

Forumthread: Auswahl in ComboBox nur mit angezeigten Spalten

Auswahl in ComboBox nur mit angezeigten Spalten
RainerK
Hallo,
komme bei einer Auswahl mittels ComboBox nicht so recht weiter.
Habe im Sub UserForm_Initialize()

'Button [ AUSWAHL TREFFEN ]
Dim meAr
Dim icolL As Integer
icolL = GetLastColumn() - 2
With Sheets("vergleich")
meAr = .Range(.Cells(19, 7), .Cells(24, icolL)) 'Dein Bereich
End With
With Me.ComboBox1
.Text = Cells(25, 7)
.ColumnCount = 6
.ColumnWidths = "65Pt;65Pt;65Pt;0Pt;0Pt;20Pt"
.List = Application.Transpose(meAr)
End With
End Sub
Die selben Spalten habe ich in einer UserForm zuvor ausgewählt.
In der zweiten UserForm hätte ich jedoch nun gerne nur die aufgrund der ersten UserForm ausgewählten Spalten, also die, welche im Arbeitsblatt zwischen G und icoL angezeigt werden.
Vorsorglich Beispieltabelle: https://www.herber.de/bbs/user/71130.xlsm
Gruß Rainer
Anzeige
AW: Auswahl in ComboBox nur mit angezeigten Spalten
19.08.2010 15:58:10
fcs
Hallo Rainer,
irgendwie ist mir die von dir gewünschte Reihenfolge unklar, in der die die Userforms angezeigt werden sollen.
Wenn du in einer Combobox oder Listbox nicht alle Datenanzeigen willst, dann kannst du nicht mehr den gesamten Zellbereich in ein Array laden und der Box als Auswahlliste zusweisen.
Bei kleineren Listen ist dann die einfachste Methode die gewünschten Einträge auf Basis von Kriterien per AddItem-Methode den Boxen zuzuweisen. Zusätzlich sollte man in einer weiteren Spalte der Box (ColumnWidths-Wert für diese Spalte dann auf null setzen) die Spalte oder Zeile im Tabellenblatt speichern in aus der der Wert eingelesen wurde. So hat man bei Auswahl von Listeneinträgen diese zur Verfügung
Gruß
Franz
'Code frmAuswahl
Private icolL As Integer
Private Sub CommandButton1_Click()
'    Cells(2, 7) = "Test" 'Cells(1, (8 + Me.ComboBox1.ListIndex))
With Range(Cells(7, 7), Cells(7, icolL)) 'Bereich mit ja-Einträgen
'vorhandene Ja's löschen
.ClearContents
'Ja's in Zeile 7 setzen
If Me.ComboBox1.ListIndex  -1 Then .Cells(1, Me.ComboBox1.ListIndex + 1).Value = "ja"
If Me.ComboBox2.ListIndex  -1 Then .Cells(1, Me.ComboBox2.ListIndex + 1).Value = "ja"
If Me.ComboBox3.ListIndex  -1 Then .Cells(1, Me.ComboBox3.ListIndex + 1).Value = "ja"
End With
Unload Me
frmProducts.Show
End Sub
Private Sub UserForm_Initialize()
Dim meAr
icolL = GetLastColumn() - 2
With Sheets("vergleich")
meAr = .Range(.Cells(19, 7), .Cells(24, icolL)) 'Dein Bereich
End With
With Me.ComboBox1
.Text = Cells(25, 7)
.ColumnCount = 6
.ColumnWidths = "65Pt;65Pt;65Pt;0Pt;0Pt;20Pt"
.List = Application.Transpose(meAr)
End With
With Me.ComboBox2
.Text = Cells(25, 7)
.ColumnCount = 6
.ColumnWidths = "65Pt;65Pt;65Pt;0Pt;0Pt;20Pt"
.List = Application.Transpose(meAr)
End With
With Me.ComboBox3
.Text = Cells(25, 7)
.ColumnCount = 6
.ColumnWidths = "65Pt;65Pt;65Pt;0Pt;0Pt;20Pt"
.List = Application.Transpose(meAr)
End With
End Sub
'Code frmProducts
Option Explicit
Private Sub cmdCancel_Click()
Unload Me
End Sub
Private Sub cmdOK_Click()
Dim iLst As Integer
'gewählte Spalten einblenden
For iLst = 0 To lstProdukte.ListCount - 1
If lstProdukte.Selected(iLst) Then
Columns(CLng(lstProdukte.List(iLst, 1))).Hidden = False
Else
'in nicht gewählten Spalten "ja" löschen
Cells(7, CLng(lstProdukte.List(iLst, 1))).ClearContents
End If
Next iLst
Unload Me
End Sub
Private Sub cmdTOP_Click()
Unload Me
'   frmTOP.Show  '? Userform gibt es nicht
End Sub
Private Sub UserForm_Initialize()
Dim iCol As Integer, icolL As Integer, iLst As Integer
Dim sTxt As String
icolL = GetLastColumn()
Range(Cells(1, 7), Cells(1, icolL)).EntireColumn.Hidden = True
With lstProdukte
.Clear
.ColumnCount = 2
.ColumnWidths = "150pt;0Pt"
End With
For iCol = 7 To icolL
If Cells(7, iCol).Value = "ja" Then
If IsEmpty(Cells(10, iCol)) Then
lstProdukte.AddItem Cells(9, iCol).Value
Else
lstProdukte.AddItem Cells(9, iCol).Value & " - " & Cells(10, iCol).Value
End If
'Spaltennummer in 2. ausgeblendeter Spalte der Listbox eintragen
lstProdukte.List(lstProdukte.ListCount - 1, 1) = iCol
lstProdukte.Selected(lstProdukte.ListCount - 1) = True
End If
Next iCol
End Sub

Anzeige
AW: Auswahl in ComboBox nur mit angezeigten Spalten
19.08.2010 17:48:35
RainerK
Hallo Franz,
vielen Dank für Deine Ausführungen und Deine Mithilfe.
Kann leider nicht gleich testen; melde mich sobald ich Deinen Code eingebaut habe.
Gruß RainerK
AW: Auswahl in ComboBox nur mit angezeigten Spalten
20.08.2010 08:41:49
RainerK

Franz: irgendwie ist mir die von dir gewünschte Reihenfolge unklar, in der die die Userforms angezeigt werden sollen.

Hallo Franz,
die UserFormen werden nicht in der Reihenfolge aufgerufen wie diese im VBA-Editor abgebildet sind.
Im Arbeitsblatt ruft der erste Button [ Produkte auswählen ] die UserForm "frmProducts" auf.
Diese Liste kann dann beliebig verändert werden.
Als nächstes könnte mit Button 2 dann wieder alle oder aber (und hier ist mein Problem) mit Button 3 [ Auswahl treffen ] eine Wertigkeit festgelegt werden.
In [ Auswahl treffen ] möchte ich dann in den ComboBoxen nur die Spalten haben, welche auf dem Arbeitsblatt angezeigt werden. Sollte dafür eine "Merkzelle" erforderlich sein, könnte man die Zeile 13 dafür nutzen. Die Standardauswahl (Zeile 7 = ja) soll als solche unverändert bleiben.
Im Ansatz wäre dies dann vermutlich so in etwa:
frmProducts.show
lstProdukte_Click()
angehaktes Produkt = Merkzeichen "x" in cells(13, iCol)
nicht angehaktes = Merkzeichen wieder löschen
frmAuswahl.show
For iCol = 7 to icolL
If .cells(13, iCol) = "x" Then meAr = .Range(.cells(19, iCol), .Cells(24, icolL))
next iCol

Nur so hätte ich ja vermutlich nur die letzte Spalte und mit .AddItem mit meAr hatte zuvor leider auch nicht funktioniert.
Hoffe, dass ich es so verständlich rüber gebracht habe.
Gruß RainerK
Anzeige
AW: Auswahl in ComboBox nur mit angezeigten Spalten
20.08.2010 23:40:22
fcs
Hallo Rainer,
ich denke jetzt sollte es in der gewünschten Form funktionieren. In Zeile 13 werden für die engere Auswahl die Zahlen 1, 2 und 3 eingetragen.
Gruß
Franz
AW: ... und hier noch die Datei
21.08.2010 10:45:19
RainerK
Hallo Franz,
klasse, das war genau die Hilfe in die richtige Richtung.
Habe mir das ganze (laienhaft mit Copy von Initialize in ComboBox1 und ..2) noch abgeändert.
Funktioniert, solange ich mindestens drei Produkte ausgewählt habe.
Mit nur einem habe ich dann leider einen Fehler den ich bei

ReDim meAr (1 To iLst, 1 To 7) 
noch abfangen müsste.
Hatte an

iLst > 1 Then ReDim meAr(1 To iLst, 1 To 7) 
gedacht. Dann kommt allerdings ein Syntaxfehler.
Könnte ich Deine Hilfe nochmals in Anspruch nehmen?
Hier meine geänderte Tabelle: https://www.herber.de/bbs/user/71162.xls
Gruß Rainer
Anzeige
AW: ... und hier noch die Datei
21.08.2010 10:56:02
RainerK
Schande,
habe ja "If" vergessen.
Hat sich erledigt.
Nochmals vielen Dank für Deine Hilfe.
Gruß Rainer
noch ein Bug
21.08.2010 12:00:31
RainerK
Hallo,
funktioniert bis auf eine Kleinigkeit alles einwandfrei.
Nun habe ich lediglich noch eines abzufangen:
Habe ich z. B. nur zwei Produkte ausgewählt und die Auswahl über die ComboBox1 und ..Box2 getroffen, bricht der Code ab, wenn ich nochmal auf die ComboBox1 klicke.
Selbiges gilt, wenn ich mehrere Produkte ausgewählt habe und bei ComboBox1 wieder klicke.
Meine Idee:
Sperre mit Click der jeweiligen ComboBox diese mit

Me.ComboBox.visible=false 
und füge einen neuen Button für [ Neue Auswahl ] hinzu.
Der Code des Button's wäre dann vermutlich
unload me
frmAuswahl.show
Alternativ wäre ein Refresh o.ä..
Was wäre geeignet?
Gruß Rainer
Meine Änderungen: https://www.herber.de/bbs/user/71163.xls
Anzeige
AW: noch ein Bug
21.08.2010 17:50:10
fcs
Hallo Rainer,
ich die Datei nochmals angepasst und optimiert.
Geändert sind die Prozedur "Auswahl" und der Code von "frmAuswahl"
Wesentlich im Userform:
1. Alle Funktionalitäten, du du scheinbar nicht benötigst sind wieder gelöscht.
2. Änderungen in Combobox1 und 2 werden immer direkt in die Tabelle geschrieben. Ein vorhandener Eintrag ("1. Wahl" bzw. "2.Wahl") wird vorher durch "ja" ersetzt.
3. Die Daten für das Array "meAr" werden in der separaten Function "JaArray" berechnet. Ist übersichtlicher, da meAr in mehreren Prozduren neu berechnet werden muss.
4. Die Logik der Dateneingabe in den Comboboxen ist optimiert.
- 1. Wahl muss immer als erstes ausgewählt werden.
- bei nachträgliche Änderungen in Combobox 1 oder 2 wird geprüft, ob Combobox 2 und/oder 3 ihren Wert wiederbekommen oder zurückgesetzt werden (keine Doppelauswahl möglich).
Textdatei mit Code:
https://www.herber.de/bbs/user/71173.txt
Gruß
Franz
Anzeige
AW: noch ein Bug
22.08.2010 10:01:55
RainerK
Hallo Franz,
ein dickes Dankeschön für Deine Mühe, mir den Code proffesionell umzubauen.
Auf Deine ? bei 'Nicht gewählte Spalten ausblenden:
In der Originaldatei ist dieses Arbeitsblatt ein Auszug an Leistungen (Vorauswahl).
Die Werte (1.Wahl, 2.Wahl und 3.Wahl) werden in das Folgearbeitsblatt (Detailansicht) übernommen.
Dort werden dann nur diese Produkte betrachtet.
Habe wieder einiges dazugelernt.
Vielen Dank
Gruß Rainer
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Auswahl in ComboBox nur mit angezeigten Spalten


Schritt-für-Schritt-Anleitung

  1. UserForm initialisieren: Im UserForm_Initialize() kannst du die ComboBox mit den gewünschten Daten füllen. Verwende dafür den folgenden Code:

    Dim meAr
    Dim icolL As Integer
    icolL = GetLastColumn() - 2
    With Sheets("vergleich")
       meAr = .Range(.Cells(19, 7), .Cells(24, icolL)) ' Deines Bereichs
    End With
    With Me.ComboBox1
       .Text = Cells(25, 7)
       .ColumnCount = 6
       .ColumnWidths = "65Pt;65Pt;65Pt;0Pt;0Pt;20Pt"
       .List = Application.Transpose(meAr)
    End With
  2. Daten in die ComboBox einfügen: Achte darauf, dass du nur die Spalten, die angezeigt werden sollen, in die ComboBox einfügst. Hierbei kannst du die AddItem-Methode verwenden, um gezielt die gewünschten Einträge hinzuzufügen.

  3. Interaktive Auswahl: Implementiere einen Button, der bei Auswahl der Einträge in der ComboBox die entsprechenden Spalten in deinem Arbeitsblatt sichtbar macht oder ausblendet. Ein Beispielcode könnte so aussehen:

    Private Sub CommandButton1_Click()
       Dim iLst As Integer
       For iLst = 0 To Me.ComboBox1.ListCount - 1
           If Me.ComboBox1.Selected(iLst) Then
               Columns(CLng(Me.ComboBox1.List(iLst, 1))).Hidden = False
           End If
       Next iLst
       Unload Me
    End Sub

Häufige Fehler und Lösungen

  • Fehlerhafte Zellreferenzen: Achte darauf, dass die Zellreferenzen in deinem Code korrekt sind. Wenn du auf eine nicht existierende Zelle zugreifst, kann das zu Laufzeitfehlern führen.

  • Syntaxfehler bei ReDim: Wenn du ReDim verwendest, stelle sicher, dass die Bedingung korrekt ist. Ein Beispiel zur Vermeidung von Fehlern:

    If iLst > 1 Then ReDim meAr(1 To iLst, 1 To 7)
  • ComboBox nicht sichtbar: Wenn du die ComboBox ausblenden möchtest, prüfe, ob du den richtigen Code dafür verwendest:

    Me.ComboBox1.Visible = False

Alternative Methoden

  • Verwendung von ListBox: Anstatt eine ComboBox zu verwenden, könntest du auch eine ListBox nutzen, um mehrere Auswahlen zu ermöglichen. Der Code zur Füllung der ListBox ist ähnlich wie der für die ComboBox.

  • Direktes Arbeiten mit Arrays: Du kannst auch direkt mit Arrays arbeiten, um die gewünschten Daten zu filtern und anzuzeigen. Dadurch kannst du die Leistung verbessern, wenn viele Daten verarbeitet werden.


Praktische Beispiele

Hier ist ein Beispiel für die Initialisierung einer ComboBox mit spezifischen Daten aus einem Arbeitsblatt:

Private Sub UserForm_Initialize()
    Dim meAr As Variant
    Dim icolL As Integer
    icolL = GetLastColumn() - 2
    With Sheets("vergleich")
        meAr = .Range(.Cells(19, 7), .Cells(24, icolL))
    End With
    With Me.ComboBox1
        .ColumnCount = 6
        .ColumnWidths = "65Pt;65Pt;65Pt;0Pt;0Pt;20Pt"
        .List = Application.Transpose(meAr)
    End With
End Sub

Tipps für Profis

  • Verwendung von Application.Transpose(): Dies kann nützlich sein, um Daten aus Zeilen in Spalten zu konvertieren, was die Übersichtlichkeit erhöht, wenn du deine ComboBox oder ListBox füllst.

  • Optimierung der Benutzeroberfläche: Verwende visuelle Elemente, um deine UserForms ansprechender zu gestalten. Labels und Gruppierungen können die Benutzererfahrung verbessern.


FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass nur die sichtbaren Spalten in der ComboBox geladen werden? Du kannst die Sichtbarkeit der Spalten in deinem Arbeitsblatt überprüfen und nur die sichtbaren Spalten in das Array meAr laden.

2. Was kann ich tun, wenn der Code bei der Auswahl in der ComboBox abbricht? Stelle sicher, dass du alle möglichen Auswahlbedingungen abfängst und überprüfe, ob der ListIndex der ComboBox korrekt behandelt wird.

3. Gibt es eine Möglichkeit, mehrere Items gleichzeitig auszuwählen? Ja, indem du eine ListBox anstelle einer ComboBox verwendest, kannst du Mehrfachauswahlen ermöglichen.

4. Wie kann ich die Sichtbarkeit von ComboBoxen steuern? Verwende die Visible-Eigenschaft, um die Sichtbarkeit der ComboBoxen in deiner UserForm zu steuern.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige