4

CustomUI エディターで作成した Word のカスタム リボン タブには、すべて正常に機能する多数のボタンがあります。Word 文書を開いたときに、このカスタム タブのフォーカスを設定できるかどうかを調べています。[または新しいドキュメントが作成されたとき。]

現在、デフォルトで [ホーム] タブのみが表示されます。カスタムタブのオンとオフを切り替える方法を見つけましたが、「フォーカスを設定」する方法はありません。

何か案は?

4

5 に答える 5

3

提示された答えは不必要に複雑です。最も簡単な解決策は、サムが答えたものの一部です。

カスタム XML のカスタム UI ルート ノードのメソッド名を参照する "onLoad"-callback 属性を追加します。例えば:

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
<ribbon startFromScratch="false">
    <tabs>
        <tab id="customTab" label="Custom Tab">
        </tab>
    </tabs>
</ribbon>
</customUI>

次に、正しいシグネチャを持つコールバック メソッドをドキュメント内のモジュールに追加します。このメソッドでは、IRibbonUI オブジェクトにアクセスできます。これを使用して、カスタムまたは組み込みのタブをアクティブ化できます。次の例では、「customTab」に等しい ID を持つカスタム タブをアクティブにします。

Sub Ribbon_Load(ribbon As IRibbonUI)
    ribbon.ActivateTab "customTab"
End Sub
于 2015-09-03T11:38:49.233 に答える
3

これは、Microsoft Active Accessibility を介して実現できます。次の Web ページのコードを含めましたが、詳細情報が必要な場合はチェックしてください。(サンプルはページ下部にあります)。

http://www.wordarticles.com/Shorts/RibbonVBA/RibbonVBADemo.php

新しいモジュールには、アクセシビリティ API を受け入れるためのコードがあります。

    ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '
    ' Definitions and Procedures relating to Accessibility, used by the Ribbon VBA  '
    ' Demonstration UserForm. The constants have been lifted from oleacc.h, and are '
    ' just a subset of those available.                                             '
    '                                                                               '
    '                                                    Tony Jollans, August 2008. '
    ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '

    Option Explicit

    Public Const CHILDID_SELF                  As Long = &H0&
    Public Const STATE_SYSTEM_UNAVAILABLE      As Long = &H1&
    Public Const STATE_SYSTEM_INVISIBLE        As Long = &H8000&
    Public Const STATE_SYSTEM_SELECTED         As Long = &H2&

    Public Enum RoleNumber
        ROLE_SYSTEM_CLIENT = &HA&
        ROLE_SYSTEM_PANE = &H10&
        ROLE_SYSTEM_GROUPING = &H14&
        ROLE_SYSTEM_TOOLBAR = &H16&
        ROLE_SYSTEM_PAGETAB = &H25&
        ROLE_SYSTEM_PROPERTYPAGE = &H26&
        ROLE_SYSTEM_GRAPHIC = &H28&
        ROLE_SYSTEM_STATICTEXT = &H29&
        ROLE_SYSTEM_TEXT = &H2A&
        ROLE_SYSTEM_BUTTONDROPDOWNGRID = &H3A&
        ROLE_SYSTEM_PAGETABLIST = &H3C&
    End Enum

    Private Enum NavigationDirection
        NAVDIR_FIRSTCHILD = &H7&
    End Enum

    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

    Public Function GetAccessible _
                        (Element As IAccessible, _
                         RoleWanted As RoleNumber, _
                         NameWanted As String, _
                         Optional GetClient As Boolean) _
                    As IAccessible

        ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '
        ' This procedure recursively searches the accessibility hierarchy, starting '
        ' with the element given, for an object matching the given name and role.   '
        ' If requested, the Client object, assumed to be the first child, will be   '
        ' returned instead of its parent.                                           '
        '                                                                           '
        ' Called by: RibbonForm procedures to get parent objects as required        '
        '            Itself, recursively, to move down the hierarchy                '
        ' Calls: GetChildren to, well, get children.                                '
        '        Itself, recursively, to move down the hierarchy                    '
        ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '

        Dim ChildrenArray(), Child As IAccessible, ndxChild As Long, ReturnElement As IAccessible

        If Element.accRole(CHILDID_SELF) = RoleWanted And Element.accName(CHILDID_SELF) = NameWanted Then

            Set ReturnElement = Element

        Else ' not found yet
            ChildrenArray = GetChildren(Element)

            If (Not ChildrenArray) <> True Then
                For ndxChild = LBound(ChildrenArray) To UBound(ChildrenArray)
                    If TypeOf ChildrenArray(ndxChild) Is IAccessible Then

                        Set Child = ChildrenArray(ndxChild)
                        Set ReturnElement = GetAccessible(Child, RoleWanted, NameWanted)
                        If Not ReturnElement Is Nothing Then Exit For

                    End If                  ' Child is IAccessible
                Next ndxChild
            End If                          ' there are children
        End If                              ' still looking

        If GetClient Then
            Set ReturnElement = ReturnElement.accNavigate(NAVDIR_FIRSTCHILD, CHILDID_SELF)
        End If

        Set GetAccessible = ReturnElement

    End Function

    Private Function GetChildren(Element As IAccessible) As Variant()
        ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '
        ' General purpose subroutine to get an array of children of an IAccessible  '
        ' object. The returned array is Variant because the elements may be either  '
        ' IAccessible objects or simple (Long) elements, and the caller must treat  '
        ' them appropriately.                                                       '
        '                                                                           '
        ' Called by: GetAccessible when searching for an Accessible element         '
        ' Calls: AccessibleChildren API                                             '
        ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '
        Const FirstChild As Long = 0&
        Dim NumChildren As Long, NumReturned As Long, ChildrenArray()

        NumChildren = Element.accChildCount

        If NumChildren > 0 Then
            ReDim ChildrenArray(NumChildren - 1)
            AccessibleChildren Element, FirstChild, NumChildren, ChildrenArray(0), NumReturned
        End If

        GetChildren = ChildrenArray
    End Function

