IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Affecter la même macro vba à plusieurs contrôles lors d'un clic sur un formulaire


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 28
    Par défaut Affecter la même macro vba à plusieurs contrôles lors d'un clic sur un formulaire
    Bonjour à tous

    Cela fait un moment que je cherche une solution à mon problème sans y arriver donc j'aimerais savoir si quelqu'un ici pouvais m'aider.

    Je m'explique, je dispose d'un formulaire sur lequel j'ai une cinquantaine de contrôles de type "Rectangle", j'aimerais que lorsque je clic sur chacun de ces derniers la même macro se lance.

    Pour le moment j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Private Sub Ctl53_Click()
        [Forms]![Form-TAD]![arret].Value = 53
        [Forms]![Form-TAD]![CommuneDep] = "OETING"
        [Forms]![Form-TAD]![ArretDep] = "DESCARTES"
        DoCmd.OpenQuery "TrajetsExistant", , acReadOnly
        DoCmd.Requery
        DoCmd.Close acQuery, "TrajetsExistant"
        DoCmd.OpenForm "TrajetsDispo", , , , , acDialog
    End Sub
     
    Private Sub Ctl54_Click()
        [Forms]![Form-TAD]![arret].Value = 54
        [Forms]![Form-TAD]![CommuneDep] = "OETING"
        [Forms]![Form-TAD]![ArretDep] = "AVOGADRO"
        DoCmd.OpenQuery "TrajetsExistant", , acReadOnly
        DoCmd.Requery
        DoCmd.Close acQuery, "TrajetsExistant"
        DoCmd.OpenForm "TrajetsDispo", , , , , acDialog
    End Sub
    [arret] [CommuneDep] et [ArretDep] alimentent une requête dans mon application, [arret] représentent l'identifiant d'un arrêt se trouvant dans une table. J'ai nommé mes contrôles dans mon formulaire de la même manière que [arret] et j'aimerais donc qu'en cliquant sur chacun des rectangle mes textBox [arret] [CommuneDep] et [ArretDep] prennent les valeurs se trouvant dans ma table.

    Est ce que quelqu'un aurait une idée de comment je dois m'y prendre ?

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Je ne connais pas grand chose à ce genre de développement.

    Dans le principe qui est le mien.
    Dès qu'une même procédure est affectée à plusieurs contrôles de formulaire, alors adopter un module de classe.

    Il te suffira d'affecter chaque bouton de commande à ta classe d'objets.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 28
    Par défaut
    Citation Envoyé par MarcelG Voir le message
    Bonjour,

    Je ne connais pas grand chose à ce genre de développement.

    Dans le principe qui est le mien.
    Dès qu'une même procédure est affectée à plusieurs contrôles de formulaire, alors adopter un module de classe.

    Il te suffira d'affecter chaque bouton de commande à ta classe d'objets.

    J'ai essayé de créer une classe rectangle mais je ne sais pas trop comment m'y prendre.. pourriez vous me montrer un exemple ?

  4. #4
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut bial,

    Je reviens dans une heure environ

    En attendant, tu peux consulter ce lien sur les modules de classe issu de la FAQ où 3 tutoriels te sont proposés, dont celui de Pierre.

    A tout à l'heure.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 28
    Par défaut
    Citation Envoyé par MarcelG Voir le message
    Salut bial,

    Je reviens dans une heure environ

    En attendant, tu peux consulter ce lien sur les modules de classe issu de la FAQ où 3 tutoriels te sont proposés, dont celui de Pierre.

    A tout à l'heure.

    D'accord merci je vais y jeter un œil en attendant votre retour.

  6. #6
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Coucou, me revoilou.

    J'ai développé un exemple.

    Mise à l'écran d'un formulaire dont les 2 boutons de commande répondent à une même procédure.
    Cette procédure fait apparaître un message (Dans ton applicatif, ce sera la procédure commune à tous tes "rectangles")

    3 phases principales

    1 - Dans un module standard, coder la procédure commune à tous les boutons

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Explicit
     
    Public Sub lemessage()
     
    MsgBox Prompt:="Bonjour au Forum", Buttons:=vbInformation, Title:="Salutations"
     
    End Sub
    2 - Dans un module de classe (Menu Insertion module de classe), coder l'évènement lié à la classe d'objets.
    Cette classe sera composée des objets boutons.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public WithEvents leclic As MSForms.CommandButton
     
    Private Sub leclic_CLICk()
     
    Call lemessage
     
    End Sub
    3 - A l'initialisation du formulaire, la classe sera déclarée au nom du module de classe
    Elle sera alimentée des objets boutons dont la nomenclature est homogène et suffixée (Btn_mess_1 et Btn_mess_2)
    Ce type de nomenclature est une règle pour ce qui me concerne.
    Dans le code associé au formulaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Option Explicit
     
    Dim mamsgb() As New Class_message
     
    Private Sub UserForm_Initialize()
     
    Dim i As Byte
     
    For i = 1 To 2
     
            ReDim Preserve mamsgb(1 To i)
            Set mamsgb(i).leclic = Me.Controls("Btn_mess_" & i)
     
    Next i
     
     
    End Sub
     
    Private Sub Btn_Quitter_Click()
     
    Unload Me
     
    End Sub
    2 remarques quant à l'homogénéité des codes:
    - "Class_message" est le nom du module de classe
    - "leclic" est le nom de la variable objet déclaré dans le module de classe. Celui-ci est, bien-entendu, repris lors de la déclaration au sein du module lié au formulaire.

    En pièce jointe à ce post, l'applicatif.
    Pour afficher le formulaire, Ctrl + m

    A plus
    Fichiers attachés Fichiers attachés

  7. #7
    Invité
    Invité(e)
    Par défaut
    bonjour,
    Code au plus simple : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub Ctl53_Click()
        MacorComune 53
    End Sub
    Private Sub Ctl54_Click()
        MacorComune 54
    End Sub
    sub MacorComune(V as integer)
        [Forms]![Form-TAD]![arret].Value = v
        [Forms]![Form-TAD]![CommuneDep] = "OETING"
        [Forms]![Form-TAD]![ArretDep] = "AVOGADRO"
        DoCmd.OpenQuery "TrajetsExistant", , acReadOnly
        DoCmd.Requery
        DoCmd.Close acQuery, "TrajetsExistant"
        DoCmd.OpenForm "TrajetsDispo", , , , , acDialog
    end sub

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par dysorthographie Voir le message
    bonjour,
    Code au plus simple : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub Ctl53_Click()
        MacorComune 53
    End Sub
    Private Sub Ctl54_Click()
        MacorComune 54
    End Sub
    sub MacorComune(V as integer)
        [Forms]![Form-TAD]![arret].Value = v
        [Forms]![Form-TAD]![CommuneDep] = "OETING"
        [Forms]![Form-TAD]![ArretDep] = "AVOGADRO"
        DoCmd.OpenQuery "TrajetsExistant", , acReadOnly
        DoCmd.Requery
        DoCmd.Close acQuery, "TrajetsExistant"
        DoCmd.OpenForm "TrajetsDispo", , , , , acDialog
    end sub
    bonjour robert
    et non selon le numéro ArretDep est différent
    c'est de ca que je parle quand je dit table de correspondance
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    il te faut classer tes boutons ET!!! créer une table ou array de correspondance

    pour ca il nous faut le code de tes 50 boutons
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    re
    il te faut classer tes boutons ET!!! créer une table ou array de correspondance

    pour ca il nous faut le code de tes 50 boutons
    bonjour Patrick, en fait il t'as donné le code mais c'est de l'ACCESS

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    @robert
    regarde bien ces deux boutons
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Private Sub Ctl53_Click()
        [Forms]![Form-TAD]![arret].Value = 53
        [Forms]![Form-TAD]![CommuneDep] = "OETING"
        [Forms]![Form-TAD]![ArretDep] = "DESCARTES"
        DoCmd.OpenQuery "TrajetsExistant", , acReadOnly
        DoCmd.Requery
        DoCmd.Close acQuery, "TrajetsExistant"
        DoCmd.OpenForm "TrajetsDispo", , , , , acDialog
    End Sub
     
    Private Sub Ctl54_Click()
        [Forms]![Form-TAD]![arret].Value = 54
        [Forms]![Form-TAD]![CommuneDep] = "OETING"
        [Forms]![Form-TAD]![ArretDep] = "AVOGADRO"
        DoCmd.OpenQuery "TrajetsExistant", , acReadOnly
        DoCmd.Requery
        DoCmd.Close acQuery, "TrajetsExistant"
        DoCmd.OpenForm "TrajetsDispo", , , , , acDialog
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 28
    Par défaut
    Re bonjour

    Je dispose d'une table de la sorte :
    Nom : tableArret.png
