• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

keuze via combobox

Status
Niet open voor verdere reacties.

popipipo

Meubilair
Lid geworden
21 nov 2006
Berichten
9.118
Besturingssysteem
Win11
Office versie
Office 365
Ik heb 4 combo boxen onder elkaar staan.
Hier moet ik 4 verschillende namen kiezen.
Hoe kan ik dit zo oplossen als ik 1 van de 4 namen al gekozen heb dat ik die dan niet meer zie (kan kiezen) in de andere comboboxen?
 

Bijlagen

Beste popipipo ;)

Heb het geprobeerd met gegevensvalidatie.
Ik weet niet of je hier iets aan hebt.

Groetjes Danny. :thumb:
 

Bijlagen

popipipo, Ik heb je voorstel ff over een hele andere boeg gegooid... In het voorbeeld vind je een knop op de sheet. Bij het kliken verschijnt er een formulier met 2 listboxen. Door op de 'verplaats knopjes' te klikken, verplaats je de namen van de ene naar de andere box. Alles wat in de rechterbox staat, wordt overgenomen op de sheet. De broncode is van internet en heb ik aangepast aan je wens (bron staat vermeld in de code!).
Uiteraard zal je nu nog wel eea moeten inpassen in je eigen sheet, maar wellicht heb je zo een aardige basis.

Groet, Leo

[EDIT] Leuk gevonden oplossing Danny! Heel creatief.
 

Bijlagen

Laatst bewerkt:
...Code nog iets uitgebreid met een sorteerfunctie op de linker box:). Bij het openen worden de namen gesorteerd en ook zo bij het eventueel terugplaatsen van een naam/namen van rechts naar links...

Groet, Leo
 

Bijlagen

...Code nog iets uitgebreid met een sorteerfunctie op de linker box:). Bij het openen worden de namen gesorteerd en ook zo bij het eventueel terugplaatsen van een naam/namen van rechts naar links...

Groet, Leo

Even een kleine aanvulling:
Het toevoegen van elementen aan een listbox kan je versnellen door de itemlijst in een array variabele (type variant) te steken en deze variabele toe te wijzen aan de list property van de listbox. Je hoeft dan niet met additem te werken, en doorheen alle elementen te lopen.

Voorbeeld:

Jouw code om de gesorteerde lijst terug te schrijven naar de listbox:

Code:
'Add the sorted array back to the listbox
    For i = LBound(vaItems, 1) To UBound(vaItems, 1)
        oLb.AddItem vaItems(i, 0)
    Next i

Deze kan je vervangen door:

Code:
oLb.List = vaItems

Je kan op die manier een lus uitsparen wat efficienter is.

Je kan dezelfde techniek ook gebruiken om initieel de waarden van de sheet in de listbox te krijgen. Hiervoor definieer je een ook een variant array en deze krijgt als inhoud de range waar de data staat op het werkblad. Die array wijs je dan ook weer toe aan de list property van de listbox. Bij grote hoeveelheden data levert dit "enorme" tijdswinsten op.
 
...Dank voor de input. Ook al had ik eea niet zelf geschreven, ga ik hier toch ff mee aan de bak!;)

Groet, Leo
 
...Dank voor de input. Ook al had ik eea niet zelf geschreven, ga ik hier toch ff mee aan de bak!;)

Groet, Leo

Geen probleem. Die mensen van DDoE hebben uiteraard geen lessen van mij te leren, het is eerder omgekeerd. Maar het verbaast me dat die "tip" nog vaak over het hoofd wordt gezien, ook door gevorderden.
 
Nog een oplossing ?
Zie de bijlage met:

Code:
Private Sub ComboBox1_Change()
  wijzig
End Sub

Private Sub ComboBox2_Change()
  wijzig
End Sub

Private Sub ComboBox3_Change()
  wijzig
End Sub

Private Sub ComboBox4_Change()
  wijzig
End Sub

Private Sub wijzig()
  sq = Split("Anja|Bea|Cees|Daan", "|")
  If ComboBox1.Value <> "" Then sq = Filter(sq, ComboBox1.Value, False)
  If ComboBox2.Value <> "" Then sq = Filter(sq, ComboBox2.Value, False)
  If ComboBox3.Value <> "" Then sq = Filter(sq, ComboBox3.Value, False)
  If ComboBox4.Value <> "" Then sq = Filter(sq, ComboBox4.Value, False)
  ComboBox1.List = Split(IIf(ComboBox1.Value = "", "", ComboBox1.Value & "|") & Join(sq, "|"), "|")
  ComboBox2.List = Split(IIf(ComboBox2.Value = "", "", ComboBox2.Value & "|") & Join(sq, "|"), "|")
  ComboBox3.List = Split(IIf(ComboBox3.Value = "", "", ComboBox3.Value & "|") & Join(sq, "|"), "|")
  ComboBox4.List = Split(IIf(ComboBox4.Value = "", "", ComboBox4.Value & "|") & Join(sq, "|"), "|")
