如何在Excel自定义function区控件的下拉控件中设置默认值

我为Excel 2010创build了一个自定义Fluentfunction区界面,其中包含一个下拉菜单。 相关的XML代码(简体):

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

当function区被加载时,没有select任何值 – 下拉菜单看起来是空的。

在这里输入图像说明

我希望默认select第一个项目 – 但找不到任何文档描述如何做到这一点。 我查看了该控件的MSDN文档 ,但没有涉及这种情况。 我尝试了各种“类HTML”语句的排列,但都被自定义UI编辑器拒绝为无效。 我尝试的例子:

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

错误消息: The 'selected' attribute is not declared

我尝试了其他属性,如selectedItemvalue ,并在<dropDown .../> ,但似乎没有任何工作。

如果只有我有正确的文档这将是微不足道的,但即使是function区定制的完整微软“文档”(在这里find沉默的主题。

我甚至试图查看位于http://schemas.microsoft.com/office/2006/01/customui的模式是否可以“人类可读”,但是当我试图在浏览器中打开它时,我被告知它是不可用。 也许有一个技巧…

所以我转向这个论坛的组合智慧。 你可以从我的Q / A比看到我不经常这样做

如何修改我的XML,以便在下拉控件中select任意项目时打开function区? 我会解决它作为第一个项目 – 但是“我select在我的XML中声明的任何项目”将是可取的。

我正在为此寻找一个XML解决scheme – 宁愿不必添加onLoad VBA代码或其他VBA技巧。 有多难呢,对吧?

看起来您需要使用VBA才能select默认项目。

引用dropDown元素的文档 (我强调):

getSelectedItemID(getSelectedItemIDcallback)

指定要调用的callback函数的名称,以确定要在此控件中select的项目的标识符。 getSelectedItemID和getSelectedItemIndex属性是互斥的。 如果既没有指定属性,控件也不应该显示选定的项目。 例如,考虑下面的XML片段:

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

在这个例子中,当应用程序需要确定图库中选定的项目时,调用GetGallerySelectedItemIDcallback函数。 在这个例子中,callback函数返回由GetItemIDcallback函数返回的一个标识符。 该属性的可能值由ST_Delegate简单types定义,如2.3.2节所述。

根据我对文档的阅读,预计您将自己维护当前select的filter项目。 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 

我在启动时出现了一个类似的问题,因为没有设置任何东西。 然而,当控件失效,但dropDown已经填充,它会再次返回空白select(我失去了控制,因为我添加了一些新的项目的列表,所以我想重build)。

正如这里所提到的,解决scheme是使用
<dropDown id="ddc0" label="Label Dropdown 0" getSelectedItemIndex="GetSelectedItemIndexDropDown ...如上所述。

然后VBA回电:

Sub GetSelectedItemIndexDropDown(control As IRibbonControl, ByRef index) ' Callbackname in XML File "GetSelectedItemIndexDropDown ...

按预期工作。 注意: onAction= "onActionCallback"用于设置状态并将其广播给VBA中的任何人; getSelectedItemIndex= "onGetSelectedItemIndexCallback"用于function区查询应该显示的状态。

我无耻地骗了这个XML – 我使用了RibbonCreator 2010 。

DefaultValue似乎被设置在所有荒谬地方的dropDown tag中。

 <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重复提到。