Vullen combobox AddItem vs List

Status
Niet open voor verdere reacties.

rebmog

Gebruiker
Lid geworden
14 jul 2009
Berichten
744
Een combobox kun je in een loop vullen met AddItem of in één keer met List.

Hoewel je op deze wijze comboboxen kunt vullen met exact dezelfde waarden, blijken de comboboxen toch anders te reageren. Een voorbeeld daarvan is dat je in het geval van het vullen met List geen waardes kunt selecteren door middel van intypen. Bij AddItem kan dat wel.

Zie bijgaand voorbeeldje. Probeer in de 2e combobox maar een geldige waarde in te typen en je zult zien dat je een foutmelding krijgt.

Iemand enig idee hoe dat komt?
 

Bijlagen

  • combobox.xlsm
    18,5 KB · Weergaven: 40
Kennelijk wordt tussen die 2 verschil gemaakt tussen String en Integer vulling.
Doe het maar eens zo:
Code:
Private Sub UserForm_Initialize()
    Dim i As Integer
    Dim a(999) As String
    
    For i = 1 To 999
        cboAddItem.AddItem i
        a(i - 1) = i
    Next
    cboList.List = a()
End Sub
 
Laatst bewerkt:
Dank voor je reactie.

Het lijkt er inderdaad op dat intypen alleen fout gaat bij List in geval van getallen.

Lijkt me een bug.
 
Ik vind het ook vreemd. Waarden in een ComboBox dienen naar mijn mening altijd tekst te zijn.
AddItem doet kennelijk zelf de juiste conversie en List niet.
Zou een bugje kunnen zijn, maar je weet nu hoe er mee om te gaan :)
 
Van die foutmelding kom je af met Matchrequired op False, maar het selecteert het getal niet.
Zo lukt het wel.
Code:
cboList.List = [row(1:999) & ""]
 
Laatst bewerkt:
Ik had die MatchRequired bewust op True gezet, zodat nog duidelijker werd dat het intypen niet werkt.

De formule met de toevoeging van een lege string werkt natuurlijk prima, maar ik liep hier tegen aan toen ik een combobox d.m.v. List vulde met een meerkoloms array. De eerste kolom van deze array bevatte unieke getallen (bound column) en deze kolom had ik verborgen in de combobox. Ik had wat problemen om de default value van deze combobox in te stellen.

Toen ik hiervoor een voorbeeldje maakte zag ik dat het intypen ook niet werkte in dit geval.

Op het spoor gezet door @edmoor blijk Uit wat nader onderzoek van mij dat met AddItem de getallen naar String worden omgezet, terwijl bij List de getallen een Double zijn.

In mijn voorbeeldje kun je kun je default value van de AddItem-combobox o.a. als volgt instellen:
cboAddItem.Value = 7
cboAddItem.Value = "7"
cboAddItem.Text = 7
cboAddItem.Text = "7"
cboAddItem.ListIndex = 6
cboAddItem.ListIndex = "6"

Bij de List-combobox werkt het instellen van de default value alleen goed met .ListIndex. De .Text en .Value werken volgens mij niet. Ook niet als je het getal eerst converteert naar een Double.

Het is soms best omslachtig om eerst de ListIndex te bepalen om de default value in te stellen. Iemand nog een idee hoe ik de default value van de combobox gevuld met List (cboList) in kan stellen zonder gebruik te maken van ListIndex?

Let op: bij het checken of de waarde goed is ingesteld moet je de combobox even openklappen om te controleren of de ingestelde waarde inderdaad geselecteerd is.
 
Code:
Private Sub UserForm_Initialize()
    cboList.List = [row(1:999)]
    cboList.ListIndex = Application.Match(12, cboList.List, 0) - 1
End Sub
 
Die code is mij bekend. Zoals je weet moet je bij een meerkoloms list hier nog application.index aan toevoegen. Dus
Code:
cboList.ListIndex = Application.Match(12, Application.Index(cboList.List, ,1), 0) - 1

Ik vind dat redelijk omslachtig t.o.v. het rechtstreeks met cboList.Value een waarde toekennen, zoals dat bij AddItem kan. Maar blijkbaar kan het in dit geval alleen maar met ListIndex.
 
Dit lijkt mij dan het simpelst.
Geen listindex, wel geselecteerd.
Code:
cboList.List = [row(1:999)&""]
    cboList.Value = 6
 
Het aardige van de methode .List (of .Column) is, dat de ingelezen gegevens 1 op 1 worden opgenomen: tekst, getal, datum.

Dat vind ik een belangrijk voordeel.
Dan vind ik het gebruik van .Listindex voor eenn 2-dimensionele array ook voor de hand liggender en consistenter.

Blijkbaar werkt de selectie met .value alleen op een .boundcolumn met tekstwaarden; dan zou je bijna concluderen dat het daarbij dan om de .Text eigenschap gaat en niet om de .Value eigenschap.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan