[VBA] Door alle combobox waarden lopen

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

  • Clock
  • Registratie: Maart 2005
  • Laatst online: 12-04 15:52
Goedenavond,

Op deze tweede kerstavond ben ik maar weer eens verder gegaan met mijn VBA-geklooi. Ik heb in mijn sheet een x aantal comboboxes. Aan deze comboboxen wil ik op een gegeven moment een nieuwe range toewijzen. Maar de oorspronkelijk waarde die geselecteerd was in de combobox moet bewaard blijven.

Ik wil dus door alle comboboxen in mijn sheet lopen, en de waarde van elk opslaan in een array. Niet al te moeilijk, leek mij. Door de comboboxen lopen was geen probleem, alleen hun waarde uitlezen (wat volgens mij helemaal niet moeilijk kan en mag zijn) lukt voor geen meter.

Code:
code:
1
2
3
4
5
6
7
8
9
For Each shp In ActiveSheet.Shapes
  If Left(shp.Name, 9) = "FO_vuller" Then
    'Sla huidige keuze oo
    ComboArr(i) = 1
    MsgBox (shp.Object.Value) '1
    MsgBox (ActiveSheet.Shapes("FO_vuller_1_1").Object.Value) '2
    i = i + 1
  End If
Next


Zoals te zien heb ik de 2 mogelijkheden die mij het meest logische leken geprobeerd, maar deze resulteren beide in een foutmelding (wordt niet ondersteunt door object oid).

Hoe kan ik dit wel goed doen?
Alvast bedankt!

  • Witte
  • Registratie: Februari 2000
  • Laatst online: 29-01 15:02
Je moet niet loopen over 'shapes' maar over 'OLEobjects'.

Daarna kan je met de .object.value-property de waarde uitlezen.
Dus:

code:
1
2
3
4
5
For Each shp In ActiveSheet.OLEobjects
  If shp.OLEtype = 2 and left(shp.name, 3) = 'cbo' Then
    MsgBox shp.object.value
  End If
Next


OLEtype 2 wil alleen maar zeggen: XlOLEControl, oftewel: een Excel-control.
Je moet dus ook op naam checken (met de .name-property) of het een combobox is. Ik zou je aanraden om in de naamgeving comboboxes met 'cbo' te laten beginnen, bijvoorbeeld cboTest1

onderstaande code vult je array (maximaal 1000 comboboxen, maar dat zal wel genoeg zijn!):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Private Type combo
  name As String
  value As Variant
End Type

Sub vularray()
  Dim comboarray(1000) As combo
  Dim last As Long
  Dim myObject As OLEObject

  For Each myObject In ActiveSheet.OLEObjects
    If myObject.OLEType = 2 And Left(myObject.name, 3) = "cbo" Then
      last = myObject.index
      comboarray(last).name = myObject.name
      comboarray(last).value = myObject.Object.value
    End If
  Next

  MsgBox "Er zijn: " & last & " comboboxen in de array ogeslagen."
End Sub

[ Voor 75% gewijzigd door Witte op 27-12-2007 12:04 ]

Houdoe