8

ドロップダウンを含む Excel 2010 用のカスタム Fluent リボン インターフェイスを作成しました。関連する XML コード (簡略化):

<dropDown id="chooseFilter" showLabel="true" label="Filter" onAction="filterSelected" > 
    <item id="Filter1" label="Filter 1" /> 
    <item id="Filter2" label="Filter 2" /> 
</dropDown>

リボンが読み込まれると、値は選択されません。ドロップダウンは空に見えます。

ここに画像の説明を入力

デフォルトで最初の項目が選択されるようにしたいのですが、その方法を説明しているドキュメントが見つかりませんでした。コントロールのMSDN ドキュメントを見ましたが、このケースはカバーされていませんでした。「HTML のような」ステートメントのさまざまな順列を試しましたが、それらはすべてカスタム UI エディターによって無効として拒否されました。私が試したことの例:

<item id="Filter1" label="Filter 1" selected="selected" /> 

エラーメッセージ:The 'selected' attribute is not declared

selectedItem宣言で、value、 などの他の属性を試しselectedました<dropDown .../>が、何も機能していないようです。

私が適切なドキュメントを持っていれば、これは些細なことですが、リボンのカスタマイズに関する完全な Microsoft の「ドキュメント」でさえ (ここで見つかりました)、この件については沈黙していました.

http://schemas.microsoft.com/office/2006/01/customuiにあるスキーマが「人間が読める」かどうかも確認しようとしましたが、ブラウザーで開こうとすると、そうであると言われました利用できません。裏技があるかも…

そこで私は、このフォーラムの総合的な知恵に目を向けます。Q/A 比率からわかるように、私はこれをあまり頻繁に行いません...

ドロップダウン コントロールで任意の項目が選択された状態でリボンが開くように、XML を変更するにはどうすればよいですか? それが最初の項目であることに落ち着きますが、「XML で宣言することを選択した任意の項目」が望ましいでしょう。

このための XML ソリューションを探していますonLoad。VBA コードやその他の VBA トリックを追加する必要はありません。どれだけ大変なんだろう…。

4

3 に答える 3

10

デフォルト項目を選択するには、VBA を使用する必要があるようです。

dropDown 要素のドキュメントからの引用(強調):

getSelectedItemID (getSelectedItemID コールバック)

このコントロールで選択されるアイテムの識別子を決定するために呼び出されるコールバック関数の名前を指定します。getSelectedItemID 属性と getSelectedItemIndex 属性は相互に排他的です。どちらの属性も指定されていない場合、コントロールは選択された項目を表示すべきではありません。たとえば、次の XML フラグメントについて考えてみます。

<gallery id="gallery" getItemCount="GetGalleryItemCount"  
   getItemID="GetItemID"
   getSelectedItemID="GetGallerySelectedItemID" />

この例では、GetGallerySelectedItemID コールバック関数は、アプリケーションがギャラリーで選択されたアイテムを特定する必要があるときに呼び出されます。この例では、コールバック関数は、GetItemID コールバック関数によって返された識別子の 1 つを返します。この属性の可能な値は、セクション 2.3.2 で指定されているように、ST_Delegate 単純型によって定義されます。

ドキュメントを読んだところによると、フィルターの現在選択されている項目を自分で維持する必要があります。GetSelectedItemID ハンドラーは現在選択されている項目を返し、OnAction ハンドラーはそれを更新します。

XML では:

<dropDown id="chooseFilter" showLabel="true" label="Filter"
   getSelectedItemID="GetSelectedItemID" onAction="OnAction"> 
   <item id="Filter1" label="Filter 1" /> 
   <item id="Filter2" label="Filter 2" />
</dropDown>

そして、ワークブックのコード モジュールで:

Private mCurrentItemID As Variant

Sub GetSelectedItemID(control As IRibbonControl, ByRef itemID As Variant)
    If IsEmpty(mCurrentItemID) Then
        mCurrentItemID = "Filter1"
    End If
    itemID = mCurrentItemID
End Sub

Sub OnAction(control As IRibbonControl, selectedID As String, _
             selectedIndex As Integer)
    mCurrentItemID = selectedID
End Sub
于 2013-09-20T01:15:07.733 に答える
3

この XML を取得するために恥知らずにカンニングをしました。RibbonCreator 2010を使用しました。

すべてのばかげた場所の 'sDefaultValueに設定されているようです...dropDowntag

<dropDown id="ddc0" label="Label Dropdown 0" getSelectedItemIndex="GetSelectedItemIndexDropDown" onAction="OnActionDropDown" getVisible="GetVisible" getEnabled="GetEnabled" tag="RibbonName:=;inMenu:=;CustomTagValue1:=;CustomTagValue2:=;CustomTagValue3:=;DefaultValue:=1;CustomPicture:=;CustomPicturePath:=">
    <item id="ddc0Item0" label="a" screentip="a" supertip="a"/>
    <item id="ddc0Item1" label="b" screentip="b" supertip="b"/>
</dropDown>

編集:

VBA コードに次の関数を追加しない限り、これは機能しません。

Sub GetSelectedItemIndexDropDown(control As IRibbonControl, ByRef index)
    ' Callbackname in XML File "GetSelectedItemIndexDropDown"
    ' Callback getSelectedItemIndex
    Dim varIndex As Variant
    varIndex = getTheValue(control.Tag, "DefaultValue")
    If IsNumeric(varIndex) Then
        Select Case control.ID
            ''GetSelectedItemIndexDropDown''
            Case Else
                index = getTheValue(control.Tag, "DefaultValue")
        End Select
    End If
End Sub

Public Function getTheValue(strTag As String, strValue As String) As String
   Dim workTb()     As String
   Dim Ele()        As String
   Dim myVariabs()  As String
   Dim i            As Integer
   On Error Resume Next
      workTb = Split(strTag, ";")
      ReDim myVariabs(LBound(workTb) To UBound(workTb), 0 To 1)
      For i = LBound(workTb) To UBound(workTb)
         Ele = Split(workTb(i), ":=")
         myVariabs(i, 0) = Ele(0)
         If UBound(Ele) = 1 Then
            myVariabs(i, 1) = Ele(1)
         End If
      Next
      For i = LBound(myVariabs) To UBound(myVariabs)
         If strValue = myVariabs(i, 0) Then
            getTheValue = myVariabs(i, 1)
         End If
      Next
End Function

ただし、十分に一般的なものにすることで、一度配置すると XML で繰り返し参照できるようにすることができます。

于 2013-09-20T01:04:02.293 に答える