• 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.

combobox value

Status
Niet open voor verdere reacties.

snb

Verenigingslid
Lid geworden
12 jun 2008
Berichten
19.714
Ola Helpmij forum

De volgende vraag:

Ik heb in een userform een combobox.
Die vul ik in de Initialize-gebeurtenis.
Vervolgens stel ik de waarde van de combobox in op een van de waarden, die de combobox bevat.
Dan blijkt dat alleen de waarden die als tekstreeks (string) in de combobox staan als geldige waarden worden herkend door de methode combobox.Value.

Wie heeft hiervoor een verklaring ?

Code:
Private Sub UserForm_Initialize()
   ComboBox1.List = Array(3, 4, 5, 6, "7", 8)
   
   ComboBox1.Value = 5
   MsgBox "Combobox1.value=5 :   " & ComboBox1.ListIndex
   
   ComboBox1.ListIndex = -1
   ComboBox1.Value = 7
   MsgBox "Combobox1.value=7 :   " & ComboBox1.ListIndex
   
   ComboBox1.ListIndex = -1
   ComboBox1.Value = "7"
   MsgBox "Combobox1.value=""7"" :   " & ComboBox1.ListIndex
End Sub
 

Bijlagen

  • __combobox illustratie snb.xlsb
    12,5 KB · Weergaven: 90
Laatst bewerkt:
Ik weet niet of ik de vraag goed begrijp. Mijn verklaring zou zijn dat combobox.value altijd een string is. En dat de numerieke 7 dan ook als zodanig herkend wordt (een string), omdat dit het enige geldige type is.
 
Heeft kennelijk iets te maken met het feit dat de combobox een array krijgt want als je de items met AddItem toevoegt dan werkt het wel.
Het wordt nog gekker. Als ik de BoundColumn = 0 instel, dan werkt het alleen nog voor 3, 4 en 5. Stel ik BoundCOlumn in op 1, dan werkt 7 en "7" en 3, 4 en 5 weer niet.
 
Dank beiden !

Ik ga verder testen, ook met jouw additem en boundcolumn suggesties JKP.
 
Andersom werkt het wel prima.
Code:
ComboBox1.List = Array(3, 4, 5, 6, "7", 8)
    ComboBox1.ListIndex = 5
   MsgBox "ComboBox1.Value: " & ComboBox1.Value & vbCrLf & "ComboBox1.ListIndex: " & ComboBox1.ListIndex
 
@HSV

Ja, dat klopt.
De wijziging van de listindex gaat in alle gevallen vlekkelings; de Value eigenschap gaat volledig mee.
Ik wilde eigenlijk kijken of je de .Value eigenschap van een Combobox kunt gebruiken als 'sleutel/key' vergelijkbaar met de Dictionary.
Ik ben nl. bezig met een pagina over Comboboxes in vervolg op de Sortedlists, Arraylist, Dictionaries, Collections, etc.


@JKP

Bij de 2-dimensionele Arrays lukt het me nog minder.
Bij wij versagen vooralsnog niet.
 
Laatst bewerkt:
Code:
Private Const stext As String = "3,4,5,6,7,8"
Private Sub UserForm_Initialize()


   ComboBox1.List = Split(stext, ",")
   ComboBox1.value= 5
   MsgBox "Combobox1.value=5 :   " & ComboBox1.ListIndex
end with

Of:

Code:
 ComboBox1.List = Split("3,4,5,6,7,8", ",") 'of split("3 4 5 6 7 8") natuurlijk
   ComboBox1.Value = 5
   MsgBox "Combobox1.value=5 :   " & ComboBox1.ListIndex
 
Laatst bewerkt:
Probeer eens of je na deze regel:
Code:
ComboBox1.List = Array(3, 4, 5, 6, "7", 8)
in de Immediate window door de lijst kan gaan als volgt:
Code:
?ComboBox1.List()(0, 0)
Code:
?ComboBox1.List()(1, 0)

etcetera...
het lijkt er op dat je zelfs verschil ziet in de uitlijning van de string "7", ietsje verder naar links als de andere waarden (getallen)
 
@HSv

Ja, bij de split gaat het wel goed; dan kun je zelfs kiezen tussen .value=5 of .value="5" om het gewenste item te selecteren.
 
Voorbeeld:

Code:
   ComboBox1.List = Array(10, 14, 17, 26, "7", 18)
   x3 = ComboBox1.BoundColumn                       '   x3=1
   MsgBox UBound(ComboBox1.List) & vbTab & UBound(ComboBox1.List, 2)    '   5     0

   ComboBox1.ListIndex = 3
   c00 = ComboBox1.Value                   '     "26"

   ComboBox1.ListIndex = 5
   c01 = ComboBox1.Value                  '      "18"

   ComboBox1.Value = c00                 ' foutmelding, hoewel c00 een geldig waarde is, want uit de Combobox zelf gelezen
   ComboBox1.Value = Val(c00)           ' foutmelding, dus string of number maakt niet uit

@JPK

Als ik boundcolumn op 0 zet, fungeert de .value als Listindex. (was voor mij ook nieuw).

Code:
   ComboBox1.List = Array(10, 14, 17, 26, "7", 18)
   ComboBox1.BoundColumn =0 
   MsgBox UBound(ComboBox1.List) & vbTab & UBound(ComboBox1.List, 2)    '   5     0

   ComboBox1.ListIndex = 3
   c00 = ComboBox1.Value                   '     3

   ComboBox1.ListIndex = 5
   c01 = ComboBox1.Value                  '     5

   ComboBox1.Value = c00                 '    geen foutmelding
   ComboBox1.Value = Val(c00)           '   geen foutmelding

   y=combobox1.listindex                  '      3;  dus c00 heeft de listindex op 3 gezet

