OVH Cloud OVH Cloud

Boucle et compteur

4 réponses
Avatar
malabar
Hello

Sur un form, j'ai une quarantaine de ComboBox (43 exactement). Pour
chacune d'elles, j'ai 2 textBox qui leur sont d=E9di=E9es (donc 86
textbox).

J'ai le code suivant apr=E8s mise =E0 jour de chacune des combobox :

Private Sub ComboBox1_AfterUpdate()
If Me. ComboBox1 <> 0 Then
Me.TextBox1 =3D Me.ComboBox1.Column(1)
Me.TextBox2 =3D Me. ComboBox1.Column(2)
Else
Me.TextBox1 =3D VbNullString
Me.TextBox2 =3D VbNullString
End If
End Sub

Vu le nombre de combobox, n'y aurait-il pas une solution plus =E9conome
en lignes. J'ai pens=E9 =E0 faire une boucle et un compteur mais je suis
un peu perdu sur la fa=E7on d'utiliser le compteur dans la boucle.

Merci de votre aide

4 réponses

Avatar
ze Titi
Bonjour malabar

Tel que sont nommés tes champs, ça me paraît un peu compliqué...
En utilisant une convention de nommage du style:
Nom de la combo : comboXX
Nom des champs textes : texte1XX et texte2XX
où XX correspond à un compteur de 01 à 43 (attention au 0 avant les nombres à un seul chiffre...)
tu peux utiliser la procédure suivante :

Note: le code suivant est très fortement inspiré du code trouvé à la page suivante sur le site de notre ami Raymond:
http://officesystem.access.free.fr/ex_fonction_unique.htm

Pour commencer, sélectionne toutes les comboboxes pour lesquelles tu souhaites avoir le même comportement. Sur la ligne remarques de l'onglet Autres, tapes le mot : Groupe1

Ensuite, colle dans le code du formulaire:

'***** Début du code

Private Sub Form_Load()
EventGroup Me, "Groupe1", "maj_combo"
End Sub