そして、ThisTemplateまたはThisDocumentモジュールで:

    Option Explicit

    Private Sub Document_New()
        SwitchTab "MyTab"
    End Sub

    Private Sub Document_Open()
            SwitchTab "MyTab"
    End Sub


    Private Sub SwitchTab(TabName As String)
        Dim RibbonTab   As IAccessible

        'Get the Ribbon as an accessiblity object and the
        Set RibbonTab = GetAccessible(CommandBars("Ribbon"), ROLE_SYSTEM_PAGETAB, TabName)

        'If we've found the ribbon then we can loop through the tabs
        If Not RibbonTab Is Nothing Then
            'If the tab state is valid (not unavailable or invisible)
            If ((RibbonTab.accState(CHILDID_SELF) And (STATE_SYSTEM_UNAVAILABLE Or _
                         STATE_SYSTEM_INVISIBLE)) = 0) Then
                'Then we can change to that tab
                RibbonTab.accDoDefaultAction CHILDID_SELF
            End If
        End If

    End Sub
于 2013-02-27T23:37:45.380 に答える
1

カスタム リボン タブがリボンに描画されたら、次のようにキーをモデルに送信できます。

Application.SendKeys "%keytosend%"

送信する必要があるキーを確認するには、ワークブックを開いて を押しAltます。タブの上にキー アイコンが表示されます。

ここに画像の説明を入力

たとえば、Page Layoutタブをロードするには、次のようにキーを送信します。

Application.SendKeys "%P%"

注:呼び出すマクロをカスタム リボン コードに指示する必要がある場合がありますonLoad。これは、.xml を使用して XML で実行できますCustom UI Editor。カスタム リボン コードを含むワークブックを読み込み、次のようにonLoad属性を<customUI></customUI>タグに追加します。

ここに画像の説明を入力

onLoad追加したら、定義した関数 (この場合は ribbonLoad) に一致する VBA 関数を作成する必要があります。その関数では、適切なキーを送信できます。

Sub ribbonLoad(ctl As IRibbonUI)
    Application.SendKeys "%Y1%"
End Sub
于 2013-02-27T17:18:47.547 に答える
0

Sendkeys ソリューションを十分に確実に機能させることができませんでした。Active Accessibility ソリューションは機能しているようですが、もう少し時間が必要です。私は確かに後でこの方法を見直します.

カスタムタブがタブリストの最初のタブである場合、カスタムタブを表示する方法があることがわかりました。これらの設定を使用しました:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false"> 
<tabs>
<tab id="customTab" insertBeforeMso="TabHome" label="CustomTabName">

代替案をありがとう。とても有難い。

于 2013-03-06T23:44:18.003 に答える