[VBA] Combobox aanmaken en vullen

Pagina: 1
Acties:
  • 1.182 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • Clock
  • Registratie: Maart 2005
  • Laatst online: 11-09 13:23
Goedenavond,

Ik heb me al helemaal doodgegoogled, maar dit wil maar niet lukken. En dat terwijl het zo simpel is,

Ik heb een excel sheet met daarachter een acces database. Ik wil nu in die excel sheet een combobox aanmaken, en die vullen met data uit de database.

Het aanmaken van de combobox doe ik met de volgende code:
code:
1
2
3
ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
        DisplayAsIcon:=False, Left:=10, Top:=10, Width:=50, Height _
        :=20)


Nu wil ik diezelfde combobox vullen met data vanuit een loopje die alle rijen van de query afloopt

code:
1
2
3
-begin loop-
  ComboBox1.AddItem "test"
-eind loop-


Ik krijg steeds de foutmeling dat een object vereist is. Wat doe ik hier fout?


Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • Clock
  • Registratie: Maart 2005
  • Laatst online: 11-09 13:23
Even een concretere update. Ik heb de volgende code in een verder lege worksheet:
code:
1
2
3
4
5
6
7
8
9
10
Sub test()
     Dim Combo_1 As OLEObject
     Set Combo_1 = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, DisplayAsIcon:=False, Left:=69.75, Top:=51, Width:=95.25, Height:=19.75)
     
     With Combo_1
        .Name = "cmb"
    End With
    
    cmb.AddItem "test"
End Sub


Als ik test() aanroep krijg ik netjes een combobox. Deze heeft ook de goede naam, namelijk 'cmb'. Echter krijg ik bij de laatste regel (additem) de foutmelding: Object vereist.

Roep ik echt nog een keer die functie aan, dan verschijnt er een 2e combobox over de eerste heen, maar geen foutmelding. In de 1e (achterste) combobox is nu wel het item test toegevoegd!

Wat gaat hier mis?

Acties:
  • 0 Henk 'm!

Verwijderd

in de veronderstelling dat activesheet sheet 1 is :
Visual Basic:
1
2
3
4
5
6
7
8
9
10
Sub test()
     Dim Combo_1 As OLEObject
     Set Combo_1 = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, DisplayAsIcon:=False, Left:=69.75, Top:=51, Width:=95.25, Height:=19.75)
     Combo_1.Name = "testcombo"
     Combo_1.Object.AddItem "test"
End Sub

Sub NogEentjeToevoegen()
  ThisWorkbook.Worksheets(1).testcombo.AddItem "nog een item"
End Sub

de naam van de combobox (in dit geval testcombo) kan ook in designmode achterhaald worden, activeer de visual basis werkbalk in de werkmap en klik op designmode knop (ontwerpmodus). als deze actief is, kun je op de combobox klikken en verschijnt de naam in de formulebalk. nogmaals klikken op de designmode knop sluit de ontwerpmodus af.

Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Als je option explicit aanzet zou je zien dat cmb nog niet bestaat. Excel maakt het verwijzing naar activesheet.cmd pas aan als je huidige code klaar is.

Omdat oleobject een wrapper is om de combobox kun je die ook nog niet rechtstreeks aanroepen.

Dit werk echter wel:
code:
1
combo_1.object.additem "test"


en ik zi enu dat _heretic_ hetzelfde schreef 8)7

[ Voor 8% gewijzigd door Lustucru op 18-12-2007 19:47 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

  • Clock
  • Registratie: Maart 2005
  • Laatst online: 11-09 13:23
Aah, danku!

De werkende code die ik ervan gemaakt hebt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub test()
     Dim Combo_1 As OLEObject
     Dim Arr(2, 1)
     
     Arr(0, 0) = "Piet"
     Arr(0, 1) = 1
     Arr(1, 0) = "Klaas"
     Arr(1, 1) = 2
     Arr(2, 0) = "Jan"
     Arr(2, 1) = 3
     
     Set Combo_1 = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, DisplayAsIcon:=False, Left:=69.75, Top:=51, Width:=95.25, Height:=19.75)
     
     With Combo_1
        .Name = "cmb"
        .Object.List = Arr
    End With
End Sub


Het is mij ongeveer duidelijk. Maar waarom kan ik .Name en .Linkedcell ed wel direct aanpassen, en moet ik voor de List en Additem via een object? Uit nieuwsgierigheid heur, de code werkt nu perfect.

Bedankt!

Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Het oleobject bevat een ander 'ding' . Dat kan een textbox zijn, een combox, maar ook nog andere objecten. Name en linked cell zijn eigenschappen van het oleobject zelf, maar list en additem zijn members van het 'ding', in dit geval de combox, dat erin zit.
Dus om de eigenschappen van het 'ding' aan te passen moet je eerst het ding zelf ophalen.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

  • Clock
  • Registratie: Maart 2005
  • Laatst online: 11-09 13:23
Ok, dank voor de uitleg.

Heb ik nog een kleine vraag.
De combobox wordt aangemaakt in sub a. Aan het eind van die sub wordt sub b aangeroepen, en die haalt data uit de database, giet dat netjes in een array, en wijst die array toe aan de comboboxen. In die laatste stap zit de knel. Ik kan de combobox nog niet 'bij zijn naam' aanspreken, maar ik heb ook de variabele (object) van het aanmaken niet meer. Hoe moet ik die combobox dan aanduiden?

En een kleine andere vraag, hoe declareer ik een array met een lengte die in een variabele staat. Zegmaar: Dim Arr(i, 2). Zo pakt ie het namelijk niet.

Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Twee gevalletjes F1. Met voorbeelden en al :)
1: Geef de tweede sub de variabele mee als parameter of vraag het object opuit de oleobjects collectie.
2: Zo gaat het wel. Je doet iets anders fout.

Ga eens in de editor op een keywoord staan en ram op F1. Gaat er een wereld voor je open :)

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

  • Clock
  • Registratie: Maart 2005
  • Laatst online: 11-09 13:23
Hmmja, je hebt gelijk. Ik had beide antwoorden net al gevonden.
Dim werkte op een of andere manier niet, ReDim echter wel gewoon.

Bedankt jongens!
Pagina: 1