Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 Problème pour charger un ComboBox au moyen d'une boucle

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

Sur une feuille, j'ai :
- un certain nombre de ComboBox dont les noms ont tous le même préfixe ("ComboListe") : "ComboListe1", "ComboListe2", "ComboListe3"...
Ce nombre peut éventuellement varier si l'on désire en rajouter un ;
- un ComboBox, qui se charge lors de l'ouverture du classeur, et qui affiche uniquement le suffixe de chaque ComboBox préfixé "ComboListe" : 1, 2, 3...
Au départ, j'avais écrit ceci :
VB:
Sub Workbook_Open()

Dim liste

    'on charge le ComboBox "ComboBox_NbSolvants"
    liste = Array("1", "2", "3", "4", "5", "6", "7")
    With Worksheets("Données").ComboBox_NbSolvants
        .List = liste
        .ListIndex = [Remember]  'cellule nommée "Remember" qui conserve le dernier ListIndex du ComboBox "ComboBox_NbSolvants" avant la dernière fermeture du classeur
    End With
End Sub
Ça marche bien. Le ComboBox est bien chargé et le bon item sélectionné à l'ouverture du classeur.
Pour ne pas à avoir à modifier l'Array, au cas où l'on rajouterait un, voire plusieurs "ComboListe", j'ai procédé ainsi :
Faire un décompte, à l'ouverture du classeur, de tous les ComboBox préfixés "ComboListe", au moyen de cette fonction :
VB:
Function NbActiveX(TypeObjet$, préfixe$, hoja As Byte) As Byte
'Renvoie le nombre d'ActiveX de même type et ayant tous le même préfixe d'une feuille donnée du classeur.
'Ex : "MonCombo1","MonCombo2","MonCombo3"...
'- TypeObjet : un ActiveX ("ComboBox", "CheckBox", "CommandButton"...)
'- préfixe : le préfixe commun des objets en question
'- hoja : le numéro de la feuille du classeur
'Magic_Doctor

Dim f As Worksheet, largo As Byte, c, i As Byte

    Set f = Sheets(hoja)
    largo = Len(préfixe)

    For Each c In f.OLEObjects
        If TypeName(c.Object) = TypeObjet And Left(c.Name, largo) = préfixe Then i = i + 1
    Next

    NbActiveX = i
End Function
J'ai donc écrit ceci dans Workbook_Open() :
VB:
Sub Workbook_Open()

Dim NbComboListe As Byte, liste(), i As Byte

    'décompte du nombre de ComboBox dans le feuille 1 ("Données") dont le préfixe est "ComboListe"
    NbComboListe = NbActiveX("ComboBox", "ComboListe", 1)

    'on charge le ComboBox "ComboBox_NbSolvants"
    ReDim liste(1 To NbComboListe)
    For i = 1 To NbComboListe
        liste(i) = i
    Next

    With Worksheets("Données").ComboBox_NbSolvants
        .List = liste
        .ListIndex = [Remember]
    End With
End Sub
Ça marche presque bien, à ceci près que le ComboBox qui contient la liste des suffixes affiche une liste "fantôme" qui a néanmoins l'air de s'être bien chargée : quand on la déploie, aucun item apparaît, et pourtant quand on clique sur une ligne "vide" de la liste, tout marche correctement.
Comment faire en sorte que les items apparaissent concrètement ?
Bien sûr, on peut me rétorquer qu'il est plus simple de rajouter un nombre dans l'Array et voili voilou. Mais c'est pour le fun que j'ai décidé de procéder ainsi.
 

ChTi160

XLDnaute Barbatruc
Re
Merci
autre remarque
si je mets
VB:
Set sht = Worksheets("Données")
avec Dim  Sht as Worksheet
With sht.ComboBox_NbSolvants ne marche pas
alors que ca fonctionne si je mets Dim Sht as object ????????
un peu Chi--t le Chti ? Lol
jean marie
 

patricktoulon

XLDnaute Barbatruc
oui c'est normal par ce que tu est dans la collection object de type anonyme

en gros vba interprète sht comme un object (quelqu'il soit)

donc
with sht.ComboBox_NbSolvants

ComboBox_NbSolvants
est alors le descendant (ou l'enfant comme tu veux) de sht vba va donc mouliner plus fort en mémoire et procc pour determiner le type de descendance( ou le type membre) et dans la collection il ne trouvera donc que cette satanée combobox qui est je te le donne dans le mille ........ un object de type oleobject

mais attention dans certains cas ça ne fonctionnera pas si tu pousse l'exploitation des property ou fonction d'un object

as object est un dimensionnement de variable object générique que l'on utilise pour créer un object que l'on défini par la suite cet object generique devient alors un object precis (avec tout ces propriété et fonction ) apres sa definition

j’espère avoir répondu a ta question
 

patricktoulon

XLDnaute Barbatruc
pour t'en convaincre définitivement
VB:
Sub test()
Dim Sht As Object
Set Sht = Feuil1
Set macombo = Sht.ComboBox_NbSolvants
MsgBox TypeName(macombo)
End Sub

Sub test2()
Dim Sht As Worksheet
Set Sht = Feuil1
Set macombo = Sht.OLEObjects("ComboBox_NbSolvants")
MsgBox TypeName(macombo)
MsgBox TypeName(macombo.Object)
End Sub

et pour rendre cela encore plus clair voici la liste des membres (propriété/fonction) de la collection Oleobjects
comme tu peux le voir a aucun moment on y trouvre le membre .list
 

Discussions similaires

Réponses
0
Affichages
706
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…