End Sub

Private Sub Worksheet_Activate()
  sq = Split("Anja|Bea|Cees|Daan", "|")
  ComboBox1.List = sq
  ComboBox2.List = sq
  ComboBox3.List = sq
  ComboBox4.List = sq
End Sub
 

Bijlagen

...Dit wordt wel een vraag met HELE mooie oplossingen al zeg ik 't zelf...!:eek: Klasse snb!

Groet, Leo
 
Dank voor je onderkoelde reaktie.:D
Meteen dan een 'terugvraag'. Ik wilde natuurlijk een lus gebruiken, maar vond geen mogelijkheid om zoiets als Me("ComboBox" & j) aan de praat te krijgen. In een userform is dat immer een handige methode, maar als de activeX-controls in een werkblad staan werkt het blijkbaar niet, hoewel Me wel naar het werkblad verwijst.
Weet iemand een oplossing ?
 
Dank voor je onderkoelde reaktie.:D
Meteen dan een 'terugvraag'. Ik wilde natuurlijk een lus gebruiken, maar vond geen mogelijkheid om zoiets als Me("ComboBox" & j) aan de praat te krijgen. In een userform is dat immer een handige methode, maar als de activeX-controls in een werkblad staan werkt het blijkbaar niet, hoewel Me wel naar het werkblad verwijst.
Weet iemand een oplossing ?


Dan moet je werken via OLEobjects in je code. Zie onderstaande. (In dit geval is de check om te zien of het een combobox is niet nodig, maar bij meerdere OleObjecten wel).

Code:
Private Sub wijzig()
    
    sq = Split("Anja|Bea|Cees|Daan", "|")
    For i = 1 To Me.OLEObjects.Count
        If InStr(Me.OLEObjects(i).Name, "ComboBox") > 0 Then
            If Me.OLEObjects(i).Object.Value <> "" Then sq = Filter(sq, Me.OLEObjects(i).Object.Value, False)
        End If
    Next i
    
    For i = 1 To Me.OLEObjects.Count
        If InStr(Me.OLEObjects(i).Name, "ComboBox") > 0 Then
            Me.OLEObjects(i).Object.List = Split(IIf(Me.OLEObjects(i).Object.Value = "", "", Me.OLEObjects(i).Object.Value & "|") & Join(sq, "|"), "|")
        End If
    Next i
   
End Sub

edit:

Uiteraard kan je ook werken met de naam van het object ipv zijn indexnumer:
Code:
Private Sub wijzig()
    
    sq = Split("Anja|Bea|Cees|Daan", "|")
    For i = 1 To 4
            If Me.OLEObjects("Combobox" & i).Object.Value <> "" Then sq = Filter(sq, Me.OLEObjects("Combobox" & i).Object.Value, False)
    Next i
    
    For i = 1 To 4
            Me.OLEObjects("Combobox" & i).Object.List = Split(IIf(Me.OLEObjects("Combobox" & i).Object.Value = "", "", Me.OLEObjects("Combobox" & i).Object.Value & "|") & Join(sq, "|"), "|")
    Next i
   
End Sub
 
Laatst bewerkt:
@Finch

Bedankt !

Dan wordt het

Code:
Private Sub ComboBox1_Change()
  wijzig
End Sub

Private Sub ComboBox2_Change()
  wijzig
End Sub

Private Sub ComboBox3_Change()
  wijzig
End Sub

Private Sub ComboBox4_Change()
  wijzig
End Sub

Private Sub wijzig()
  sq = Split("Anja|Bea|Cees|Daan", "|")
  for j=1 to 4
    with OLEobjects("Combobox" & j).Object
      If .Value <> "" Then sq = Filter(sq, .Value, False)
    end with
  Next
  for j=1 to 4
    with OLEobjects("Combobox" & j).Object
      .List = Split(IIf(.Value = "", "", .Value & "|") & Join(sq, "|"), "|")
    end with
  Next
End Sub

Private Sub Worksheet_Activate()
  sq = Split("Anja|Bea|Cees|Daan", "|")
  For j= 1 to 4
     OLEobjects("ComboBox" & j).Object.List = sq
  Next
