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

Contribuez Discussion :

Ruban, Onglets, Groupes, Contrôles Exécute


Sujet :

Contribuez

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 11
    Points : 19
    Points
    19
    Par défaut Ruban, Onglets, Groupes, Contrôles Exécute
    Une proposition sans prétention qui traite de l'accès au ruban via code VBA sur la base des travaux de Ron de Bruin et de Tony Jollans.

    Pas de fioriture, l'ensemble est ramené à un traitement via deux feuilles dans le classeur joint.

    - Sélection par code d'un onglet sans les simulations clavier "Sendkeys" et "keybd_event".
    - Sélection par code d'un groupe de l'onglet Actif.
    - Sélection et exécution des contrôles contenus dans le groupe actif.

    En espérant que cela soit utile au plus grand nombre...

    Amicalement,
    Skip33

    PS Bug à l'ouverture résolu
    Fichiers attachés Fichiers attachés

  2. #2
    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
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    Bonjour skip33
    suite a ton MP
    bon j'ai regarder ton fichier
    tu a fait pas mal de boulot
    cependant
    deja pour commencer tes declarations d'api sont uniquement en 64 bits donc chez moi (Windows 7/offce 2007 32 bits)ca ne pouvait pas fonctionner erreur imediate
    j'y ai remedié comme suit (compatible(32/64)bits)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #If vba7 Then
        Private Declare PtrSafe Function AccessibleChildren Lib "oleacc.dll" ( _
        ByVal paccContainer As Object,    ByVal iChildStart As Long,  ByVal cChildren As Long, ByRef rgvarChildren As Variant, ByRef pcObtained As Long) As Long
        Private Declare PtrSafe Function SafeArrayGetDim Lib "oleaut32.dll" ( ByRef psa() As Any) As Long
    #Else
        Private Declare Function AccessibleChildren Lib "oleacc.dll" ( _
        ByVal paccContainer As Object, ByVal iChildStart As Long, ByVal cChildren As Long, ByRef rgvarChildren As Variant, ByRef pcObtained As Long) As Long
        Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef psa() As Any) As Long
    #End If
    ensuite j'ai le customtab qui ne peut pas se charger (voir capture)
    Nom : Capture.JPG
