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
Bonsoir Magic_Doctor
Tu mets !
VB:
    .List = Application.Transpose(liste)
Code:
Option Explicit
Option Base 1
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
         .ColumnCount = 1
         .ColumnWidths = "1"
         .List = Application.Transpose(liste)       
         .ListIndex = [Remember]
    End With
End Sub
jean marie
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
re
tu remplies les colonnes de ton tableau (Liste) 1 To NbComboListe
puis tu le rentres dans le Combobox pour en faire une Colonne
tu as 1,2,3 sur une ligne
tu transposes
en
1
2
3
en inversant ta Liste (transpose)
jean marie
 

ChTi160

XLDnaute Barbatruc
Re
je ne sais pas Lol
mais peut être voir ce qu'est un ARRAY() ,son format etc etc
car si tu mets dans ta procédure avec ARRAY
.List =Application.transpose(Liste) et bien ca ne change rien Lol ??????
tu as des Lignes tout comme pour :
.List =Liste
jean marie
 

patricktoulon

XLDnaute Barbatruc
Bonjour
oui ben c'est curieux que ça fonctionne(ça ne devrait pas !!!)
1° un oleobject fait parti de la collection Oleobjects
de ce fait certaines(pas toutes!!!!) de ses property sont accessibles par le

"ComboBox_NbSolvants . object . property

2° on peut aussi simplifier la recherche de comboboliste

3° transpose n'est absolument pas nécessaire pour ".list" quand c'est un array (1 dim)

donc je simplifie la chose


la fonction qui compte les comboliste devient la fonction qui créée l'array (1 dim)
VB:
Option Explicit
Option Base 1
Sub Workbook_Open()
    With Worksheets("Données").ComboBox_NbSolvants
        .ColumnCount = 1
        .ColumnWidths = "1"
        .Object.List = liste("ComboListe", 1)
        .Object.ListIndex = [Remember]
    End With
End Sub
Function liste(préfixe$, hoja As Byte)
    Dim f As Worksheet, tbl(), c, i&
    Set f = Sheets(hoja)
    For Each c In f.OLEObjects
        If c.Name Like préfixe & "*" Then i = i + 1: ReDim Preserve tbl(1 To i): tbl(i) = i
    Next
    liste = tbl
End Function
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
Bonjour
Merci Patrick !
a quoi est du le problème décrit :
Bonne journée
jean marie
 

patricktoulon

XLDnaute Barbatruc
re

Bonjour jean marie
le probleme est du au fait que vous confondez activX et Oleobject

alors OUI!!!! sur certaines versions (d'excel + config+exploitation) l'erreur n'est pas relevée
et donc dans votre exercice (enfin celui de Magic_doctor) on se retrouve avec une liste de x item mais vide

les activx sur feuille doivent toujours!!!!!!!!!!! etre traités avec .object pour certaines de leur propriété
en l'occurence ici pour le ".List"

ComboBox_NbSolvants.list = liste---> PAS BON !!!!!!!

ComboBox_NbSolvants.object.list = liste---> BON !!!!!!!


la raison est simple
a part dans le module de la feuille parent du controls activX on ne peut avoir acces a ces controls que par la collections Oleobjects
je ne peux être plus clair
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
Re
la Liste n'est pas vide , mais mais invisible Lol
j'ai mis ca :
il faut savoir que les Combobox ne sont pas sur la même feuille!
VB:
Sub Workbook_Open()
Dim f As Worksheet,  c, i&
i = 0
    Set f = Sheets("Feuil1")
    With Worksheets("Données").ComboBox_NbSolvants  
        For Each c In f.OLEObjects
            If c.Name Like préfixe & "*" Then
                    i = i + 1
             .Object.AddItem i
         End If
      Next c
        .Object.ListIndex = [Remember]
    End With
End Sub
merci encore
Bonne Journée
jean marie
 

ChTi160

XLDnaute Barbatruc
Re
Merci mais lors du test de sa procédure on a bien la Liste blanche mais qui contient une Liste Lol
d'où ma question du pourquoi!
merci encore Patrick pour ces explications qui me font avancé !
autre question :
pourquoi si je mets la feuille en Variable ca ne marche pas ?
VB:
Set sht = Worksheets("Données")
    With sht.ComboBox_NbSolvants 'Erreur ici
jean marie
 

patricktoulon

XLDnaute Barbatruc

pour la même raison !!!!!!!!!!!!!!!!!!!!!
VB:
Set sht = Worksheets("Données")
    With sht.OleObjects("ComboBox_NbSolvants").object''plus d'erreur ici

afin que vous compreniez la chose simplement
dites vous dans la tete qu'un oleobject dans une feuille peut être un bouton, un checkbox , une combobox ,une listbox , etc...
de ce fait tous !!! n'ont pas la propriété ".list" par exemple

donc pour certaines propriété generique (comme pour ".name" par exemple) )on n'a pas besoins de ".Object"

en gros!!!! toute les propriété qui ne sont pas pour tout les controls activX c'est ".Object" sinon non!!!
 

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…