Actualiser par macro un ComboBox

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

J'essaie d'actualiser au moyen d'une macro un ComboBox.
Une partie du chemin a déjà été faite, mais je n'arrive pas au bout...

Ci-joint un exemple.

Merci pour l'aide.
 

Pièces jointes

  • Exemple ComboBox.zip
    21.5 KB · Affichages: 76
  • Exemple ComboBox.zip
    21.5 KB · Affichages: 79
  • Exemple ComboBox.zip
    21.5 KB · Affichages: 71

Magic_Doctor

XLDnaute Barbatruc
Re : Actualiser par macro un ComboBox

Bonjour Youky,

Je n'ai pu voir ta réponse que ce matin (en Uruguay).
Ça marche très bien et en plus ta routine est très courte. Bravo !

Deux petites questions pour ne pas mourrir idiot :

1/ For k = 4 To .[F65536].End(3).Row
Que signifie End(3) ?

2/ À quoi sert SendKeys "{F4}" ?


Bonne journée à tous ceux qui auront lu ce message.
 

youky(BJ)

XLDnaute Barbatruc
Re : Actualiser par macro un ComboBox

Ravis de correspondre d'aussi loin...
Cela doit être un beau Pays à visiter
Ramène pas la grippeA dans la valise..
Pour ta demande voici qlq explications..
>>>.[F65536].End(3).Row
le 3 indique la direction soit xltoleft-xltoright-xlup-xldown
3 ou xlUp sont identique

SendKeys "{F4}"
ceci simule l'appuie sur la touche F4 qui ouvre la fenêtre du combobox aprés l'avoir activé
dans la macro tu peux supprimer la ligne
....Activate et le SendKeys mais la fenêtre du combo restera fermée.
Bon séjour en Uruguay
Au plaisir
 

Magic_Doctor

XLDnaute Barbatruc
Re : Actualiser par macro un ComboBox

Merci Youky pour tes explications.

Je ne suis pas de passage en Uruguay, mais y vis depuis fort longtemps.
Pas grand chose à voir ici à part le plancher des vaches. À la rigueur la côte : Punta del Este (le St-Tropez local), Cabo polonio (dont le tourisme fut développé par un ancien Légionnaire...), Punta del Diablo.

En revanche, le festival pour les yeux : Argentine (sud + Cordillère / Pampa : à mourrir d'ennui !!) et surtout Chili (pratiquement tout).

Buenas noches.
 

Magic_Doctor

XLDnaute Barbatruc
Re : Actualiser par macro un ComboBox

Bonjour,

Youky (BJ) m'avait donc donné une solution élégante. J'y ai fait seulement quelques modifications mineures pour n'avoir à introduire dans la macro que les noms du ComboBox et de la plage de cellules (qui est par définition nommée) correspondant aux valeurs de la liste dudit ComboBox. J'en ai aussi profité pour faire en sorte d'éviter un message d'erreur au cas où la liste serait vide.
Enfin, ça donne ceci :

------------------------------------------------------------------

Sub ActualiserCombo()
'youky (BJ) + Magic_Doctor

Application.ScreenUpdating = False
Application.EnableEvents = False

Dim k As Byte

With Sheets(1)
.ComboBoxGlicemias.Clear
For k = [Gly].Row To [Gly].End(4).Row
If .Cells(k, [Gly].Column) <> "" Then .ComboBoxGlicemias.AddItem .Cells(k, [Gly].Column)
Next
If .ComboBoxGlicemias.ListCount = 0 Then Exit Sub
.ComboBoxGlicemias.Text = .ComboBoxGlicemias.List(0)
.ComboBoxGlicemias.Activate
'SendKeys "{F4}"
End With

Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

-------------------------------------------------------------------

Où : "ComboBoxGlicemias" = nom du ComboBox
"Gly" = nom de la plage de cellules correspondant à la liste du ComboBox

Maintenant je voudrais rendre cette macro encore plus polyvalente. Je m'explique :
si j'ai (supposons...) 10 ComboBox, je devrais alors attribuer une macro différente à chacune de ces ComboBox. Pour m'éviter ce pensum, je voudrais paramatrer l'en-tête de la macro ainsi :

Sub ActualiserCombo(Combo As OLEObjects, liste As Range, feuille As Byte)

.
.
.

End Sub

Où : "Combo" = nom du ComboBox
"liste" = nom de la plage de cellules correspondant à la liste du ComboBox
"feuille" = numéro de la feuille où se trouvent et la ComboBox et sa liste

J'ai bien tenté (sans grand espoir à vrai dire...) ceci :

Sub ActualiserCombo3(Combo As OLEObjects, liste As Range, feuille As Byte)
'youky (BJ) + Magic_Doctor

Dim k As Byte

With Sheets(feuille)
'.ComboBoxGlicemias.Clear
.Combo.Clear
'For k = [ListeComboBoxGlicemias].Row To [ListeComboBoxGlicemias].End(4).Row
For k = liste.Row To liste.End(4).Row
'If .Cells(k, [ListeComboBoxGlicemias].Column) <> "" Then .ComboBoxGlicemias.AddItem .Cells(k, [ListeComboBoxGlicemias].Column)
If .Cells(k, liste.Column) <> "" Then .Combo.AddItem .Cells(k, liste.Column)
Next
'If .ComboBoxGlicemias.ListCount = 0 Then Exit Sub
If .Combo.ListCount = 0 Then Exit Sub
'.ComboBoxGlicemias.Text = .ComboBoxGlicemias.List(0)
.Combo.Text = .Combo.List(0)
'.ComboBoxGlicemias.Activate
.Combo.Activate
'SendKeys "{F4}"
End With

End Sub

(en REM les sentences d'origine)

Je pense que je me suis complètement planté dans les déclarations des variables.

Un grand merci pour qui me sortira d'affaire.

Bonne journée.
 

Pièces jointes

  • ComboBox.zip
    21.7 KB · Affichages: 48
  • ComboBox.zip
    21.7 KB · Affichages: 48
  • ComboBox.zip
    21.7 KB · Affichages: 53

Magic_Doctor

XLDnaute Barbatruc
Re : Actualiser par macro un ComboBox

Bonjour PierreJean,

Le 3ème ComboBox est une erreur, je ne savais même pas qu'il y était. De toutes façons il pourrait très bien y avoir 150 ComboBox (avec bien entendu 150 listes différentes : 1 pour chaque ComboBox), la philosophie du projet n'en demeurerait pas moins la même, à savoir qu'il suffit de mettre en coordonnées dans l'en-tête de la macro : le nom du ComboBox, le nom de sa liste et enfin le numéro de la feuille où se trouvent ces éléments.

Ci-joint le fichier rectifié, sans ce 3ème ComboBox "mystérieusement" infiltré.
 

Pièces jointes

  • ComboBox.zip
    21.6 KB · Affichages: 45
  • ComboBox.zip
    21.6 KB · Affichages: 50
  • ComboBox.zip
    21.6 KB · Affichages: 45

Magic_Doctor

XLDnaute Barbatruc
Re : Actualiser par macro un ComboBox

PierreJean demandait :

"... pour une autre on suppose (Moments) avec ou sans les vides ?"


La macro gère ce problème en supprimant systématiquement tous les vides s'il y en a (en fin de liste ou dans la liste même), de telle sorte que la liste déroulante du ComboBox montre une liste sans solution de continuité.

La macro marche parfaitement, il s'agit uniquement que les paramètres (en en-tête) soient reconnus et bien interprétés.
 

youky(BJ)

XLDnaute Barbatruc
Re : Actualiser par macro un ComboBox

Bonjour Uruguannais,,,
Macro pour tes 3 combo ,,,remplir seulement les array


Code:
Sub ActualiserCombo()
'youky (BJ) + Magic_Doctor
Dim liste, onglet, combo, nc
Application.ScreenUpdating = False
Application.EnableEvents = False
Dim k As Byte
onglet = "Base"
liste = Array("", "Gly", "Moments", "Gly")
combo = Array("", "ComboBoxGlicemias", "ComboboxMoments", "ComboBoxMomentosDia")
With Sheets(onglet)
For nc = 1 To 3 '3 est le nombre de combo
.OLEObjects(combo(nc)).Object.Clear
    For k = .Range(liste(nc)).Row To .Range(liste(nc)).End(4).Row
        If .Cells(k, .Range(liste(nc)).Column) <> "" Then .OLEObjects(combo(nc)).Object.AddItem .Cells(k, Range(liste(nc)).Column)
    Next
    If .OLEObjects(combo(nc)).Object.ListCount = 0 Then Exit Sub
    .OLEObjects(combo(nc)).Object.Text = .OLEObjects(combo(nc)).Object.List(0)
Next nc
End With
End Sub
 

Magic_Doctor

XLDnaute Barbatruc
Re : Actualiser par macro un ComboBox

Bonjour youky,

Merci pour ta réponse, mais ne serait-il pas plus simple de directement paramétrer dans l'en-tête, car :
ActualiserCombo() ---> on doit à chaque fois reparamétrer dans le corps de la macro

Alors que :
ActualiserCombo(Combo As OLEObjects, liste As Range, feuille As Byte) ---> il suffit par la suite d'appeler la macro autant de fois qu'il y a de ComboBox que l'on veut actualiser :

Sub AppelCombo()

call ActualiserCombo(Combo1, liste1, 1)
call ActualiserCombo(Combo2, liste2, 1)
.
.
.
call ActualiserCombo(Combon, listen, 1)

End Sub

La 2ème solution me paraît plus souple (on fait appel à la macro en la paramétrant simplement comme s'il s'agissait d'une fonction, plutôt que de devoir rentrer à chaque fois dans la macro pour y changer les paramètres), mais bien entendu ce n'est qu'un point de vue.

Magic_Doctor "l'Uruguayen"
 

Magic_Doctor

XLDnaute Barbatruc
Re : Actualiser par macro un ComboBox

Bonsoir,

Opiniâtre, j'y suis presque arrivé.

Facilement j'ai réussi à gérer les deux dernières variables de l'en-tête de la macro : "liste" (la plage de cellules qui correspond à la liste du ComboBox) et "feuille" (le numéro de la feuille où se trouvent le ComboBox et sa liste).
En revanche j'achoppe pour le ComboBox. Je pense qu'il faut normalement le déclarer comme OLEObjects, mais ensuite, comment faire dans le corps de la macro pour qu'il soit reconnu ?

---------------------------------------------------------------------
Sub ActualiserCombo2(liste As Range, feuille As Byte) 'il manque encore le ComboBox...
'youky (BJ) + Magic_Doctor

Dim items As Range, k As Byte

Set items = liste

With Sheets(feuille)
.ComboBoxGlicemias.Clear
For k = [items].Row To [items].End(4).Row
If .Cells(k, [items].Column) <> "" Then .ComboBoxGlicemias.AddItem .Cells(k, [items].Column)
Next
If .ComboBoxGlicemias.ListCount = 0 Then Exit Sub
.ComboBoxGlicemias.Text = .ComboBoxGlicemias.List(0)
.ComboBoxGlicemias.Activate
End With

End Sub
 

Pièces jointes

  • ComboBox2.zip
    22.5 KB · Affichages: 37
  • ComboBox2.zip
    22.5 KB · Affichages: 44
  • ComboBox2.zip
    22.5 KB · Affichages: 42

Magic_Doctor

XLDnaute Barbatruc
Re : Actualiser par macro un ComboBox

Bonsoir,

Petite amélioration permettant que les items de la liste du ComboBox puissent se trouver dans une autre feuille que celle où est le ComboBox.
 

Pièces jointes

  • ComboBox3.zip
    27.3 KB · Affichages: 56
  • ComboBox3.zip
    27.3 KB · Affichages: 53
  • ComboBox3.zip
    27.3 KB · Affichages: 56

Discussions similaires

Statistiques des forums

Discussions
311 709
Messages
2 081 779
Membres
101 816
dernier inscrit
Jfrcs