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 :

assignation dynamique de fonctionnalité à un bouton


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 125
    Par défaut assignation dynamique de fonctionnalité à un bouton
    bonjour,

    je cherche à assigner dynamiquement une fonctionnalité à des boutons créer à la volée.
    contexte :
    je créer des boutons de type MSForms.CommandButton dynamiquement et il s'empile sur une feuille les un sous les autres
    Lors de cette création de bouton, une nouvelle feuille de calcul est crée également pour lui être assigné
    Je voudrai maintenant que lorsque que je clique sur le bouton créer, il m'envoie sur la feuille créée en même temps.
    Donc autant de feuilles de calcul que de boutons.

    Tout ceci devant se faire via du code VBA et non pas en assignant une macro à un bouton "à la main".

    Quelqu'un a t-il déjà réalisé ce genre de fonctionnalité.
    Merci

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Bonjour, si j'ai bien compris tes besoins, voici une macro avec un paramètre qui te permet de spécifier le nombre de boutons à créer et autant de feuilles associées. Les boutons sont créés sur la première feuille et le clic sur un bouton te mène à la feuille qui a été créée en même temps. J'ai commenté le code pour te permettre de suivre le déroulement et adapter si nécessaire. Supposons que tu veuilles 3 boutons, tu appelles alors la macro comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
        Call CreerBoutonsEtFeuilles(3)
    End Sub
    Voici la macro principale:

    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
    Sub CreerBoutonsEtFeuilles(nbBoutons As Integer)
        Dim wsBoutons As Worksheet
        Dim nouvelleFeuille As Worksheet
        Dim cb As Object
        Dim boutonNom As String
        Dim feuilleNom As String
        Dim topPosition As Double
        Dim i As Integer
        Dim boutonCode As String
     
        ' Assurez-vous qu'il existe une feuille pour les boutons (1ère feuille)
        Set wsBoutons = ThisWorkbook.Sheets(1)
        wsBoutons.Activate
        wsBoutons.Cells.Clear ' Nettoyer la feuille pour éviter les doublons
     
        ' Réinitialiser la position des boutons
        topPosition = 10
     
        ' Créer autant de boutons et feuilles que demandé
        For i = 1 To nbBoutons
            ' Créer une nouvelle feuille et nommer dynamiquement
            Set nouvelleFeuille = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
            feuilleNom = "Feuille_" & i
            nouvelleFeuille.Name = feuilleNom
     
            ' Créer un bouton sur la première feuille
            Set cb = wsBoutons.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
            Left:=10, Top:=topPosition, Width:=150, Height:=30)
            boutonNom = "Bouton_" & i
            cb.Name = boutonNom
            cb.Object.Caption = "Aller à " & feuilleNom
     
            ' Ajouter du code pour chaque bouton
            boutonCode = _
            "Private Sub " & boutonNom & "_Click()" & vbCrLf & _
            "    Sheets(""" & feuilleNom & """).Activate" & vbCrLf & _
            "End Sub"
     
            ' Injecter le code VBA dans le module de la feuille
            With ThisWorkbook.VBProject.VBComponents(wsBoutons.CodeName).CodeModule
                .InsertLines .CountOfLines + 1, boutonCode
            End With
     
            ' Ajuster la position pour empiler les boutons verticalement
            topPosition = topPosition + 40
        Next i
     
        MsgBox nbBoutons & " boutons et feuilles créés avec succès*!", vbInformation
    End Sub

  3. #3
    Membre confirmé Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 125
    Par défaut
    Merci Franc pour ta réponse,

    J'avais déjà essayé ce genre de code, mais malheureusement, lorsque je teste j'ai une erreur "1004 : L'accès par programme au projet Visual Basic n'est pas fiable"

    Donc, j'avais un peu abandonné cette piste.
    Je pensais qu'il fallait plutôt se diriger vers un module de classe, mais pour une fonctionnalité si petite, cela me semblait un peu exagéré.

    J'en suis toujours au même stade du coup

  4. #4
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Citation Envoyé par bringer Voir le message
    Merci Franc pour ta réponse,

    J'avais déjà essayé ce genre de code, mais malheureusement, lorsque je teste j'ai une erreur "1004 : L'accès par programme au projet Visual Basic n'est pas fiable"

    Donc, j'avais un peu abandonné cette piste.
    Je pensais qu'il fallait plutôt se diriger vers un module de classe, mais pour une fonctionnalité si petite, cela me semblait un peu exagéré.

    J'en suis toujours au même stade du coup
    Assurez-vous que l'accès au projet VBA est activé :

    Allez dans Fichier > Options > Centre de gestion de la confidentialité.
    Dans Paramètres des macros, cochez Faire confiance à l'accès au modèle d'objet du projet VBA.

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Lorsque j'ai plusieurs boutons, j'utilise l'instruction Application.Caller très simple à mettre en place et facile à maintenir.
    Dans cette instruction la variable String A, reçoit le nom du bouton A = Application.Caller
    A l'aide d'une table de correspondance remplie pendant la création des boutons, on place dans une colonne le nom du bouton et dans une deuxième le nom de la feuille à atteindre.
    Le code pour activer la feuille par rapport au bouton sélectionné prend moins de cinq lignes
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 204
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Vous ne pouvez pas faire une macro qui écrit du VBA sans déclarer que vous faites confiance au code
    ça demande d'aller dans la sécurité et de dire que vous faites confiance au code (accès approuvé au modèle d'objet du projet VBA)

    Comme ce sont des objets ActiveX, on est obligé de créer un code pour chaque bouton et donc d'écrire le code
    S'il s'agissait de boutons de formulaire ou de formes, on pourrait envisager de ne pas écrire de code

  7. #7
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 204
    Billets dans le blog
    2
    Par défaut
    Bonjour Philippe,

    ça demanderait de créer des boutons de formulaire, des formes ou des images

    Les contrôles ActiveX (MSForms.CommandButton) nécessitent un code évènementiel pour gérer leurs actions, donc je vois mal comment ne pas écrire de code avec eux

    Edit : On pourrait même se passer de macro et faire un lien hypertexte vers la feuille

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour tototiti2008,
    J'avais d'abord pensé effectivement à un lien hypertexte (fonction LIEN_HYPERTEXTE mais comme on parlait de boutons, j'ai pensé à Application.Caller
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  9. #9
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 204
    Billets dans le blog
    2
    Par défaut
    Re,

    une version adaptée de la solution de Franc qui crée des Shapes avec des liens hypertexte, donc qui n'écrit pas de code VBA, mais donc pas de contrôles ActiveX

    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
    Sub CreerBoutonsEtFeuilles2(nbBoutons As Integer)
        Dim wsBoutons As Worksheet
        Dim nouvelleFeuille As Worksheet
        Dim cb As Shape
        Dim boutonNom As String
        Dim feuilleNom As String
        Dim topPosition As Double
        Dim i As Integer
     
     
        ' Assurez-vous qu'il existe une feuille pour les boutons (1ère feuille)
        Set wsBoutons = ThisWorkbook.Sheets(1)
        wsBoutons.Activate
        wsBoutons.Cells.Clear ' Nettoyer la feuille pour éviter les doublons
     
        ' Réinitialiser la position des boutons
        topPosition = 10
     
        ' Créer autant de boutons et feuilles que demandé
        For i = 1 To nbBoutons
            ' Créer une nouvelle feuille et nommer dynamiquement
            Set nouvelleFeuille = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
            feuilleNom = "Feuille_" & i
            nouvelleFeuille.Name = feuilleNom
     
            ' Créer un bouton sur la première feuille
            Set cb = wsBoutons.Shapes.AddShape(Type:=msoShapeRectangle, Left:=10, _
                Top:=topPosition, Width:=150, Height:=30)
            boutonNom = "Bouton_" & i
            cb.Name = boutonNom
            cb.TextFrame2.TextRange.Text = "Aller à " & feuilleNom
     
            ' Ajouter un lien à chaque bouton
            wsBoutons.Hyperlinks.Add Anchor:=cb, Address:="", SubAddress:=feuilleNom & "!A1"
     
            ' Ajuster la position pour empiler les boutons verticalement
            topPosition = topPosition + 40
        Next i
     
        MsgBox nbBoutons & " boutons et feuilles créés avec succès*!", vbInformation
    End Sub

  10. #10
    Membre confirmé Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 125
    Par défaut
    Merci à tous pour ces réponses,

    Je n'ai pas besoin de controles activeX pour cette fonctionnalité, un simple bouton Form me suffirait.
    Il s'agit en fait de créer une sorte de sommaire avec des liens hypertexte vers les bonnes feuille formulaire comme le disent Philippe Tulliez et tototiti2008.
    J'avais pensé à des boutons ne connaissant pas la fonctionnalité hypertexte. Cela dit cela pourrait être une solution appropriée.

    Pour être peut-être plus précis, voici la procédure exacte de création :
    1 - un bouton statique sur la feuille 1 existe et a son code fonctionnel. Ce bouton appelle un userform dans lequel l'utilisateur saisie quelques données.
    2 - à la validation des données saisies dans le user form :
    2.1 - un nouveau bouton est créé en dessous avec en caption, les infos saisies dans le userform pour être explicite
    2.1 - une nouvelle feuille est créée (par copie d'une base existante) avec un nom correspondant à la référence du bouton que nous venons de créer
    3 - Il s'agit maintenant de lier le bouton créer à la volée avec la feuille de formulaire elle aussi crée à la volée par copie pour que l'utilisateur, dans cette sorte de sommaire n'est qu'a cliquer sur ce bouton pour aller directement à la bonne
    feuille de formulaire
    4 - Si je réappelle la user form (bouton créer un nouveau formulaire), la procédure point 2 se répète, un nouveau bouton d'appel sera ajouter en dessous, un nouveau formulaire avec son nom adapté sera créé par copie, etc ...

  11. #11
    Invité
    Invité(e)
    Par défaut
    Jeter un coup d’œil dans l'exemple suivant, la procédure BouttonClick est associée à tous les boutons via l'evenement OnAction ce dernier exploite le nom du contrôle pour activer la feuille concernée.

    Il reste l'association de CreerPage au bouton principal dans la première page ici dans l'exemple c'est Feuil1 à modifier selon le besoin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Sub CreerPage()
        Dim Tp As Long, Button, NewPage
        Tp = Sheets("Feuil1").Buttons.Count * 30 + 5
        Set Button = Sheets("Feuil1").Buttons.Add(20, Tp, 120, 30)
        Set NewPage = Sheets.Add(After:=Sheets(Sheets.Count))
        Button.Name = NewPage.Name
        Button.Text = NewPage.Name
        Button.OnAction = "BouttonClick"
    End Sub
     
    Sub BouttonClick()
        Sheets(Application.Caller).Activate
    End Sub

Discussions similaires

  1. [XL-2003] affectation dynamique de macros a bouton
    Par neninio31 dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 29/06/2009, 14h48
  2. Réponses: 2
    Dernier message: 11/02/2008, 15h28
  3. Réponses: 15
    Dernier message: 12/04/2007, 20h26
  4. [JSTL] Assignation dynamique de noms de variables
    Par trochv dans le forum Taglibs
    Réponses: 4
    Dernier message: 12/06/2006, 14h33
  5. [VB.NET] repeater/datagrid dynamique clique d'un bouton
    Par lucie.houel dans le forum ASP.NET
    Réponses: 11
    Dernier message: 19/07/2005, 16h17

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