Public Function maj_combo(Nom_Combo As String) As Boolean
Me.Controls("Texte1" & Right(Nom_Combo,2)=IIf(Me.Controls(Nom_combo)<>0,Me.Controls(Nom_combo).Column(1),vbNullString)
Me.Controls("Texte2" & Right(Nom_combo,2)=IIf(Me.Controls(Nom_combo)<>0,Me.Controls(Nom_combo).Column(2),vbNullString)
End Function

Public Function EventGroup(FormObject As Form, GroupName As String, FunctionName As String) As Boolean
On Error GoTo Err_EventGroup
Dim Ctl As Control
For Each Ctl In FormObject.Controls
If Ctl.Tag = GroupName Then
Ctl.OnAfterUpdate = "=" & FunctionName & "(""" & Ctl.Name & """)"
End If
Next Ctl
EventGroup = True
Err_EventGroup:
End Function

'***** Fin du code

A tester... Dis-nous !

Hello

Sur un form, j'ai une quarantaine de ComboBox (43 exactement). Pour
chacune d'elles, j'ai 2 textBox qui leur sont dédiées (donc 86
textbox).

J'ai le code suivant après mise à jour de chacune des combobox :

Private Sub ComboBox1_AfterUpdate()
If Me. ComboBox1 <> 0 Then
Me.TextBox1 = Me.ComboBox1.Column(1)
Me.TextBox2 = Me. ComboBox1.Column(2)
Else
Me.TextBox1 = VbNullString
Me.TextBox2 = VbNullString
End If
End Sub

Vu le nombre de combobox, n'y aurait-il pas une solution plus économe
en lignes. J'ai pensé à faire une boucle et un compteur mais je suis
un peu perdu sur la façon d'utiliser le compteur dans la boucle.

Merci de votre aide


--
Cordialement,
Ze Titi

Tout pour réussir avec Access :
http://www.mpfa.info

Avatar
malabar
On 12 fév, 09:48, ze Titi wrote:
Bonjour malabar

Tel que sont nommés tes champs, ça me paraît un peu compliqué...
En utilisant une convention de nommage du style:
Nom de la combo : comboXX
Nom des champs textes : texte1XX et texte2XX
où XX correspond à un compteur de 01 à 43 (attention au 0 avant les nombres à un seul chiffre...)
tu peux utiliser la procédure suivante :

Note: le code suivant est très fortement inspiré du code trouvé à la page suivante sur le site de notre ami Raymond:http://officesystem.acce ss.free.fr/ex_fonction_unique.htm

Pour commencer, sélectionne toutes les comboboxes pour lesquelles tu so uhaites avoir le même comportement. Sur la ligne remarques de l'onglet Au tres, tapes le mot : Groupe1

Ensuite, colle dans le code du formulaire:

'***** Début du code

Private Sub Form_Load()
EventGroup Me, "Groupe1", "maj_combo"
End Sub

Public Function maj_combo(Nom_Combo As String) As Boolean
Me.Controls("Texte1" & Right(Nom_Combo,2)=IIf(Me.Controls(Nom_combo )<>0,Me.Controls(Nom_combo).Col­umn(1),vbNullString)
Me.Controls("Texte2" & Right(Nom_combo,2)=IIf(Me.Controls(Nom_combo )<>0,Me.Controls(Nom_combo).Col­umn(2),vbNullString)
End Function

Public Function EventGroup(FormObject As Form, GroupName As String, Funct ionName As String) As Boolean
On Error GoTo Err_EventGroup
Dim Ctl As Control
For Each Ctl In FormObject.Controls
If Ctl.Tag = GroupName Then
Ctl.OnAfterUpdate = "=" & FunctionName & "(""" & Ctl.Name & """)"
End If
Next Ctl
EventGroup = True
Err_EventGroup:
End Function

'***** Fin du code

A tester... Dis-nous !






Hello

Sur un form, j'ai une quarantaine de ComboBox (43 exactement). Pour
chacune d'elles, j'ai 2 textBox qui leur sont dédiées (donc 86
textbox).

J'ai le code suivant après mise à jour de chacune des combobox :

Private Sub ComboBox1_AfterUpdate()
If Me. ComboBox1 <> 0 Then
Me.TextBox1 = Me.ComboBox1.Column(1)
Me.TextBox2 = Me. ComboBox1.Column(2)
Else
Me.TextBox1 = VbNullString
Me.TextBox2 = VbNullString
End If
End Sub

Vu le nombre de combobox, n'y aurait-il pas une solution plus économe
en lignes. J'ai pensé à faire une boucle et un compteur mais je suis
un peu perdu sur la façon d'utiliser le compteur dans la boucle.

Merci de votre aide


--
Cordialement,
Ze Titi

Tout pour réussir avec Access :http://www.mpfa.info- Masquer le texte d es messages précédents -

- Afficher le texte des messages précédents -


Hello

Merci pour ta réponse rapide. J'ai passé une bonne partie du we à
chercher notamment sur le site en lien, sans y parvenir.
Je teste et reviens donner le résultat.


Avatar
Pierre CFI [mvp]
alors mon ami malabar, en forme ? tu vois que je t'ai à l'oeil
--
Pierre
MVP Access
***************************************
Conseils MPFA: http://www.mpfa.info/
*********************************************************
Avatar
malabar
On 12 fév, 16:23, "Pierre CFI [mvp]" wrote:
alors mon amimalabar, en forme ? tu vois que je t'ai à l'oeil
--
Pierre
MVP Access
***************************************
Conseils MPFA:http://www.mpfa.info/
*********************************************************


Hello

désolé pour ma réponse tardive. J'ai testé ton code et il
fonctionne. ;)

Je me suis permis de poser la même question sur un autre forum et j'ai
obtenu cette réponse :


Private Function ComboMachin(ByVal idCombo As Integer)
dim IdText As Integer
idText = idCombo*2 - 1
If Me.Controls("Combobox" & idCombo) <> 0 Then
Me.Controls("TextBox" & idText) = Me.Controls("ComboBox" &
idCombo).Column(1)
Me.Controls("TextBox" & idText + 1) = Me.Controls("ComboBox" &
idCombo).Column(2)
Else
Me.Controls("TextBox" & idText) = VbNullString
Me.Controls("TextBox" & idText + 1) = VbNullString
End If
End Sub


Ensuite dans l'événement Load du formulaire :

Dim ctl as Control
For Each ctl in Me.Controls
If ctl.ControlType = acComboBox Then
ctl.AfterUpdate = "=ComboMachin(" & CInt(Mid(ctl.name,
Len("Combobox") + 1)) & ")"
End If
Next ctl

Il me permet de me garder le tag sous le coude pour une évolution à
venir.

Mais j'obtiens ce message :
"Impossible de trouver le champ 'Combobox 1' auquel il est fait
référence dans votre expression."

PS : Il y a un espace entre Combobox et le nombre correspondant dans
le message d'erreur alors que je n'en est pas mis dans le nommage des
combobox.

Merci de votre aide.