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

VBA Access Discussion :

[AC-2010] Création de bouton en VBA, ajouter une procédure événementielle


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Points : 11
    Points
    11
    Par défaut [AC-2010] Création de bouton en VBA, ajouter une procédure événementielle
    Bonjour à tout le monde,

    Je développe une application pour mon entreprise et je voudrais généré un nombre de boutons sur un formulaire.


    Par exemple : Dans la table "Lieu", il y a par exemple 3 lieux donc généré trois boutons l'un en dessous de l'autre avec le titre du bouton le nom du lieu.

    Voici le code que j'ai réalisé pour créer un bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        Dim ctl As Control
     
        Set ctl = Application.CreateControl("frmLocal", acCommandButton, , "", "", 2000, 500, 2500, 300)
     
        With ctl
            .Name = "cmdTest"
            .Caption = "Bouton Test"
        End With
    J'espère que vous me suivez jusque là. Maintenant je voudrais mettre une procédure événementielle sur les boutons lorsqu'on clique dessus cela ouvre un formulaire à l'aide du nom du bouton cela va filtrer mon futur formulaire. J'espère que j'étais claire.

    Donc ma question est comment ajouté une procédure événementielle à un bouton en VBA ?

    Merci d'avance.

    Cordialement,

    Akiro76

  2. #2
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 465
    Points : 549
    Points
    549
    Par défaut
    Bonjour,

    Tu as déjà fait la partie la plus difficile.
    Il te reste à parcourir ta table avec les lieux et ajouter un bouton pour chaque lieu
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Function Trois_Boutons()
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim ctl As Control
    Dim strNomLieu As String
    Dim iLieu As Integer
    Dim iBas As Integer
    Dim iTailleForm As Integer
    Dim iPos As Integer
     
     
    Set db = Application.CurrentDb
    Set rst = db.OpenRecordset("MaTable", dbOpenTable)
     
    'connaitre le nombre de lieux, c'est à dire le nombre de boutons à ajouter
    iLieu = rst.RecordCount
    'si j'ai 3 lieus, 3 boutons, je dois avoir 4 espaces entre les boutons (au dessus et en dessous)
    iLieu = iLieu + 1
    iTailleForm = 2000      'j'imagine que la taille de ton formulaire est de 2000
    'calculer un increment vers le bas.  Chaque bouton sera un peu plus bas que le precedent
    'Si tu as dix boutons ils seront assez serrés l'un contre l'autre, si tu en a 3, il y aura plus d'espace entre les boutons
    iBas = Int(iTailleForm / iLieu)
    'iPos est la position par rapport au Top du formulaire
    'ipos initial =
    iPos = iBas
     
    's'assurer qu'on commence au début.
    rst.MoveFirst
    Do Until rst.EOF
        'parcourir la table du début à la fin
        strNomLieu = rst!Lieu   'J'imagine que ta table contient un champ nommé "Lieu"
     
        'insérer ici ton code :
        Set ctl = Application.CreateControl("frmLocal", acCommandButton, , , , 2000, iPos, 2500, 300)
        With ctl
            .Name = "cmd" & strNomLieu
            .Caption = "Bouton " & strNomLieu
        End With
        Set ctl = Nothing
        'incrementer la position pour afficer le prochain bouton un peu plus bas
        iPos = iPos + iBas
        rst.MoveNext
    Loop
    Set rst = Nothing
    Set db = Nothing
     
     
    'il te reste à fermer et sauver ton formulaire
     
    End Function

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Côte d'Ivoire

    Informations forums :
    Inscription : Novembre 2006
    Messages : 93
    Points : 99
    Points
    99
    Par défaut
    Bonjour,
    je pense que ce n'est pas une bonne idée de générer un bouton pour chaque enregistrement de la table lieu
    mieux vaut envisager une liste déroulante et sur l'événement after_update (après mise à jour) faire le traitement envisagé.

    Sinon si tu veux suivre ton idée, crée une fonction et dans ton code ajoute dans le bloc WITH

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       .OnClick= "=NomDeTaFonction()"

  4. #4
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 465
    Points : 549
    Points
    549
    Par défaut
    Bonjour Akiro76,
    Le conseil de Sambola est tout à fait pertinent et merite d'y réfléchir.
    C'est à toi de voir comment tu veux gérer l'aspect visuel et donc l'ergonomie de ton formulaire. Avoir trois boutons, c'est plus facile que de selectionner une ligne dans une liste déroulante.
    Une table peut avoir des milliers d'enrégistrements. Avoir 3 boutons c'est bien, en avoir trois mille, c'est pas bien. Es-tu sûr de ne jamais avoir beaucoup d'enrégistrements dans ta table ? Même si l'utilisateur fait une connerie ? En cas de grand nombre d'enrégistrements, la liste de Sambola ne se plantera pas alors que les boutons, eux, te donneront des cheveux blancs.

    Bonne Journée,
    PipoWIL

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Merci pour votre réponse ça m'a bcp aidé .

    Mon application sera utilisé par plusieurs personnes utilisateur, administrateur, et gestionnaire.

    Le client veut des boutons au lieu d'une liste déroulante, il trouve ça plus simple à utilisé pour l'utilisateur. J'aurais deux tables type de local (exemple "Locaux maintenances" pas plus 10 enregistrements) et 5 à 6 lieux a afficher sur mon formulaire. Donc je n’est très peu d'enregistrement et comme lorsque je serais parti il faut que l'application génère automatiquement tout les lieux et les types de locaux suivant le nombre d'enregistrement. Car personne ne sauras refaire un bouton sous access.


    Cordialement,

    Akiro

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    J'ai actuellement un souci lorsque je veux créer mes boutons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set ctl = Application.CreateControl("frmLocaux", acCommandButton, , , , 2000, iPos, 2500, 300)
    Il me mets "Vous devez être en mode création ou Page pour créer ou supprimer des contrôles"

    Cordialement,

    Akiro

  7. #7
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 465
    Points : 549
    Points
    549
    Par défaut
    Oui, en effet. Il faut rajouter quelque chose comme 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
     
    'ouvrir en mode design
    DoCmd.OpenForm "frmlocal", acDesign
     
    'faire les changements que tu dois faire
    Set ctl = Application.CreateControl("frmLocal", acCommandButton, , "", "", 2000, 500, 2500, 300)
     
    With ctl
        .Name = "cmdTest"
        .Caption = "Bouton Test"
    End With
     
    'fermer le mode design
    DoCmd.Close acForm, "FrmLocal", acSaveYes

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Tout marche super bien.

    Merci beaucoup de votre aide c'est super sympas.

    Cordialement,

    Akiro

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Rebonjour,

    merci de toute l'aide apporté maintenant j'ai un autre souci, je veux passé un paramètre dans une function mis dans chaque bouton créer qui s'appelle filtre(), et cela me mets une erreur

    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
    rst.MoveFirst
        Do Until rst.EOF
            'parcourir la table du début à la fin
            strNomEntite = rst!NomEntite   'J'imagine que ta table contient un champ nommé "Entite"
            frmName = "frmLocaux"
            DoCmd.OpenForm frmName, acDesign
            'insérer ici ton code :
            Set ctl = Application.CreateControl(frmName, acCommandButton, , , , 300, iPos, 2500, 600)
            With ctl
                .Name = "cmd" & strNomEntite
                .Caption = strNomEntite
                .UseTheme = True
                .Shadow = 2
                .BackColor = lng
                MsgBox strNomEntite
                .OnClick = "=Filtre(strNomEntite)"
            End With
            Set ctl = Nothing

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function filtre(var As String)
     
              MsgBox var
    End Function

    En voulant faire ça je voulais testé si chaque bouton me retourne son nom pour tester. Et ça me fait un erreur "L'expression sur clic entrée comme paramètre de la propriété de type événement est à l'origine d'une erreur etc..."


    Avez vous une solution ?


    Cordialement,

    Akiro

  10. #10
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Le hic c'est que ce genre de manipulation ne serait pas possible avec le runtime ou un fichier accde

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VB 2010 Création de bouton dynamique et qui se deplace
    Par younesssoleil dans le forum VB.NET
    Réponses: 22
    Dernier message: 27/11/2016, 15h26
  2. création d'un module vba pour une mise à jour access
    Par ponpon99 dans le forum VBA Access
    Réponses: 4
    Dernier message: 27/12/2013, 13h37
  3. [AC-2010] Bouton permettent d'ajouter une liste de choix
    Par Maegane dans le forum IHM
    Réponses: 2
    Dernier message: 17/07/2013, 08h38
  4. [XL-2003] Problème avec la création de bouton en VBA
    Par Baha43 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/04/2011, 14h07
  5. VBA : ajouter une valeur dans une liste déroulante
    Par remi59 dans le forum Access
    Réponses: 4
    Dernier message: 22/12/2005, 10h01

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