End Sub
 
Laatst bewerkt:
@Finch

Bedankt !

Dan wordt het

Code:
Private Sub wijzig()
  sq = Split("Anja|Bea|Cees|Daan", "|")
  for j=1 to 4
    with Me.OLEobjects("Combobox" & j)
      If .Value <> "" Then sq = Filter(sq, .Value, False)
    end with
  Next
  for j=1 to 4
    with Me.OLEobjects("Combobox" & j)
      .List = Split(IIf(.Value = "", "", .Value & "|") & Join(sq, "|"), "|")
    end with
  Next
End Sub

Dat gaat niet werken. Je bent de .object achter me.oleobjects("Combobox" & j) vergeten.

Zo dus:

Code:
Private Sub wijzig()
  sq = Split("Anja|Bea|Cees|Daan", "|")
  for j=1 to 4
    with Me.OLEobjects("Combobox" & j)[COLOR="red"].Object[/COLOR]
      If .Value <> "" Then sq = Filter(sq, .Value, False)
    end with
  Next
  for j=1 to 4
    with Me.OLEobjects("Combobox" & j)[COLOR="red"].Object[/COLOR]
      .List = Split(IIf(.Value = "", "", .Value & "|") & Join(sq, "|"), "|")
    end with
  Next
End Sub
 
Dat was even schrikken van de hoeveelheid reacties

@ Danny
Met wat aanpassing is het te doen, echter had ik liever een oplossing zonder data validatie

@Ginger
Mooie oplossing maar niet in te passen in mijn sheet

@Finch
Ik zie het als een verbeterde versie als die van Danny
Bij geen beter oplossing zal dit het denk ik worden.

@snb
Ik krijg jou oplossing niet werkend.
In vba zie ik de namen staan, echter de namen die ik wil zijn weer afhankelijk van voorafgaande invoer.
Dus lijkt mij dat dit niet gaat werken.

Ik dacht dat ik met dit voorbeeldje er wel zou uitkomen maar niet helemaal naar mijn zin daarom het bestandje gepost waar het in verwerkt moet worden.

Het gaat om een invullijst voor het WK voetbal 2010 in Zuid Afrika.
Diverse mensen (ook zonder excel verstand) moeten deze lijst invullen dus het invullen moet simpel blijven.
Deze lijst kopieer ik naar een ander bestand voor verdere berekeningen.
Daarom mag er in de layout niets veranderd worden. (dit geldt speciaal voor cellen H78:H119)
 

Bijlagen

Dat was even schrikken van de hoeveelheid reacties
:D:D:D

Toch jammer dat dan niet net het gezochte erbij zit.:(
Ook al denk ik dat je de code van snb hiervoor best werkend kan krijgen (met wat hulp van Finch of snb).

Groet, Leo
 
De comboboxen in mijn suggestie komen uit de werkset bestruringselementen en zijn dus essentieel anders dan die jij in je werkblad gebruikt (formulieren).
Zet de VBA code in de module van het werkblad waar ook de comboboxen staan.
In mijn suggestie heb ik voor de eenvoud een aantal namen als tekst opgevoerd.
Die gegevens kunnen natuurlijk overal vandaan komen:

als de namen in cel A1, B7, D10 en V12 staan:
sq=split([A1] & "|" & [B7] & "|" & [D10] & "|" & [V12],"|")

of
als de namen in cel A1 t/m A10 van de derde sheet staan:
sq=worksheetfunction.transpose(sheets(3).[A1:A10])
 
Laatst bewerkt:
@snb

Als ik jou bestandje dat je gepost hebt in reactie #10 open en een van de comboboxen kan ik geen keuze maken uit iets.
Hoe kan dat of moet ik eerst nog iets anders doen.
Het bestandje moet, zoals ik in mijn vorige reactie al vermelde, ook door leken op het gebied van excel gebruikt worden.
Dus meerdere handelingen verrichten voordat je je keuze kunt maken is niet echt handig.
 
@snb

Als ik jou bestandje dat je gepost hebt in reactie #10 open en een van de comboboxen kan ik geen keuze maken uit iets.
Hoe kan dat of moet ik eerst nog iets anders doen.
Het bestandje moet, zoals ik in mijn vorige reactie al vermelde, ook door leken op het gebied van excel gebruikt worden.
Dus meerdere handelingen verrichten voordat je je keuze kunt maken is niet echt handig.


Momenteel moet je eerst een andere sheet selecteren en dan terug sheet1 selecteren.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan