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 :

Propriété State d'un bouton. msoButtonDown et msoButtonUp ne fonctionnent pas.


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 230
    Points : 129
    Points
    129
    Par défaut Propriété State d'un bouton. msoButtonDown et msoButtonUp ne fonctionnent pas.
    Bonjour à tous

    Je me trouve actuellement bloqué sur quelque chose qui me paraissait simple à première vu (du moins apres avoir compris le fonctionnement).

    J'ai une barre d'outil personnalisée. Dans cette barre d'outil j'ai un bouton nommé "Valeur relative". la propriété style est msoButtonIconAndCaption. (icone et texte)

    J'aimerai pouvoir enfoncé le bouton lorsque l'on clique dessus afin de visuellement comprendre que les tableaux présent dans mes feuilles sont en valeur relative. En gros je veux que le bouton de ma barre d'outil soit comme un bouton bascule.

    voici la macro que j'utilise (exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim m As CommandBarControl
        Set m = CommandBars("CommandBarName").Controls(1)
        If m.State = msoButtonDown Then
            m.State = msoButtonUp
        Else
            m.State = msoButtonDown
        End If
        Set m = Nothing
    End Sub
    Le problème c'est que le bouton ne s'enfonce pas du tout. Je précise que la macro est bien appelé sur le clic du bouton et qu'à ce niveau la il n'y a pas de problème.

    Lorsque la macro tourne elle passe bien sur else puis m.State = msoButtonDown. msoButtonDown prend alors la valeur - 1. Je ne comprend pas pourquoi le bouton ne reste pas enfoncé a la fin...

    Si quelqu'un à une idée je suis preneur bien entendu Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Points : 414
    Points
    414
    Par défaut Basculement d'un bouton de la barre d'outil d'Excel
    Bonjour Chagui,

    Le code fourni fonctionne parfaitement. J'ai le 1er bouton de ma barre d'outil qui bascule visuellement de façon persistante à chaque appel de la procédure fournie y compris en utilisant le style indiqué msoButtonIconAndCaption. Le problème n'est donc pas au niveau du style.

    Cependant on ne voit pas trop l'intérêt de la dernière instruction :
    Le but est de basculer l'état du bouton, pas de libérer le bouton de la mémoire.
    N'importe comment cela marche avec ou sans Set m = Nothing même si cette instruction peut être supprimée.

    Initialement je pensais que le bug était dans le type du bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim m As CommandBarControl
    Car j'utilise le type CommandBarButton mais cela marche également avec CommandBarControl.

    Citation Envoyé par Chagui Voir le message
    Le problème c'est que le bouton ne s'enfonce pas du tout.
    Puis deux phrases plus loin :

    Citation Envoyé par Chagui Voir le message
    pourquoi le bouton ne reste pas enfoncé a la fin...
    Donc cela marche au moins temporairement (on est donc rassuré sur la validité du nom de la barre d'outil et de la postion du bouton) mais quelque chose que l'on cherche à identifier remet le bouton à l'état msoButtonUp.

    Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE, copier-coller l'instruction suivante à valider par la touche ENTER :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.CommandBars("CommandBarName").Controls(1).State = msoButtonUp
    Rien ne s'affiche dans la fenêtre d'Exécution immédiate.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? Application.CommandBars("CommandBarName").Controls(1).State
    0
    Le bouton n'est pas appuyé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.CommandBars("CommandBarName").Controls(1).State = msoButtonDown
    Dans la feuille de calcul d'Excel, le bouton doit rester dans l'état appuyé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? Application.CommandBars("CommandBarName").Controls(1).State
    -1

    Essayez d'extraire le code de création de ce button dans une procédure simplifiée ainsi que la procédure complète de basculement (flipflop) de son état à copier dans un module .bas d'une autre feuille Excel vide.
    Fournissez ces deux procédures si cette dernière ne fonctionne toujours pas dans la fenêtre d'Exécution immédiate.

  3. #3
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 230
    Points : 129
    Points
    129
    Par défaut
    Bonjour MattChess,

    Les tests à effectuer dans la fenêtre execution n'ont rien donné. Lorsque je clique sur ENTER rien ne se passe.

    je précise quand copiant la ligne de code à tester , j'ai un message d'erreur "Argument ou appel de procédure incorrect" et en mettant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.CommandBars(BarrePerso1).Controls(1).State = msoButtonUp
    Rien ne se passe.

    je joints un fichier excel exemple avec les procédures simplifiées. En espérant que vous arriviez à comprendre le pourquoi du comment !! Je suis curieux en tout cas...

    Merci pour votre aide

    Cordialement,

    Guillaume
    Fichiers attachés Fichiers attachés

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Points : 414
    Points
    414
    Par défaut Initialisation d'une barre d'outils avec Excel VBA
    Chagui, d'abord félicitations pour avoir simplifié le problème dans la maquette TestBarreMenu.xls.
    On a apprécié les constantes nommées et les commentaires.

    Cependant il vaut mieux éviter tout lancement de macros à l'ouverture et la fermeture de la feuille Excel pour des raisons de sécurité anti-virus.
    Préférez un mode d'emploi tel que :
    Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE, copier-coller et validez par ENTER :
    Le bug se trouve dans le type ID de bouton créé quand on ajoute un nouveau bouton.
    Le type ID 960 crée un clic-bouton qui peut ne pas rester dans l'état msoButtonDown

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Set LBouton = LBar.Controls.Add(Type:=msoControlButton, ID:=960)
    Préférez le type ID de bouton ctrlBtnId = 2950 qui autorise l'effet flip-flop persistant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub CreeBarreMenu1()
    Const rowTlb = 3, ctrlBtnId = 2950 ' type de bouton flip-flop persistant
    Dim LBouton As CommandBarButton, StyleBouton As Long
    ...
    Set LBouton = LBar.Controls.Add(Type:=msoControlButton, ID:=ctrlBtnId)
    Pour changer la nouvelle icône du smiley jaune qui s'affiche maintenant après remplacement de l'ID du bouton, voir la propriété FaceId dans le code suivant.

    1. Initialisation d'une barre d'outils avec Excel VBA

    Voici une méthode pour créer une barre d'outil avec une description de chaque bouton compacte que l'on espère compréhensible.

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    Option Explicit
    Public Const nameBarRestit = "TabRestit" ' Barre d'outil "Tableaux des restitutions"
    Public Const indTlbAbsRel = 1 ' Indice du premier bouton de la barre d'outil
    Public Const indTlbVolVal = indTlbAbsRel + 1
    'Public Const indTlbNextBtn = indTlbVolVal + 1 ' Prochain bouton
     
    Function TlbRestit() As CommandBar ' Accès à la barre d'outil "TabRestit"
        Set TlbRestit = CommandBars(nameBarRestit)
    End Function
     
    Sub ToolbarCreate()
    Const rowTlb = 3, ctrlBtnId = 2950 ' type de bouton flip-flop persistant
    Const indBtnCaption = 0, indBtnAction = 1, indBtnIcon = 2 ' Item dans le tableau arrBtn
    Dim cmdTlb As CommandBar, cmdBtn As CommandBarButton
    Dim indBtn As Byte, arrBtn As Variant ' Description de la barre d'outil
     
        ToolbarDelete
        Set cmdTlb = CommandBars.Add(nameBarRestit, msoBarTop, False, True)
    '    cmdTlb.RowIndex = rowTlb ' Peut décaler les toolbars par défaut d'Excel si visibles
        arrBtn = Array(Array("Valeur absolue", "AbsRel", 205), _
                        Array("Restitution en valeur", "VolVal", 16))
     
        For indBtn = LBound(arrBtn) To UBound(arrBtn) ' Pour chaque description de boutons
            Set cmdBtn = cmdTlb.Controls.Add(Type:=msoControlButton, Id:=ctrlBtnId) ' Crée le bouton
            With cmdBtn ' Initialisation commune de chaque bouton
                .FaceId = arrBtn(indBtn)(indBtnIcon) ' Icon du bouton
                .Style = msoButtonIconAndCaption
                .Caption = arrBtn(indBtn)(indBtnCaption)
                .OnAction = "Btn" + arrBtn(indBtn)(indBtnAction) + "Click"
                Select Case .Index
                Case indTlbVolVal ' Initialisation particulière d'un bouton donné
                    .BeginGroup = True ' Si on veut un séparateur de groupe de boutons
                    .State = msoButtonDown ' "Restitution en valeur" down par défaut
                End Select
            End With
        Next
        cmdTlb.Visible = True
    End Sub
     
    Sub ToolbarDelete()
      On Error Resume Next
      TlbRestit().Reset
      TlbRestit().Delete
      On Error GoTo 0
    End Sub
     
    Private Sub BtnAbsRelClick() ' Clic sur le bouton "Valeur absolue / relative"
        With TlbRestit.Controls(indTlbAbsRel)
            If .State = msoButtonDown Then
                .State = msoButtonUp
                .Caption = "Valeur absolue"
            Else
                .State = msoButtonDown
                .Caption = "Valeur relative"
            End If
        End With
    End Sub
     
    Private Sub BtnVolValClick() ' Clic sur le bouton "Restitution en volume / valeur"
        With TlbRestit.Controls(indTlbVolVal)
            If .State = msoButtonDown Then
                .State = msoButtonUp
                .Caption = "Restitution en volume"
            Else
                .State = msoButtonDown
                .Caption = "Restitution en valeur"
            End If
        End With
    End Sub
     
    Sub ShowFaceIDs() ' Display the available FaceIDs of toobar buttons
    Const ctrlBtnId = 2950, indIdStart = 1, indIdStop = 250
    Dim cmdTlb As CommandBar, cmdBtn As CommandBarButton, indFaceId As Integer
     
        On Error Resume Next
        Application.CommandBars("FaceIds").Delete
        On Error GoTo 0
     
        Set cmdTlb = Application.CommandBars.Add(Name:="FaceIds", temporary:=True)
        cmdTlb.Visible = True
     
        For indFaceId = indIdStart To indIdStop
            Set cmdBtn = cmdTlb.Controls.Add(Type:=msoControlButton, Id:=ctrlBtnId)
            cmdBtn.FaceId = indFaceId
            cmdBtn.Caption = "FaceID = " & indFaceId
        Next
        cmdTlb.Width = 600
    End Sub
    2. Création de la barre d'outils et basculement manuel des boutons pour test

    Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE, copier-coller et validez par ENTER :
    Une nouvelle barre d'outil s'affiche sous les barres d'outils existantes d'Excel.

    • Le 1er bouton "Valeur absolue" est à l'état msoButtonUp.
    • Le 2eme bouton " Restitution en valeur" est à l'état msoButtonDown par défaut.



    Chaque bouton est identifié par un indice tel que indTlbAbsRel (Absolue / Relative).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ? CommandBars(nameBarRestit).Controls(indTlbAbsRel).State
    0
    Le 1er bouton "Valeur absolue" est bien à l'état msoButtonUp = 0

    Changeons son état en le passant à l'état msoButtonDown = -1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     CommandBars(nameBarRestit).Controls(indTlbAbsRel).State = msoButtonDown
    Sur la feuille de calcul d'Excel, le bouton reste à l'état enfoncé.

    Remettons le à l'état msoButtonUp. TlbRestit() permet d'accéder à la barre d'outil.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     TlbRestit().Controls(indTlbAbsRel).State = msoButtonUp
    Idem pour le 2eme bouton d'indice indTlbVolVal (Volume / Valeur).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     TlbRestit().Controls(indTlbVolVal).State = msoButtonUp
    3. Description des boutons de la barre d'outils lors de sa création

    Dans ce chapitre, on reprend des extraits du code de création de la barre d'outil pour les commenter.

    La description de la barre d'outil commence par son nom et surtout les indices de chaque bouton.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Option Explicit
    Public Const nameBarRestit = "TabRestit" ' Barre d'outil "Tableaux des restitutions"
    Public Const indTlbAbsRel = 1 ' Indice du premier bouton de la barre d'outil
    Public Const indTlbVolVal = indTlbAbsRel + 1
    'Public Const indTlbNextBtn = indTlbVolVal + 1
    Dans ToolbarCreate(), la description de chaque bouton est dans le tableau de type Variant arrBtn() c-a-d array of button.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        arrBtn = Array(Array("Valeur absolue", "AbsRel", 205), _
                        Array("Restitution en valeur", "VolVal", 16))
    La structure du tableau le plus interne est donnée par les constantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Const indBtnCaption = 0, indBtnAction = 1, indBtnIcon = 2 ' Item dans le tableau arrBtn
    On notera que l'action "AbsRel" en seconde position dans le 1er item du tableau est le cœur du nom de la procédure correspondant à ce qu'il faut faire quand on clique sur le bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub BtnAbsRelClick() ' Clic sur le bouton "Valeur absolue / relative"
    Dans cette version d'arrBtn(), on a considéré que le Style de chaque bouton pouvait être factorisé dans l'initialisation commune, voire modifié au cas par cas dans l'initialisation particulière.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                .Style = msoButtonIconAndCaption
    Alternativement on pourrait faire évoluer la structure d'arrBtn() pour y ajouter un quatrième paramètre de Style mais il faudrait spécifier un Style pour chaque bouton.

    La création de chaque bouton se fait dans une boucle par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        For indBtn = LBound(arrBtn) To UBound(arrBtn) ' Pour chaque description de boutons
            Set cmdBtn = cmdTlb.Controls.Add(Type:=msoControlButton, Id:=ctrlBtnId) ' Crée le bouton
            With cmdBtn ' Initialisation commune de chaque bouton
                .FaceId = arrBtn(indBtn)(indBtnIcon) ' Icon du bouton
    Le .FaceId du bouton autrement dit son icône est un indice à choisir parmi les quelques 250 icônes que présente en info-bulle l'utilitaire fourni ShowFaceIDs() dans une ... barre d'outil temporaire flottante.

    Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE, copier-coller et validez par ENTER :
    Basculez du VBE vers la feuille Excel pour lire les info-bulles des icônes intéressantes.

    Dans ToolbarCreate(), le corps du For Next pour chaque bouton d'indice indBtn est articulé en :

    • Une initialisation commune de chaque bouton
    • Une initialisation particulière d'un bouton donné selon un Select Case .Index du bouton.



    4. Convention de nommage orientée objet

    Au niveau de la convention de nommage, l'inversion Verbe d'action après Nom d'objet dans ToolbarCreate(), ToolbarDelete() permet de regrouper dans la listbox des procédures du VBE toutes les procédures relatives à la gestion de la barre d'outil. C'est plus intéressant que d'avoir toutes les procédures qui créent ou effacent quelque chose.

    Les procédures BtnAbsRelClick() et BtnVolValClick() gèrent l'événement Click sur les boutons d'indice indTlbAbsRel et indTlbVolVal dans la barre d'outil.
    ___________

    Si la discussion est résolue, vous pouvez cliquer sur le bouton

    En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert ci-dessous.

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/03/2013, 12h22
  2. Réponses: 6
    Dernier message: 30/05/2012, 13h16
  3. mvvm: Command sur bouton dans un datagrid ne fonctionne pas
    Par Golzinne dans le forum Silverlight
    Réponses: 6
    Dernier message: 11/11/2011, 15h45
  4. Boutons de commande qui ne fonctionnent pas
    Par Shakti dans le forum IHM
    Réponses: 4
    Dernier message: 24/11/2006, 16h29
  5. Propriété enabled d'un bouton
    Par malabar92 dans le forum Access
    Réponses: 2
    Dernier message: 24/06/2006, 17h28

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