emploi particulier d'un combobox_change

Le
Greffier
Bonjour,

J'expose mon idée.
J'ai 5 ComboBox (liste déroulante avec différents choix) dans un userfom

ComboBox1
ComboBox2
ComboBox3
ComboBox4
ComboBox5

En fonction de la sélection du ComboBox1, les choix possibles dans les 4
autres sont déterminés.
Les listes de choix de chaque ComboBox sont définies à l'intérieur par des
additem.

L'affichage des ComboBox se met à jour en fonction du choix manuel en
cliquant sur la valeur désirée.

MAIS, il est intéressant de savoir qu'à un certain choix sur ComboBox1 les 4
autres sont les mêmes.

COMMENT, une fois CE choix effectué je peux faire exécuter les ordres
contenus dans les quatre autres ComboBox, sans aller cliquer pour mettre à
jour les 4 ComboBox pour les faire exécuter.

Il serait intéressant d'avoir ce schéma :

Exécuter ComboBox1
'''Garnir ComboBox2
Faire exécuter ComboBox2_change
'''Garnir ComboBox3
Faire exécuter ComboBox3_change
'''Garnir ComboBox4
Faire exécuter ComboBox4_change
'''Garnir ComboBox5
Faire exécuter ComboBox5_change

J'aimerais utiliser cette solution, qui est la plus logique à mon goût, mais
comment faire pour que les ComboBox2 3 4 5
s'exécutent alors comme des sous-programmes et gardent leurs valeurs durant
la durée pour la valeur de la ComboBox1.

Pourrait-on à la rigueur exécuter une ComboBox comme un sous-programme à qui
on transmettrait une valeur.

D'avance merci pour votre aide.

Greffier.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
jeanmarcnoury
Le #18390211
On 14 jan, 22:49, "Greffier"
Bonjour,

J'expose mon idée.
J'ai 5 ComboBox (liste déroulante avec différents choix) dans un user fom

ComboBox1
ComboBox2
ComboBox3
ComboBox4
ComboBox5

En fonction de la sélection du ComboBox1, les choix possibles dans les 4
autres sont déterminés.
Les listes de choix de chaque ComboBox sont définies à l'intérieur par des
additem.

L'affichage des ComboBox se met à jour en fonction du choix manuel en
cliquant sur la valeur désirée.

MAIS, il est intéressant de savoir qu'à un certain choix sur ComboBox 1 les 4
autres sont les mêmes.

COMMENT, une fois CE choix effectué je peux faire exécuter les ordres
contenus dans les quatre autres ComboBox, sans aller cliquer pour mettre à
jour les 4 ComboBox pour les faire exécuter.

Il serait intéressant d'avoir ce schéma :

Exécuter ComboBox1
'''Garnir ComboBox2
Faire exécuter ComboBox2_change
'''Garnir ComboBox3
Faire exécuter ComboBox3_change
'''Garnir ComboBox4
Faire exécuter ComboBox4_change
'''Garnir ComboBox5
Faire exécuter ComboBox5_change

J'aimerais utiliser cette solution, qui est la plus logique à mon goû t, mais
comment faire pour que les ComboBox2 3 4 5
s'exécutent alors comme des sous-programmes et gardent leurs valeurs du rant
la durée pour la valeur de la ComboBox1.

Pourrait-on à la rigueur exécuter une ComboBox comme un sous-programm e à qui
on transmettrait une valeur.

D'avance merci pour votre aide.

Greffier.



Hello,

on peut faire 2 réponses.
La réponse technique, c'est qu'il est possible d'appeler directement
une procédure évènementielle.
Tu peux faire depuis ton combo1 :

Private Sub Combo1_Change()

Call combo2_change
End Sub

Ca, c'est pour la technique.
Maintenant la réponse "non technique" : ce n'est pas une bonne idée de
faire comme ça. Tu introduis un couplage entre le code fonctionnel et
l'interface graphique, ce qui est dans tous les cas une très mauvaise
pratique.

Le plus sain, c'est d'écrire ton code dans des fonctions bien
autonomes, recevant ce qu'il faut comme paramètres et d'appeler ces
fonctions depuis le ou les endroits appropriés.
Ainsi, tu ne lies pas ton coded à ton interface graphique : si demain
tu changes l'interface graphique, si tu remplaces les combo par autre
chose, etc., ton code ne nécessite que peu de chnagements, car toute
la partie fonctionnelle est présente dans des fonctions.


Cordialement;

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Greffier
Le #18390351
Bonjour Jean-Marc,

Merci pour la réponse.
Mais comment faire, sinon dupliquer les combobox.

J'aurais aimé un exemple pour les 2 cas, quelles propriétés sont à changer
pour voir les combobox s'exécuter seules.

Merci pour votre réponse.

Greffier.




On 14 jan, 22:49, "Greffier"
Bonjour,

J'expose mon idée.
J'ai 5 ComboBox (liste déroulante avec différents choix) dans un userfom

ComboBox1
ComboBox2
ComboBox3
ComboBox4
ComboBox5

En fonction de la sélection du ComboBox1, les choix possibles dans les 4
autres sont déterminés.
Les listes de choix de chaque ComboBox sont définies à l'intérieur par des
additem.

L'affichage des ComboBox se met à jour en fonction du choix manuel en
cliquant sur la valeur désirée.

MAIS, il est intéressant de savoir qu'à un certain choix sur ComboBox1 les
4
autres sont les mêmes.

COMMENT, une fois CE choix effectué je peux faire exécuter les ordres
contenus dans les quatre autres ComboBox, sans aller cliquer pour mettre à
jour les 4 ComboBox pour les faire exécuter.

Il serait intéressant d'avoir ce schéma :

Exécuter ComboBox1
'''Garnir ComboBox2
Faire exécuter ComboBox2_change
'''Garnir ComboBox3
Faire exécuter ComboBox3_change
'''Garnir ComboBox4
Faire exécuter ComboBox4_change
'''Garnir ComboBox5
Faire exécuter ComboBox5_change

J'aimerais utiliser cette solution, qui est la plus logique à mon goût,
mais
comment faire pour que les ComboBox2 3 4 5
s'exécutent alors comme des sous-programmes et gardent leurs valeurs
durant
la durée pour la valeur de la ComboBox1.

Pourrait-on à la rigueur exécuter une ComboBox comme un sous-programme à
qui
on transmettrait une valeur.

D'avance merci pour votre aide.

Greffier.



Hello,

on peut faire 2 réponses.
La réponse technique, c'est qu'il est possible d'appeler directement
une procédure évènementielle.
Tu peux faire depuis ton combo1 :

Private Sub Combo1_Change()

Call combo2_change
End Sub

Ca, c'est pour la technique.
Maintenant la réponse "non technique" : ce n'est pas une bonne idée de
faire comme ça. Tu introduis un couplage entre le code fonctionnel et
l'interface graphique, ce qui est dans tous les cas une très mauvaise
pratique.

Le plus sain, c'est d'écrire ton code dans des fonctions bien
autonomes, recevant ce qu'il faut comme paramètres et d'appeler ces
fonctions depuis le ou les endroits appropriés.
Ainsi, tu ne lies pas ton coded à ton interface graphique : si demain
tu changes l'interface graphique, si tu remplaces les combo par autre
chose, etc., ton code ne nécessite que peu de chnagements, car toute
la partie fonctionnelle est présente dans des fonctions.


Cordialement;

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
LE TROLL
Le #18392761
sub combo1_click()
combo2.clear
select case combo1.listindex
case 0
combo2.listindex = "un"
combo2.listindex = "deux"
case 1
combo2.listindex = "un"
combo2.listindex = "trois"
end select
combo2.listindex=0
combo2.setfocus
end sub




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




"Greffier"
Bonjour Jean-Marc,

Merci pour la réponse.
Mais comment faire, sinon dupliquer les combobox.

J'aurais aimé un exemple pour les 2 cas, quelles propriétés sont à changer
pour voir les combobox s'exécuter seules.

Merci pour votre réponse.

Greffier.




On 14 jan, 22:49, "Greffier"
Bonjour,

J'expose mon idée.
J'ai 5 ComboBox (liste déroulante avec différents choix) dans un userfom

ComboBox1
ComboBox2
ComboBox3
ComboBox4
ComboBox5

En fonction de la sélection du ComboBox1, les choix possibles dans les 4
autres sont déterminés.
Les listes de choix de chaque ComboBox sont définies à l'intérieur par
des
additem.

L'affichage des ComboBox se met à jour en fonction du choix manuel en
cliquant sur la valeur désirée.

MAIS, il est intéressant de savoir qu'à un certain choix sur ComboBox1
les 4
autres sont les mêmes.

COMMENT, une fois CE choix effectué je peux faire exécuter les ordres
contenus dans les quatre autres ComboBox, sans aller cliquer pour mettre
à
jour les 4 ComboBox pour les faire exécuter.