Affichages : 878
Taille : 90,9 Ko

    ensuite perso je vois pas trop l'utilité de pouvoir selectionner un onglet par une cellules: les rendre invisible ou visible avec les callback ca oui aurait été intéressant si tant est que ca soit possible

    perso sur le sheets tu marque
    "Testé sous W7 64 bits + Office 365 - 32 bits

    W10 64 bits + Office 365 - 32 bits"
    W8 64 bits + office 2010 - 64 bits
    j'ai de serieux doute sur ce point sachant que les apis n'etaient declarées que pour le 64

    bref je vais regarder pour le customTab qui ne se créé pas a l'ouverture

    je l'ouvrirais aussi en zip pour aller regarder un peu les xml dans le rel

    je te suggere aussi (si tu tiens pas plus que ca au api) de t'intérésser a UIautomationclient pour manier des bouton dans une fenetre c'est le top surtout que la on est sur une fenetre microsoft pure et dure
    je regarderais plus en profondeur ce soir et te donne des nouvelles tres vite

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 11
    Points : 19
    Points
    19
    Par défaut
    Merci patricktoulon de ta réponse, de tes conseils éclairés et du temps que tu passes sur le truc.

    Je vais me repencher sur le tout moi aussi, y compris UIautomationclient .

    Je rappelle que mon intention reste de proposer le concept, rien de plus.

    A bientôt,
    skip33

  4. #4
    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
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    re
    oui tout a fait

    prevois toujours avec les apis le 32/64 c'est important
    ce qui achete office ils prendront plutot la 32 que la 64 meme microsoft le recommande
    les versions 64 sont souvent integrées dans les pc commercials
    cela dit c'est interessant je rentre tard ce soir un peu crevé mais je lache pas je vais bien regarder
    merci pour ton travail en tout ca s

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 11
    Points : 19
    Points
    19
    Par défaut
    Bonsoir patricktoulon,

    Merci de tes interventions.

    Je viens d'essayer de mieux comprendre les deux erreurs qui sont apparues chez toi.

    1) Erreur sur la déclaration des APIs.
    De ce que j'ai compris, il faut tenir compte de 2 choses.
    - Windows d'un coté - 32 ou 64 bits
    - Office de l'autre - 32 ou 64 bits

    Alors, pour pallier à tous les cas de figure, cela devrait donner la structure de déclaration non ?

    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
    #If VBA7 Then '(OFFICE 2010 AND LATER - Either 32bit or 64bit Editions)
     
     
        #If Win64 Then '(64bit OS) AND (64bit Office)
     
            Private Declare PtrSafe Function AccessibleChildren Lib "oleacc.dll" _
                                (ByVal paccContainer As Object, _
                                 ByVal iChildStart As Long, _
                                 ByVal cChildren As Long, _
                                       rgvarChildren As Variant, _
                                       pcObtained As Long) _
                            As Long
     
            Private Declare PtrSafe Function GetRoleText _
                            Lib "oleacc.dll" _
                            Alias "GetRoleTextA" _
                                (ByVal dwRole As Long, _
                                       lpszRole As Any, _
                                 ByVal cchRoleMax As Long) _
                            As Long
     
        #Else '(32 or 64 bit OS) AND (32bit Office)
     
          Private Declare Function AccessibleChildren Lib "oleacc.dll" _
                                (ByVal paccContainer As Object, _
                                 ByVal iChildStart As Long, _
                                 ByVal cChildren As Long, _
                                       rgvarChildren As Variant, _
                                       pcObtained As Long) _
                            As Long
     
            Private Declare Function GetRoleText _
                            Lib "oleacc.dll" _
                            Alias "GetRoleTextA" _
                                (ByVal dwRole As Long, _
                                       lpszRole As Any, _
                                 ByVal cchRoleMax As Long) _
                            As Long
     
        #End If
     
     
    #Else  '(OFFICE 2007 AND BEFORE)  ... Both (32bit OS) AND (32bit Office)
     
        Private Declare Function AccessibleChildren Lib "oleacc.dll" _
                            (ByVal paccContainer As Object, _
                             ByVal iChildStart As Long, _
                             ByVal cChildren As Long, _
                                   rgvarChildren As Variant, _
                                   pcObtained As Long) _
                        As Long
     
        Private Declare Function GetRoleText _
                        Lib "oleacc.dll" _
                        Alias "GetRoleTextA" _
                            (ByVal dwRole As Long, _
                                   lpszRole As Any, _
                             ByVal cchRoleMax As Long) _
                        As Long
     
    #End If

    2) Erreur Chargement de l'onglet perso à l'ouverture du classeur.
    Ma déclaration initiale xml suivante :
    <customUI onLoad="RibbonOnLoad" xmlns="http://schemas.microsoft.com/office/2006/01/customui">

    Est devenue :
    <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="RibbonOnLoad" >


    Et j'ai ajouté via "Custom UI Editor" le module customUI14xml dont la première ligne de déclaration est :
    <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="RibbonOnLoad" >

    Voilà, après tes remarques, mes intervention sur le doc maintenant "V4" que tu trouveras en PJ.
    Si tu en as le temps, merci de me dire si cela va mieux.

    Pour le reste de tes remarques lors de ta première réponse, tu as raison, l’intérêt de ce docs est plutôt dans la feuille 2 car c'est là que tu accèdes au Ruban, aux Groupes constituant le Ruban et aux Contrôle présents dans les Groupes.
    Là on peut exécuter ces Contrôles...

    Exemple dans la feuille 2 :

    --> Dans le premier tableau, s'il est présent, choisir l'Onglet "Développeur"
    Puis dans le deuxième tableau, choisir le Groupe "Code"
    Puis dans le troisième tableau, choisir le Contrôle "Visual basic(bouton poussoir)"

    Du coup, je vais regarder UIautomationclient de plus près...

    A très bientôt,
    skip33
    Fichiers attachés Fichiers attachés

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 11
    Points : 19
    Points
    19
    Par défaut UIAutomation
    Re, patricktoulon,

    Alors, oui !

    Sur la base des différents travaux de Oliv-... on réussi, dans Excel, à activer un onglet du ruban, puis à exécute un contrôle particulier contenu dans l'un des groupes du ruban.
    Jusque là... OK...

    Toujours sur la base des travaux de Oliv-... on réussi à récupérer un certain nombre d'infos concernant le contrôle... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            Set aryRibbonTab = elmRibbon.FindAll(TreeScope_Subtree, cndProperty)
            For i = 0 To aryRibbonTab.Length - 1
                Debug.Print aryRibbonTab.GetElement(i).CurrentName & vbCrLf _
                & aryRibbonTab.GetElement(i).CurrentAccessKey & vbCrLf _
                & aryRibbonTab.GetElement(i).CurrentClassName & vbCrLf _
                & aryRibbonTab.GetElement(i).CurrentHelpText & vbCrLf _
                & aryRibbonTab.GetElement(i).CurrentControlType & vbCrLf _
                & aryRibbonTab.GetElement(i).CurrentIsContentElement & vbCrLf _
                & aryRibbonTab.GetElement(i).CurrentIsControlElement & vbCrLf _
                & aryRibbonTab.GetElement(i).CurrentLocalizedControlType & vbCrLf _
                & aryRibbonTab.GetElement(i).CurrentProcessId & vbCrLf _
                & aryRibbonTab.GetElement(i).CurrentProviderDescription & vbCrLf _
    ... mais pour le moment, activer ou désactiver - rendre visible ou pas - un onglet, un groupe ou encore certains contrôles à l'intérieur de ce groupe...

    Béh c'est pas gagné !

    Mais continuons nos recherches et nos expériences...
    C'est vachement intéressant !

    Car en effet, on pourrait peut être retrouver la souplesse de programmation de l'époque des "commandsbars"... bref...

    A suivre.

    skip33

  7. #7
    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
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    bonjour skip33 c'est quoi ce code il en manque non ???
    n'oublie pas que pour activer un control on peut toujours y acceder par commandbars.findcontrol(id:=xxxx)
    et la commande execute pour le cliquer ca n'est donc pas tellement important de trouver un autre moyen d'y acceder voir meme inutile
    du genre
    exemple pour l'insertion d'une image
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub test()
     Dim bouton
     Set bouton = CommandBars.FindControl(ID:=2619)
     Debug.Print bouton.Caption
     bouton.Execute
     End Sub
    non ce qui est vraiment interessant c'est bien d'avoir la possibilité de shunter les onglet ou le remettre dynamiquement encore une fois (si tant est que cela soit possible )
    existe il la possibilité sur le scratch true/false du xml de la piloter dynamiquement par VBA

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 11
    Points : 19
    Points
    19
    Par défaut
    Re patricktoulon,

    Oui, cette portion de code n'est qu'un extrait... (si le complet t'intéresse - si tu ne l'as pas déjà - je peux le donner)

    Oui également sur ce que tu dis concernant les différentes méthodes d'accès aux contrôles et à leur exécution.

    Pour autant, le fait de pouvoir accéder à la sélection et à l'activation d'un MSOTAB(onglet), de l'un de ses Groupes ou/et de l'un des contrôles qui y sont contenus n'est pas totalement dénué d’intérêt...
    Mais je te l'accorde, évidemment la manipulation totale et de manière dynamique du ruban et de ses contenus... ce serait un genre de "graal"...

    Je m'interroge sur l'orientation "Iaccessible" ou "UIautomation"

    Parce qu'en effet, hormis XML pour des "personalisations du ruban", dès que l'on sort de ça je n'ai rien trouvé du tout qui permette d'accéder aux notion d'activation/désactivation ou visible/invisible ou enable/disable de quelconques éléments du ruban.

    Certains sur le net affirment même que le ruban est statique et "inbidouillable" dynamiquement... en tout cas en VBA...

    J'en viens à me demander si les voies "Iaccessible" ou "UIautomation" sont les bonnes pour aller vers ce que l'on cherche... ???

    Bref, le truc est réellement intéressant et je continue de fouiller de mon coté...


    A++
    skip33

  9. #9
    Membre du Club
    Homme Profil pro
    EMPLOYER
    Inscrit en
    Août 2016
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : EMPLOYER
    Secteur : Alimentation

    Informations forums :
    Inscription : Août 2016
    Messages : 107
    Points : 41
    Points
    41
    Par défaut
    Bonjour a vous deux
    je cherche un macro qui vérifie si dans le ruban l'ongletperso est sélectionner
    si c'est le cas alors on active la feuil 3
    merci d'avance
    bien cordialement

  10. #10
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 978
    Points : 4 103
    Points
    4 103
    Par défaut
    Citation Envoyé par samchich Voir le message
    Je cherche une macro qui vérifie si dans le ruban l'onglet perso est sélectionné
    si c'est le cas alors on active la feuille 3
    Bonjour,
    Ci-dessous la fonction GetRibbonTabFocus qui renvoie la nom de l'onglet actif dans le ruban.
    Ce qui peut répondre à votre besoin d'information.


    Code VBA : 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
    89
    90
    91
    92
    Option Explicit
     
    '----------------------------------------------------------------------------------------
    Public Function GetRibbonTabFocus() As String
    '----------------------------------------------------------------------------------------
    ' Sources:
    ' https://www.developpez.net/forums/d697439/logiciels/microsoft-office/general-vba/contribuez/introduction-aux-fonctions-d-accessibilite/
    '----------------------------------------------------------------------------------------
    Dim oChild As Variant
    Dim oRibbon As IAccessible
    Dim oTab As IAccessible
    Dim MenuTabAddInsName As String
    Const ROLE_SYSTEM_CLIENT = &HA&
    Const ROLE_SYSTEM_WINDOW = &H9&
    Const ROLE_SYSTEM_PAGETAB = &H25&
    Const ROLE_SYSTEM_PROPERTYPAGE = &H26&
    Const ROLE_SYSTEM_PAGETABLIST = &H3C&
     
    On Error GoTo Gest_Err
    '' Ribbon Tool Bar
    Set oRibbon = CommandBars("ribbon")
    ' Ribbon Window
    Set oRibbon = oRibbon.accChild(ByVal 1&)
    ' Ribbon Client
    Set oRibbon = FindChildByRoleOrName(oRibbon, , ROLE_SYSTEM_CLIENT)
    ' Ribbon Client Window
    Set oRibbon = FindChildByRoleOrName(oRibbon, , ROLE_SYSTEM_WINDOW)
    '' Ribbon Client Window Client
    Set oRibbon = FindChildByRoleOrName(oRibbon, , ROLE_SYSTEM_CLIENT)
    ' Ribbon Client Window Client Window
    Set oRibbon = FindChildByRoleOrName(oRibbon, , ROLE_SYSTEM_WINDOW)
    ' Ribbon Property page
    Set oRibbon = FindChildByRoleOrName(oRibbon, , ROLE_SYSTEM_PROPERTYPAGE)
    ' Ribbon Tabs list
    Set oRibbon = FindChildByRoleOrName(oRibbon, , ROLE_SYSTEM_PAGETABLIST)
    ' Ribbon Tabs list Client
    Set oRibbon = FindChildByRoleOrName(oRibbon, , ROLE_SYSTEM_CLIENT)
    ' Tab:
    Set oTab = FindChildByRoleOrName(oRibbon, MenuTabAddInsName, ROLE_SYSTEM_PAGETAB)
    ' True if OK
    GetRibbonTabFocus = MenuTabAddInsName
     
    Exit Function
    Gest_Err:
    GetRibbonTabFocus = ""
    Err.Clear
    End Function
     
    '----------------------------------------------------------------------------------------
    Private Function FindChildByRoleOrName(pParent As IAccessible, _
                                           Optional pChildName As String = "*", _
                                           Optional pChildRole As String = "*") As IAccessible
    '----------------------------------------------------------------------------------------
    ' Fonction privée pour rechercher un objet accessible à partir de son parent, son role et son nom
    '----------------------------------------------------------------------------------------
    Dim lName As String, lRole As Long
    Dim oChild As IAccessible
    Const NAVDIR_FIRSTCHILD = &H7&
    Const NAVDIR_NEXT = &H5&
     
    On Error GoTo Gest_Err
    Set oChild = pParent.accNavigate(NAVDIR_FIRSTCHILD, ByVal 0&)
    If pChildName <> "*" Then lName = oChild.accName(ByVal 0&)
    If pChildRole <> "*" Then lRole = oChild.accRole(ByVal 0&)
    If lRole Like pChildRole And lName Like pChildName Then
        Set FindChildByRoleOrName = oChild
        Exit Function
    End If
     
    Do
        Set oChild = oChild.accNavigate(NAVDIR_NEXT, ByVal 0&)
        If pChildName <> "*" Then lName = oChild.accName(ByVal 0&)
        If pChildRole <> "*" Then lRole = oChild.accRole(ByVal 0&)
     
        ' Pour indiquer l'onglet actif:
        If oChild.accState(ByVal 0&) = 3145730 Then
            'Debug.Print "Onglet actif : " & oChild.accName(ByVal 0&)
            pChildName = oChild.accName(ByVal 0&)
            Exit Do
        End If
     
        If lRole Like pChildRole And lName Like pChildName Then
            Set FindChildByRoleOrName = oChild
            Exit Do
        End If
    Loop
    Exit Function
     
    Gest_Err:
    Set FindChildByRoleOrName = Nothing
    Err.Clear
    End Function

    Bonne continuation.

  11. #11
    Membre du Club
    Homme Profil pro
    EMPLOYER
    Inscrit en
    Août 2016
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : EMPLOYER
    Secteur : Alimentation

    Informations forums :
    Inscription : Août 2016
    Messages : 107
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par laurent_ott Voir le message
    Bonjour,
    Ci-dessous la fonction GetRibbonTabFocus qui renvoie la nom de l'onglet actif dans le ruban.
    Ce qui peut répondre à votre besoin d'information.


    Code VBA : 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
    89
    90
    91
    92
    Option Explicit
     
    '----------------------------------------------------------------------------------------
    Public Function GetRibbonTabFocus() As String
    '----------------------------------------------------------------------------------------
    ' Sources:
    ' https://www.developpez.net/forums/d697439/logiciels/microsoft-office/general-vba/contribuez/introduction-aux-fonctions-d-accessibilite/
    '----------------------------------------------------------------------------------------
    Dim oChild As Variant
    Dim oRibbon As IAccessible
    Dim oTab As IAccessible
    Dim MenuTabAddInsName As String
    Const ROLE_SYSTEM_CLIENT = &HA&
    Const ROLE_SYSTEM_WINDOW = &H9&
    Const ROLE_SYSTEM_PAGETAB = &H25&
    Const ROLE_SYSTEM_PROPERTYPAGE = &H26&
    Const ROLE_SYSTEM_PAGETABLIST = &H3C&
     
    On Error GoTo Gest_Err
    '' Ribbon Tool Bar
    Set oRibbon = CommandBars("ribbon")
    ' Ribbon Window
    Set oRibbon = oRibbon.accChild(ByVal 1&)
    ' Ribbon Client
    Set oRibbon = FindChildByRoleOrName(oRibbon, , ROLE_SYSTEM_CLIENT)
    ' Ribbon Client Window
    Set oRibbon = FindChildByRoleOrName(oRibbon, , ROLE_SYSTEM_WINDOW)
    '' Ribbon Client Window Client
    Set oRibbon = FindChildByRoleOrName(oRibbon, , ROLE_SYSTEM_CLIENT)
    ' Ribbon Client Window Client Window
    Set oRibbon = FindChildByRoleOrName(oRibbon, , ROLE_SYSTEM_WINDOW)
    ' Ribbon Property page
    Set oRibbon = FindChildByRoleOrName(oRibbon, , ROLE_SYSTEM_PROPERTYPAGE)
    ' Ribbon Tabs list
    Set oRibbon = FindChildByRoleOrName(oRibbon, , ROLE_SYSTEM_PAGETABLIST)
    ' Ribbon Tabs list Client
    Set oRibbon = FindChildByRoleOrName(oRibbon, , ROLE_SYSTEM_CLIENT)
    ' Tab:
    Set oTab = FindChildByRoleOrName(oRibbon, MenuTabAddInsName, ROLE_SYSTEM_PAGETAB)
    ' True if OK
    GetRibbonTabFocus = MenuTabAddInsName
     
    Exit Function
    Gest_Err:
    GetRibbonTabFocus = ""
    Err.Clear
    End Function
     
    '----------------------------------------------------------------------------------------
    Private Function FindChildByRoleOrName(pParent As IAccessible, _
                                           Optional pChildName As String = "*", _
                                           Optional pChildRole As String = "*") As IAccessible
    '----------------------------------------------------------------------------------------
    ' Fonction privée pour rechercher un objet accessible à partir de son parent, son role et son nom
    '----------------------------------------------------------------------------------------
    Dim lName As String, lRole As Long
    Dim oChild As IAccessible
    Const NAVDIR_FIRSTCHILD = &H7&
    Const NAVDIR_NEXT = &H5&
     
    On Error GoTo Gest_Err
    Set oChild = pParent.accNavigate(NAVDIR_FIRSTCHILD, ByVal 0&)
    If pChildName <> "*" Then lName = oChild.accName(ByVal 0&)
    If pChildRole <> "*" Then lRole = oChild.accRole(ByVal 0&)
    If lRole Like pChildRole And lName Like pChildName Then
        Set FindChildByRoleOrName = oChild
        Exit Function
    End If
     
    Do
        Set oChild = oChild.accNavigate(NAVDIR_NEXT, ByVal 0&)
        If pChildName <> "*" Then lName = oChild.accName(ByVal 0&)
        If pChildRole <> "*" Then lRole = oChild.accRole(ByVal 0&)
     
        ' Pour indiquer l'onglet actif:
        If oChild.accState(ByVal 0&) = 3145730 Then
            'Debug.Print "Onglet actif : " & oChild.accName(ByVal 0&)
            pChildName = oChild.accName(ByVal 0&)
            Exit Do
        End If
     
        If lRole Like pChildRole And lName Like pChildName Then
            Set FindChildByRoleOrName = oChild
            Exit Do
        End If
    Loop
    Exit Function
     
    Gest_Err:
    Set FindChildByRoleOrName = Nothing
    Err.Clear
    End Function

    Bonne continuation.
    Bonjour
    merci beaucoup pour votre retour
    je ne sais pas appeler cette fonction
    bien cordialement

Discussions similaires

  1. [WD-2010] Quickpart et Ruban Onglet perso?
    Par alx13 dans le forum Word
    Réponses: 7
    Dernier message: 27/03/2013, 11h49
  2. [AC-2007] Ruban : Utilisation du contrôle splitbutton
    Par billybob2 dans le forum IHM
    Réponses: 1
    Dernier message: 10/10/2010, 18h13
  3. Réponses: 1
    Dernier message: 26/09/2007, 01h09
  4. Réponses: 2
    Dernier message: 14/07/2006, 14h24
  5. [contrôle onglet] atteindre contrôle
    Par stéphane_ais2 dans le forum Access
    Réponses: 2
    Dernier message: 09/01/2006, 11h38

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