Affichages : 855
Taille : 40,9 Ko

    Et chaque rectangle fait référence à ces arrêts. J'aimerais qu'en cliquant sur un rectangle (qui à comme propriété Name l'identifiant de l'arrêt c'est à dire le champ "CLe") mes textBox [arret] [CommuneDep] et [ArretDep] prennent donc les valeurs correspondante à la ligne de ma table.

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 28
    Par défaut
    J'avais essayer ce code la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
        Dim Ctrl As Access.Control
        Dim Form As Form
        Dim db As DAO.Database
        Dim rst As DAO.Recordset
        Dim req As String, commune As String, arret As String
     
        Form = [Forms]![Form-TAD]
        Set db = CurrentDb
        'Les rectangles qui disposent de l'événement OnClick ont pour unique parent le formulaire.
        If Ctrl.ControlType = acRectangle Then
            For Each Ctrl In Form.Controls
            'Ici, la fonction sera appelée avec le nom du contrôle.
                Ctrl.OnClick = "=CleRectangle (" & Chr(34) & Ctrl.Name & Chr(34) & ")"
                [Forms]![Form-TAD]![arret].Value = CleRectangle(Ctrl.Name)
                req = "SELECT Commune FROM TabForbusTADArrêt WHERE Cle =" & Ctrl.Name
                Set rst = db.OpenRecordset(req)
                Do Until rst.EOF
                    commune = rst![commune]
                    rst.MoveNext
                Loop
                [Forms]![Form-TAD]![CommuneDep].Value = commune
                Ctrl.OnClick = "=CleRectangle (" & Chr(34) & Ctrl.Name & Chr(34) & ")"
                req = "SELECT Arrêt FROM TabForbusTADArrêt WHERE Cle =" & Ctrl.Name
                Set rst = db.OpenRecordset(req)
                Do Until rst.EOF
                    arret = rst![Arrêt]
                    rst.MoveNext
                Loop
                [Forms]![Form-TAD]![CommuneDep].Value = arret
                DoCmd.OpenQuery "TrajetsExistant", , acReadOnly
                DoCmd.Requery
                DoCmd.Close acQuery, "TrajetsExistant"
                DoCmd.OpenForm "TrajetsDispo", , , , , acDialog
            Next Ctrl
         End If
    Mais ce que je voudrais c'est qu'en cliquant sur chacun des rectangle ce code ce réalise sauf que j'ai aucune idée de comment le faire, si quelqu'un aurait une idée ?

    Si vous avez besoin de plus d'explications dites le moi, c'est la première fois que j'écris sur ce forum donc je ne sais pas si je suis assez clair pour vous.

    Merci de votre aide

  14. #14
    Invité
    Invité(e)
    Par défaut
    oui je suis d’accord mais il mutualiser la partie commande access.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Private Sub Ctl53_Click() 
        [Forms]![Form-TAD]![arret].Value = 53
        [Forms]![Form-TAD]![CommuneDep] = "OETING"
        [Forms]![Form-TAD]![ArretDep] = "DESCARTES"
    End Sub
     
    Private Sub Ctl54_Click()
        [Forms]![Form-TAD]![arret].Value = 54
        [Forms]![Form-TAD]![CommuneDep] = "OETING"
        [Forms]![Form-TAD]![ArretDep] = "AVOGADRO"
    End Sub
    sub MacorComune()
     DoCmd.OpenQuery "TrajetsExistant", , acReadOnly
        DoCmd.Requery
        DoCmd.Close acQuery, "TrajetsExistant"
        DoCmd.OpenForm "TrajetsDispo", , , , , acDialog
    
    End Sub
    
    
    

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/07/2017, 10h49
  2. Réponses: 0
    Dernier message: 06/03/2016, 05h29
  3. [XL-2007] Macro VBA pour imprimer plusieurs onglets sur une feuille recto verso
    Par oekoniko dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/03/2014, 15h24
  4. Réponses: 1
    Dernier message: 14/06/2013, 15h06
  5. Réponses: 9
    Dernier message: 24/05/2010, 02h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo