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 :

Macro : 1 bouton d'execution pour 2 actions alternées [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Business Analyst
    Inscrit en
    Octobre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Business Analyst
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2017
    Messages : 8
    Par défaut Macro : 1 bouton d'execution pour 2 actions alternées
    Bonjour,

    Mon besoin est le suivant :

    Je souhaiterais exécuter à partir du même bouton d'exécution 2 actions, sur le principe de je clique une 1ère fois = action 1, je clique une seconde fois sur le même bouton= action 2, je clique une 3ème fois = action 1 ... et ainsi de suite
    et où concrètement, mes actions seraient:

    action 1 : déploiement du contenu d'informations (unhide des lignes)
    action 2 : refermer le déploiement (hide des lignes)

    Est-ce ce faisable?
    Si non, je suis ouvert aux suggestions de solutions alternatives.


    En espérant avoir été suffisamment explicite, un grand merci d'avance!!!!

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Barney G. Stinson Voir le message
    Bonjour,

    Une solution consisterait à modifier le libellé du bouton (propriété Caption) à chaque clic et de tester le libellé pour lancer l'une ou l'autre des macros.

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Eric KERGRESSE Voir le message
    Une solution consisterait à modifier le libellé du bouton (propriété Caption) à chaque clic et de tester le libellé pour lancer l'une ou l'autre des macros.
    Planquer l'information dans le bouton lui-même, c'est un truc auquel je n'avais pas pensé mais c'est une bonne idée que j'utiliserai.

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Barney G. Stinson Voir le message
    Je souhaiterais exécuter à partir du même bouton d'exécution 2 actions, sur le principe de je clique une 1ère fois = action 1, je clique une seconde fois sur le même bouton= action 2, je clique une 3ème fois = action 1 ... et ainsi de suite
    et où concrètement, mes actions seraient:

    action 1 : déploiement du contenu d'informations (unhide des lignes)
    action 2 : refermer le déploiement (hide des lignes)
    Un bouton ne peut être lié qu'à une seule macro.
    Cependant, cette macro peut avoir des actions différentes en fonction de certaines paramètres.

    Dans ton cas, le plus simple serait en début de code de vérifier si tes lignes sont masquées.
    Si c'est le cas, tu les fait s'afficher.
    Sinon tu les masques.

  5. #5
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Bonjour,

    C'est tout à fait faisable.
    Quant à la solution à adopter, elle dépend de votre besoin exact :
    • Votre bouton est-il situé sur une feuille de calcul ou sur un userform ?
    • Quel est le comportement attendu lorsque vous fermez le fichier puis le ré-ouvrez : faut-il se "souvenir" de la dernière action effectuée ou faut-il toujours repartir de l'action 1 ? (idem dans le cas de la fermeture/ré-ouverture du formulaire le cas échéant)

    L'idée sera de stocker une information quelque part : soit dans une cellule d'une feuille, soit directement dans une des propriétés d'un objet graphique. Cette info pourra ensuite être utilisée lors de l'exécution de la macro événementielle liée à votre bouton.

    Cordialement

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Bonjour.

    Un truc du genre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if Feuil1.Rows(1).EntireRow.hidden then
            'Décache la ligne
            Feuil1.Rows(1).EntireRow.hidden=false
        else
            'Cache la ligne
            Feuil1.Rows(1).EntireRow.hidden=true
    end if
    ou plus compact :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feuil1.Rows(1).EntireRow.hidden=not(Feuil1.Rows(1).EntireRow.hidden) 'Inverse le cachage
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Lorsque la "bascule" concerne une feuille, j'utilise une propriété de la worksheet que je crée en tête du module de la feuille concernée. Ca ne lie pas les actions au libellé du bouton (cas d'une appli multilingue, par exemple).

    Attention que sauf protection de la feuille, l'utilisateur pourra masquer ou afficher les lignes sans passer par le bouton, rompant ainsi la séquence de la bascule et amenant le bouton à ne plus être synchro avec la réalité de ladite feuille. Dès lors, un test tel que proposé par Marot n'est pas inutile.

    En fonction de la configuration de ta feuille, tu pourrais aussi utiliser la mise en plan des données (pour autant qu'elles ne soient pas dans un tableau structuré, ce qui n'est normalement pas le cas sinon tu utiliserais les filtres automatiques).
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  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,
    Je souhaiterais exécuter à partir du même bouton d'exécution 2 actions, sur le principe de je clique une 1ère fois = action 1, je clique une seconde fois sur le même bouton= action 2, je clique une 3ème fois = action 1 ... et ainsi de suite
    C'est le rôle d'un ToggleButton (bouton bascule). Il suffit de tester sa propriété Value.
    En fonction de sa valeur, on lancera l'action 1 ou l'action 2 et lorsqu'il s'agit de modifier la valeur de la propriété d'un objet et si celui-ci est une valeur numérique ou booléenne, on utilise directement la valeur du ToggleButton

    Petit exemple, d'un ToggleButton (ActiveX) placé sur une feuille, qui masque des colonnes, change le texte (propriété Caption) et de couleurs (BackColor et FontColor) en fonction de sa valeur.
    Les deux procédures sont placées dans le module de la feuille à traiter et où se trouve le ToggleButton

    Procédure qui gère le bouton et cache ou affiche les colonnes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Hide_UnHide(tgl As ToggleButton, addColumns As String, Msg As Variant)
      ' Arguments
      '   tgl         Objet ToggleButton
      '   AddColumns  Lettre des colonnes à masquer
      '   Msg         Variable tableau à deux dimensions (0, 1) contenant les deux messages
      With tgl
       Columns(addColumns).EntireColumn.Hidden = .Value
      .Caption = Msg(Abs(.Value))
      .BackColor = vbGreen / ((Abs(Not .Value) * 255) + 1)
      .ForeColor = vbWhite * (Abs(Not .Value))
      .Font.Bold = True
      End With
    End Sub
    Code de la procédure qui invoque Hide_UnHide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub tgl_Hide_Unhide_Click()
      Hide_UnHide Me.tgl_Hide_Unhide, "D:F", Array("Masquer", "Afficher")
    End Sub
    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 habitué
    Homme Profil pro
    Business Analyst
    Inscrit en
    Octobre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Business Analyst
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2017
    Messages : 8
    Par défaut
    Bonjour Philippe,

    Merci de ton retour, cela semble effectivement être la solution recherchée, toutefois étant assez néophyte, je ne parviens pas à appliquer ces codes.

    J'ai généré le ToggleButton, mais ne parviens pas ensuite à appliquer les codes. même sans en changer les données (remplacer column par rows) le code est en erreur.

    Pourrais-tu stp me détailler les étapes dès lors que j'ai généré le ToggleButton, pour uniquement hide (action 1) & unhide (action 2) des lignes (4 à 21 dans mon cas)

    Merci par avance,

  10. #10
    Membre habitué
    Homme Profil pro
    Business Analyst
    Inscrit en
    Octobre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Business Analyst
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2017
    Messages : 8
    Par défaut
    Merci à tous pour vos idées et propositions. Je suis parvenu à mon objectif comme suit:

    1/ Générer le ToggleButton
    2/ View code

    Et le code en question:

    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
    Private Sub ToggleButton1_Click()
    If ToggleButton1.Value = True Then
     'This area contains the things you want to happen
    'when the toggle button is not depressed
    Rows(4).EntireRow.Hidden = True
    Rows(5).EntireRow.Hidden = True
    Rows(6).EntireRow.Hidden = True
     
    Else
    'This area contains the things you want to happen
    'when the toggle button is depressed
    Rows(4).EntireRow.Hidden = False
    Rows(5).EntireRow.Hidden = False
    Rows(6).EntireRow.Hidden = False
     
     End If
     End Sub

  11. #11
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Bonjour.

    On peut aussi faire plus compact :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub ToggleButton1_Click()
        Rows("4:6").EntireRow.Hidden = ToggleButton1.Value 'ToggleButton1.value=true => toggle button is not depressed
    End Sub
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bonne idée Philippe.

    Je pensais contrôle de formulaire mais c'est vrai qu'on peut utiliser un activeX
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/07/2019, 12h11
  2. Réponses: 2
    Dernier message: 12/03/2007, 14h48
  3. [Mail] Un seul bouton pour 2 actions
    Par nixax dans le forum Langage
    Réponses: 10
    Dernier message: 08/12/2006, 18h21
  4. Pb pour double action avec un bouton
    Par Dawax dans le forum Flash
    Réponses: 11
    Dernier message: 02/07/2006, 17h54
  5. [FLASH 8] Problème pour l'action d'un bouton.
    Par goma771 dans le forum Flash
    Réponses: 2
    Dernier message: 09/12/2005, 15h59

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