Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen

combobox removeitem

Betrifft: combobox removeitem von: Jonny
Geschrieben am: 04.09.2020 08:12:56

Hallo liebe Profis!

Könnt ihr mir vielleicht auf die Sprünge helfen?
Ich habe eine UserForm mit mehreren Comboboxen die beim Initialisieren alle mit den selben Items gefüllt werden (also die Auswahlmöglichkeit ist gleich, die Auswahl selbst trifft der User).

Wenn jetzt bei einer UserForm "Möglichkeit 1" angewählt wurde, möchte ich dass die "Möglichkeit 1" bei den anderen Comboboxen nicht mehr zur Verfügung steht (um eine Doppelauswahl zu vermeiden).

Das sollte mit "RemoveItem" funktionieren.
Allerdings muss ich (glaube ich) zuerst herausfinden welchen Indexwert "Möglichkeit 1" in jeder anderen Combobox hat.
Weiß jemand wie ich das am besten mache?


Vielen Dank für die Hilfe!!!
Jonny

Betrifft: AW: combobox removeitem
von: Nepumuk
Geschrieben am: 04.09.2020 08:41:01

Hallo Jonny,

ein Beispiel:

Private Sub ComboBox1_Change()
    Call ClearItem(ComboBox1)
End Sub

Private Sub ComboBox2_Change()
    Call ClearItem(ComboBox2)
End Sub

Private Sub ClearItem(ByRef probjComboBox As MSForms.ComboBox)
    Dim objControl As Control
    Dim lngIndex As Long
    For Each objControl In Controls
        If TypeOf objControl Is MSForms.ComboBox Then
            If Not objControl Is probjComboBox Then
                For lngIndex = 0 To objControl.ListCount - 1
                    If objControl.List(lngIndex) = probjComboBox.Text Then
                        Call objControl.RemoveItem(lngIndex)
                        Exit For
                    End If
                Next
            End If
        End If
    Next
End Sub

Gruß
Nepumuk

Betrifft: AW: combobox removeitem
von: Oberschlumpf
Geschrieben am: 04.09.2020 08:43:48

Hi :-)

DAS ist dann die VBA-Variante meiner vorherigen Textformulierung :-)

Ciao
Thorsten

Betrifft: AW: combobox removeitem
von: Jonny
Geschrieben am: 04.09.2020 10:53:25

wow, ich musste jetzt offline sein und hab gerade alle eure antworten gelesen.
VIELEN DANK für eure hilfe und zeit!

das problem ist damit gelöst! :-)
vielen dank!
jonny

Betrifft: AW: combobox removeitem
von: Daniel
Geschrieben am: 04.09.2020 11:17:54

das ist aber noch unvollständig, bzw funktioniert so nicht richtig.

Beispiel folgender Ablauf:
1. ich wähle in Combobox1 Eintrag1
2. ich wechsle in Combobox1 von Eintrag1 auf Eintrag2
in Combobox2 fehlen jetzt Eintrag2 UND Eintrag1, obwohl Eintrag1 ja nicht gewählt ist und frei wäre.
hier fehlt also noch das Wiedereinfügen der alten Einträge in die Comboboxen, falls ein Eintrag in ein einer Combobox verändert wird.



Gruß Daniel

Betrifft: AW: combobox removeitem
von: Jonny
Geschrieben am: 04.09.2020 12:15:10

stimmt daniel!

in diesem sonderfall erscheint der eintrag nicht mehr.
leider hab ich keine idee wie man damit umgehen könnte.
mein gedanke war: mit "clear" die combobox leeren und alle items erneut hinzufügen.
aber dann löscht man ja auch die bereits getätigten einträge... :-/

hast du, oder jemand anders eine idee wie man den eben ersetzten eintrag wieder in alle comboboxen hinzufügt? (und dann auch noch an der richtigen stelle - das dürfte die nächste herausforderung sein...)

Betrifft: Wer lesen kann ist im Vorteil
von: Daniel
Geschrieben am: 04.09.2020 12:34:40

du hast doch noch mehr Lösungsvorschläge bekommen, warum beschäftigst du dich nur mit einem?

Gruß Daniel

Betrifft: AW: Wer lesen kann ist im Vorteil
von: Jonny
Geschrieben am: 04.09.2020 13:45:29

ziemlich peinlich, aber du hast vollkommen recht!
dein code hat mich deshalb zuerst abgeschreckt, weil ich beim initialisieren nicht mit einem string gearbeitet habe, sondern eine tabelle mittels schleife durchgegangen bin und nur "nicht ausgeblendete" zellen mittels "additem" hinzugefügt habe.

aber ich konnte das problem umgehen, so sieht jetzt mein code aus:
Private Sub UserForm_Initialize()

    'strListeVst wird der String, der die RowSource der Comboboxen darstellt
    Dim n As Long
    For n = 1 To Application.Max(Tabelle_Daten.Range("A:A"))
        If Tabelle_Daten.Rows(n + 2).EntireRow.Hidden = False Then
            strListeVst = strListeVst & ";" & Tabelle_Daten.Cells(n + 2, 1).Value
        End If
    Next n

    strListeVst = strListeVst & ";" 'der String strListeVst muss am Anfang und am Ende ein ";"  _
aufweisen!
    
End Sub
Vielen Dank Daniel!
Ich freu mich voll! :-D

Betrifft: AW: combobox removeitem
von: Oberschlumpf
Geschrieben am: 04.09.2020 08:42:34

Hi Jonny,

durchsuch doch, mit Übergabe der Auswahl aus der Combobox, die du (Anwender) angeklickt hat, in einer ausgelagerten Sub alle anderen Combos.
Wenn Auswahl in anderen Combos gefunden, dann RemoveItem.

Und diese Schritte wiederholst du bei jeder Anwenderauswahl aus einer der Comboboxen.

Hilfts?

Nein? Dann bitte per Upload eine Bsp-Datei mit allen Controls + Daten, wie du es hier beschrieben hast.

Ciao
Thorsten

Betrifft: AW: combobox removeitem
von: Daniel
Geschrieben am: 04.09.2020 09:31:42

HI
wird mit RemoveItem und Index schwierig.
sobald du nämlich ein Element aus einer Combobox entfernt hast, ändern sich ja die Indizes im vergleich zu den anderen Boxen.

es gibt mehrere Möglichkeiten, das Problem anzugehen.

eine wäre folgende:
1. schreibe im Initialize-Event der Userform die Auswahlmöglichkeiten mit Trennzeichen getrennt in eine Modulweit gültige String-Variable (Deklaration ausßerhalb der Makros)

2. in den Drop-Button-Events der Comboboxen gehst übernimmst du dann diese String-Variable und löschst aus ihr alle Teiltexe, die schon von den andern Combobox belegt sind.
dann splittest du den Text in ein Array und weist ihn der Combobox zu.

um dir Schreibarbeit zu sparen, machst du den Schritt 2 ein einer eigenen Prozedur und rufst diese im Split-Event nur auf.
die jeweils aufrufende Combobox kann über das Objekt "ActiveControl" ermittelt werden, so dass du den Code allgemeingültig für jede Combobox schreiben kannt.

sieht als Code in etwas so aus:
Option Explicit
Dim strListeVst As String


Private Sub ComboBox1_DropButtonClick()
Call Combobox_Fill
End Sub

Private Sub ComboBox2_DropButtonClick()
Call Combobox_Fill
End Sub

Private Sub ComboBox3_DropButtonClick()
Call Combobox_Fill
End Sub



Private Sub UserForm_Initialize()
strListeVst = ";Auswahl1;Auswahl2;Auswahl3;Auswahl4;Auswahl5;"
End Sub



Private Sub Combobox_Fill()
Dim strListe As String
Dim cb As ComboBox
strListe = strListeVst
For Each cb In Me.Controls
    If Not cb.Name = ActiveControl.Name Then
        strListe = Replace(strListe, ";" & cb.Text & ";", ";")
    End If
Next
strListe = Mid(strListe, 2, Len(strListe) - 2)
ActiveControl.List = Split(strListe, ";")
End Sub
Gruß Daniel

Betrifft: Korrektur
von: Daniel
Geschrieben am: 04.09.2020 10:39:20

Sorry, da eine Userform in der Regel noch mehr Steuerelemente enthält, sollte man das Marko so schreiben:
Private Sub Combobox_Fill()
Dim strListe As String
Dim cb As Control
strListe = strListeVst
For Each cb In Me.Controls
    If TypeName(cb) = "ComboBox" Then
        If Not cb.Name = ActiveControl.Name Then
            strListe = Replace(strListe, ";" & cb.Text & ";", ";")
        End If
    End If
Next
strListe = Mid(strListe, 2, Len(strListe) - 2)
ActiveControl.List = Split(strListe, ";")
End Sub
Gruß Daniel

Beiträge aus dem Excel-Forum zum Thema "combobox removeitem"