Il serait intéressant d'avoir ce schéma :

Exécuter ComboBox1
'''Garnir ComboBox2
Faire exécuter ComboBox2_change
'''Garnir ComboBox3
Faire exécuter ComboBox3_change
'''Garnir ComboBox4
Faire exécuter ComboBox4_change
'''Garnir ComboBox5
Faire exécuter ComboBox5_change

J'aimerais utiliser cette solution, qui est la plus logique à mon goût,
mais
comment faire pour que les ComboBox2 3 4 5
s'exécutent alors comme des sous-programmes et gardent leurs valeurs
durant
la durée pour la valeur de la ComboBox1.

Pourrait-on à la rigueur exécuter une ComboBox comme un sous-programme à
qui
on transmettrait une valeur.

D'avance merci pour votre aide.

Greffier.



Hello,

on peut faire 2 réponses.
La réponse technique, c'est qu'il est possible d'appeler directement
une procédure évènementielle.
Tu peux faire depuis ton combo1 :

Private Sub Combo1_Change()

Call combo2_change
End Sub

Ca, c'est pour la technique.
Maintenant la réponse "non technique" : ce n'est pas une bonne idée de
faire comme ça. Tu introduis un couplage entre le code fonctionnel et
l'interface graphique, ce qui est dans tous les cas une très mauvaise
pratique.

Le plus sain, c'est d'écrire ton code dans des fonctions bien
autonomes, recevant ce qu'il faut comme paramètres et d'appeler ces
fonctions depuis le ou les endroits appropriés.
Ainsi, tu ne lies pas ton coded à ton interface graphique : si demain
tu changes l'interface graphique, si tu remplaces les combo par autre
chose, etc., ton code ne nécessite que peu de chnagements, car toute
la partie fonctionnelle est présente dans des fonctions.


Cordialement;

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;









jeanmarcnoury
Le #18393491
On 15 jan, 13:25, "LE TROLL"
sub combo1_click()
  combo2.clear
  select case combo1.listindex
    case 0
      combo2.listindex = "un"
      combo2.listindex = "deux"
    case 1
      combo2.listindex = "un"
      combo2.listindex = "trois"
  end select
  combo2.listindex=0
  combo2.setfocus
end sub




On peut aussi le faire proprement et de façon non hard-codée.

Option Explicit

Private Const NB_COMBO As Long = 3
Private Const MAX_CHOICES As Long = 10

Dim G_Init_Done As Boolean

Dim ComboLabels(NB_COMBO, MAX_CHOICES) As String
Dim ComboRules(NB_COMBO - 1) As String
'

Private Sub FillComboLabels()

Dim i As Long
Dim j As Long
Dim szItem As String

ComboLabels(1, 1) = "Combo1_1"
ComboLabels(1, 2) = "Combo1_2"
ComboLabels(1, 3) = "Combo1_3"

ComboLabels(2, 1) = "Combo2_1"
ComboLabels(2, 2) = "Combo2_2"
ComboLabels(2, 3) = "Combo2_3"

ComboLabels(3, 1) = "Combo3_1"
ComboLabels(3, 2) = "Combo3_2"
ComboLabels(3, 3) = "Combo3_3"

' Regles
' ComboRules(1) = Combo1_1 => 2,3
' Combo1_2 => 1,2
' Combo1_3 => 3
'
' ComboRules(2) = Combo2_1 => 1,2
' Combo2_2 => 1,3
' Combo2_3 => 1,2,3

ComboRules(1) = "Combo1_1|2,3*Combo1_2|1,2*Combo1_3|3"
ComboRules(2) = "Combo2_1|1,2*Combo2_2|1,3*Combo2_3|1,2,3"

For i = 1 To NB_COMBO
For j = 1 To MAX_CHOICES
szItem = ComboLabels(i, j)
If szItem <> "" Then
MyCombos(i - 1).AddItem szItem
Else
Exit For
End If
Next j
MyCombos(i - 1).ListIndex = 0
Next i

End Sub

Private Sub Form_Load()

Call FillComboLabels
G_Init_Done = True
End Sub

Private Sub MyCombos_Change(Index As Integer)

Dim CurComboValue As String
Dim Rules As String
Dim t() As String
Dim choices As String
Dim i As Long
Dim szItem As String
Dim p As Long

If Index < NB_COMBO - 1 Then
CurComboValue = MyCombos(Index).Text
Rules = ComboRules(Index + 1)
t() = Split(Rules, "*")
For i = 0 To UBound(t())
If Mid$(t(i), 1, InStr(t(i), "|") - 1) = CurComboValue
Then
choices = Mid$(t(i), InStr(t(i), "|") + 1)
End If
Next i
t = Split(choices, ",")
MyCombos(Index + 1).Clear
For i = 0 To UBound(t())
p = t(i)
szItem = ComboLabels(Index + 1 + 1, p)
MyCombos(Index + 1).AddItem szItem
Next i
MyCombos(Index + 1).ListIndex = 0
End If
End Sub

Private Sub MyCombos_Click(Index As Integer)

If G_Init_Done Then
Call MyCombos_Change(Index)
End If
End Sub


Il suffit maintenant d'adapter la fonction FillComboLabels en fonction
de ses besoins.
Bien sur dans une implémentation propre, les valeurs des textes des
Combos et les
règles de remplissage seront lues depuis un fichier de configuration.

Mais tel quel, le code est fonctionnel et tout à fait utilisable.

Le "secret" (de polichinelle ici) consiste simplement à utiliser des
contrôles indexés
et des tableaux. Du coup, tout devient facile.
Ajouter une combo et des règles se fait SANS DEVOIR ECRIRE DE CODE,
sans même
devoir modifier l'existant.


Cordialement;

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB:http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
parci
Le #18393631
On 15 jan, 15:38, wrote:

Mais tel quel, le code est fonctionnel et tout à fait utilisable.

Le "secret" (de polichinelle ici) consiste simplement à utiliser des
contrôles indexés
et des tableaux. Du coup, tout devient facile.
Ajouter une combo et des règles se fait SANS DEVOIR ECRIRE DE CODE,
sans même
devoir modifier l'existant.



Le seul problème c'est que les contrôles ne sont pas indexés sur les
userforms (Greffier parle de userform, donc vba, pas vb).
Ca sera donc quand même un peu hard code pour lui.
jeanmarcnoury
Le #18394021
On 15 jan, 14:58, wrote:
On 15 jan, 15:38, wrote:



> Mais tel quel, le code est fonctionnel et tout à fait utilisable.

> Le "secret" (de polichinelle ici) consiste simplement à utiliser des
> contrôles indexés
> et des tableaux. Du coup, tout devient facile.
> Ajouter une combo et des règles se fait SANS DEVOIR ECRIRE DE CODE,
> sans même
> devoir modifier l'existant.

Le seul problème c'est que les contrôles ne sont pas indexés sur le s
userforms (Greffier parle de userform, donc vba, pas vb).
Ca sera donc quand même un peu hard code pour lui.



C'est juste, je n'avais pas vu qu'il parlait de userform. Dans ce cas,
on peut garder le principe des regles et des lables externes, mais il
faudra un peu de code spécifique pour traiter les combo un à un. Ceci
dit, je pense qu'une fonction bien sentie, appelée depuis les
combo1_change / combo2_change / etc. qui recevrait en paramètre
l'équivalent de l'index (1, 2, 3 etc.) reviendra finalement au
même :-)

--
Jean-Marc Noury
Greffier
Le #18400581
Merci à parcy, et jean-marc,

Tout ce que vous avez écrit me donne l'occasion de réfléchir et de passer un
bon week-end.
Je n'ai jamais trouvé de grandes différences entre VBA et VB.6 SP6

Mais je vais tout regarder à la loupe.

bonne journée.

Greffier.




On 15 jan, 14:58, wrote:
On 15 jan, 15:38, wrote:



> Mais tel quel, le code est fonctionnel et tout à fait utilisable.

> Le "secret" (de polichinelle ici) consiste simplement à utiliser des
> contrôles indexés
> et des tableaux. Du coup, tout devient facile.
> Ajouter une combo et des règles se fait SANS DEVOIR ECRIRE DE CODE,
> sans même
> devoir modifier l'existant.

Le seul problème c'est que les contrôles ne sont pas indexés sur les
userforms (Greffier parle de userform, donc vba, pas vb).
Ca sera donc quand même un peu hard code pour lui.



C'est juste, je n'avais pas vu qu'il parlait de userform. Dans ce cas,
on peut garder le principe des regles et des lables externes, mais il
faudra un peu de code spécifique pour traiter les combo un à un. Ceci
dit, je pense qu'une fonction bien sentie, appelée depuis les
combo1_change / combo2_change / etc. qui recevrait en paramètre
l'équivalent de l'index (1, 2, 3 etc.) reviendra finalement au
même :-)

--
Jean-Marc Noury
Publicité
Poster une réponse
Anonyme