VBA直接访问功能区元素值

时间:2016-12-09 18:59:58

标签: vba excel-vba ribbonx excel

如何访问自定义功能区元素?

元素在(.xlsm \ customUI \ customUI.xml)

中生成
<ribbon startFromScratch="false">
    <tabs>
        <tab idMso="TabHome">
            <group id="MatrixGroup" label="xxx" insertBeforeMso="GroupClipboard">
                <button id="b1" label="111" imageMso="DataFormSource" onAction="asas" />
                <button id="b2" label="222" imageMso="ConditionalFormattingClearMenu" onAction="sasa" />
                <dropDown id="Drop" label=" Env" sizeString="WWWWWWWWW">
                    <item id="Item1" label="1"/>
                    <item id="Item2" label="2"/>
                    <item id="Item3" label="3"/>            
                    <item id="Item4" label="4"/>
                </dropDown>
            </group>
        </tab>
    </tabs>
</ribbon>

当我点击按钮时,我需要选择dropDown元素名称/ id =&#34; b1&#34;所以onAction =&#34; myMacro&#34;对于dropDown元素在这里无法帮助。

但是无论如何都有一个代码来获取下拉元素id - 也许你可以将它转换为从另一个Sub调用这个sub(通过按下按钮id =&#34; b1&#34;来触发)

Sub GetS(control As IRibbonControl, id As String, index As Integer)
    If control.id = "Drop" Then
    MsgBox id
End If End Sub

1 个答案:

答案 0 :(得分:1)

在这种情况下,您可能会使用几种回调:

  1. GetSelectedItemIndex:我认为这会从Dropdown控件返回Selected Item的索引位置。
  2. GetItemLabel:从功能区下拉控件中返回选定的项目标签
  3. GetItemID:返回指定的Index
  4. 的ID

    每个签名都是:

    Sub GetSelectedItemIndex(control As IRibbonControl, ByRef returnedVal)
    
    End Sub
    
    Sub GetItemLabel(control As IRibbonControl, Index As Integer, ByRef returnedVal)
    
    End Sub
    
    Sub GetItemID(control As IRibbonControl, Index As Integer, ByRef id)
    
    End Sub
    

    您确定可以将control对象从一个回调传递到另一个回调(基本上是手动调用/触发这些回调过程)。

    我没有任何位置来测试这个,所以我从记忆中稍微偏离了一点,你可能需要调整它并自行调试,但希望这是有帮助的。如果我没记错的话,这需要工作的方式是,当调用sasa回调时,您需要手动调用GetSelectedItemIndex然后GetItemLabel,并传递相应的control对象

    这是一个棘手的部分,在dropDown control对象上保留一个句柄。

    实际上,Ribbon对象存在一些问题,我发现通过将它最初加载到自定义类对象中更容易使用(保留对Dictionary中每个控件的直接对象引用属性,由控件名称/ id键入),以便我可以随意从其他过程传递它们)。这个here有一些背景可能已经足够了,在设置Class对象方面,您只需要添加另一个属性GetLet作为Dictionary类型的过程,以便您可以将每个功能区控件添加到dict。如果您在执行方面遇到问题,请就此提出单独的问题,我会尽力提供帮助。

    因此,一旦您可以访问适当的控件,就可以将该对象传递给GetSelectedItemIndex,例如:

    Dim ctrl as IRibbonControl
    Dim itm_id, itm_index 
    Set ctrl = {some object reference to the dropDown control}
    
    Call GetSelectedItemIndex(ctrl, itm_index)
    Call GetItemId(ctrl, itm_index, itm_id)
    MsgBox(itm_id)