en inderdaad, de additem methode vertoont dit euvel niet.
Dat komt niet omdat daardoor een 2-dimensionale Array ontstaat van n*9, want ook als ik een array van n*9 inlees via .List of .Column blijft het daarna onmogelijk om de .Value te gebruiken.

Dit werkt dus wel:

Code:
   sn = Array(10, 14, 17, 26, "7", 18)
   For j = 0 To UBound(sn)
       ComboBox1.AddItem sn(j)
    Next
   
   MsgBox UBound(ComboBox1.List) & vbTab & UBound(ComboBox1.List, 2)   '    5 * 9
   ComboBox1.ListIndex = 3
   c00 = ComboBox1.Value                   '     "26"

   ComboBox1.ListIndex = 5
   c01 = ComboBox1.Value                  '      "18"

   ComboBox1.Value = c00                  '      "26"
   y = ComboBox1.ListIndex                '    3

   ComboBox1.Value = Val(c01)            '      18
   y = ComboBox1.ListIndex                '    5
 
Laatst bewerkt:
Het lijkt wel goed te gaan als je de waarden uit een range haalt...
 
@JKP

Ook dan niet.

Het criterium blijkt te zijn dat niet met getallen gewerkt kan worden: de opdracht combobox1.value="x" werkt alleen als die 'x'-waarde als tekenreeks (string) in de combobox staat (en in de range in het geval van een getal met apostrof is ingevoerd). Dit geldt voor zowel 1-dimensionele als 2-dimensionele arrays.
Het waarom is me niet duidelijk, maar ik kan vermoeden dat er een interferentie met indexnummers plaatsvindt (vergelijkbaar met de onvoorspelbaarheid als je gereserveerde VBA-namen voor eigen objekten gebruikt).

Ik doe maar even of ik 'eruit' ben en zet de draad op opgelost.

Allen bedankt voor het meestoeien.
Als de comboboxpagina klaar is geef ik een signaal.
 
Ik deel de mening uit post#2, volgens mij is een Combobox.value (net als bij een TextBox) altijd een string en voegt de additem methode ook altijd een string toe aan de .list
Wellicht toch een reden om de .additem boven de .list methode te kiezen (?)
anyway ben alvast benieuwd naar jouw comboboxpagina :thumb:
 
@E v R

Als die redenering klopt, zou er geen verschil moeten zijn tussen de additem-methode en de .List of .column eigenschap (het zijn toch allemaal 'strings').
En het komt niet overeen met de bevinding dat, wanneer getallen als 'string' aan de combobox zijn toegevoegd, ze met .value=getal kunnen worden benaderd.
Het verschil treedt alleen maar op bij het gebruik van .Value als sleutel van een item.
Additem is niet bedoeld, noch geschikt om een Combobox te vullen met meer dan 1 item tegelijkertijd.
 
Als ik de typename opvraag van de combobox list items afkomstig uit je eerste array dan krijg ik Integer, Integer, Integer, Integer, String, Integer
Maar de Value eigenschap verwacht vermoedelijk een string waarde (ook al staat in Help Variant!) en alleen 7 is als string ingegeven.
 
@JKP

Goede invalshoek !
En dan hebben we nog niet eens over de verschillende combobox-'stylen': combobox & dropdownlist.
 
Als je middels Additem een integer, long double etc. toevoegt aan een Combobox, wordt dit automatisch een string (dit dus itt .column en .list) (vandaar dat wanneer items middels add.item zijn toegevoegd wel worden gevonden)
Als je middels VBA een integer, long ... als waarde aan de combobox geeft zal er geen.MatchFound zijn en dus na Change geen wijziging van de Listindex plaatsvinden.
 
@E v R

Als je middels VBA een integer, long ... als waarde aan de combobox geeft zal er geen.MatchFound zijn en dus na Change geen wijziging van de Listindex plaatsvinden
Maar als je de waarde instelt met een string wordt ook geen listindex gewijzigd.
Zelfs niet als je de geldige waarde uit de combobox gebruikt.

Voorbeeld een range met in A8 het getal 100

Code:
ComboBox1.List = Sheet1.Cells(1).CurrentRegion.Value

ComboBox1.Value = "100"
MsgBox ComboBox1.ListIndex     ' -1

MsgBox TypeName(ComboBox1.List(7, 0))    ' double
ComboBox1.Value = ComboBox1.List(7, 0)
MsgBox ComboBox1.ListIndex    '   -1

ComboBox1.Value = format(ComboBox1.List(7, 0))
MsgBox ComboBox1.ListIndex    '   -1

ComboBox1.Value = CStr(ComboBox1.List(7, 0))
MsgBox ComboBox1.ListIndex    '   -1
 
Laatst bewerkt:
zo werkt het wel.
Code:
Private Sub UserForm_Initialize()
Dim arr(5) As String
arr(0) = 3
 arr(1) = 4
 arr(2) = 5
 arr(3) = 6
 arr(4) = 7
 arr(5) = 8
   ComboBox1.List = arr
   ComboBox1.Value = 5
   
   MsgBox ComboBox1.Value & ":   " & ComboBox1.ListIndex
   ComboBox1.ListIndex = -1
   ComboBox1.Value = 7
   MsgBox "Combobox1.value=7 :   " & ComboBox1.ListIndex
   ComboBox1.ListIndex = -1
   ComboBox1.Value = "7"
   MsgBox "Combobox1.value=""7"" :   " & ComboBox1.ListIndex


End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan