VBA ComboBox... adapter un RowSource

VBA ComboBox... adapter un RowSource - VB/VBA/VBS - Programmation

Marsh Posté le 07-04-2009 à 14:02:54    

Bonjour à tous,
 
Je débute en Vba et j’ai quelques petits problèmes avec un comboBox… j’aimerai pouvoir sélectionner des valeurs dans une colonnes, sans que celles-ci se suivent forcément.
Mon comboBox affiche en effet, suivant les cas différentes valeurs. J’ai programmé pour le moment de la façon suivante :
 
'Cas 1
If ComboBox1.Value = "Cas1" Then
ComboBox2.RowSource = "Feuille2!A1:A5"
End If
 
Mon problème étant le fait que cette méthode m’oblige a faire pour chacun de mes cas un nouveau tableau où je met les valeurs à la suite dans une colonne. Hors comme je vais avoir plus de 200 cas différents, j’aimerai trouver un autre moyen du type :
 
'Cas 1, idéal mais qui ne marche pas…
If ComboBox1.Value = "Cas1" Then
ComboBox2.RowSource = "Feuille1!A1;A7:A9;A11"
End If
 
Cette programmation ne marche pas, du fait des propriété de la fonction RowSource, mais mon petit doigt me dit qu’il existe un moyen, à l’époque où on fait des jeux vidéos en 3D et des navettes spatiales, de trouver une solution à ce problème sans avoir à faire 200 tableaux différents, tâche fastidieuse et qui peut être source de nombreuses erreurs !
 
Je vous remercie d’avance pour l’attention que vous pourrez porter à ma requête.

Reply

Marsh Posté le 07-04-2009 à 14:02:54   

Reply

Marsh Posté le 07-04-2009 à 21:06:50    

Bonsoir,
si tu peux faire un filtre avancé avec copie dans une autre plage,  tu ne prends alors pour combobox2 que la plage où tu as copié le résultat .
Pour avoir le code du filtre avancé tu enregistres une macro.
Tu peux aussi organiser ta feuille2 avec un cas par colonne (si moins de 255 cas garanti)  
 
Cordialement


Message édité par seniorpapou le 07-04-2009 à 21:18:01
Reply

Marsh Posté le 07-04-2009 à 23:15:06    

Tu peux aussi mettre tes valeurs en forme de base de données :
1ere colonne : le n° du cas
2e colonne : la valeur associée

 

Ensuite, tu parcours cette liste en remplissant ta source de la 2e combo suivant le cas entré dans la 1ere combo :

 
Code :
  1. sub combobox1.aprèsMiseAjour
  2.     pour toutes les lignes du tableau faire :
  3.         si Cellule(ligne, colonne1).Valeur = combobox1.Valeur alors
  4.             combobox2.source=combobox2.source + Cellule(ligne, colonne2).Valeur
  5.         fin si
  6.         ligne suivante
  7.     boucle
  8. fin sub


(excuse moi, je n'ai plus en tête la syntaxe pour faire ça en vba excel, mais l'idée est là)

 

Edit : si tu prends la peine de trier par ordre de cas après chaque ajout, tu peux rajouter une condition pour quitter la boucle dès le 1er changement de cas après que le cas donné par le combobox1 a été trouvé (combobox2.source différente de vide), pour éviter de parcourir la liste jusqu'au bout et améliorer la vitesse d'exécution :

 
Code :
  1. sub combobox1.aprèsMiseAjour
  2.     pour toutes les lignes du tableau faire :
  3.         si Cellule(ligne, colonne1).Valeur = combobox1.Valeur alors
  4.             combobox2.source=combobox2.source + Cellule(ligne, colonne2).Valeur
  5.         sinon si combobox2.source<>""
  6.             sortir de la loop
  7.         fin si
  8.         ligne suivante
  9.     boucle
  10. fin sub


Message édité par otobox le 07-04-2009 à 23:24:03

---------------
OtObOxBlOg - - - Etre seul à avoir tort  c'est plus difficile, mais c'est bien plus beau que d'avoir raison avec une bande de cons
Reply

Marsh Posté le 08-04-2009 à 08:40:02    

Bonjour,
la proposition de OtObOx convient parfaitement.
Comme tu débutes:  
1) ne pas oublier de remettre à vide ("" ) le rowsource avant de faire la boucle de remplissage
2)Ne pas oublier de mettre le séparateur  ";" entre chaque valeur.
3) attention de ne pas dépasser la limitation en nombre de caractères du rowsource ainsi défini.
(certains disent 2048, je crois que c'est 255)
 
Si tu n'es pas certain de ne pas dépasser 255, il te faudra passer par les plages dans la feuil2.
Cordialement

Reply

Marsh Posté le 08-04-2009 à 17:55:29    

Oui, s'il y a dépassement de la capacité, il y a toujours moyen de faire une liste temporaire dans une colonne vide en recopiant les valeurs comme j'ai indiqué plus haut, au lieu de les mettre directement dans le rowsource. ensuite ya pu ka mettre la référence de la plage dans le rowsource et le tour est joué :)


---------------
OtObOxBlOg - - - Etre seul à avoir tort  c'est plus difficile, mais c'est bien plus beau que d'avoir raison avec une bande de cons
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed