如何在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
我尝试了其他属性,如selectedItem
, value
,并在<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重复提到。