让用户在VBA工具栏中选择多个值

时间:2013-08-12 08:01:24

标签: excel vba combobox listbox ribbonx

VBA中是否有办法将ListBox添加到工具栏(添加功能区)?我希望能够让用户在列表框中选择多个值/条件,而不是在下拉列表/组合框菜单中选择一个值。

以下代码仅添加下拉菜单

Sub addSelectControls()
    Dim newBar As Office.CommandBar
    Set newBar = CommandBars.Add(Name:="testing CommandBar", temporary:=True)
    Dim newCombo As Office.CommandBarComboBox
    Set newCombo = newBar.Controls.Add(Type:=msoControlDropdown, temporary:=True)
    With newCombo

        .AddItem "Blocks"
        .AddItem "Hardware"
        .AddItem "Aircraft Hardware"
        .AddItem "Vehical Hardware"
        .AddItem "Machinery"
        .AddItem "Wood Products"
        .AddItem "Miscellaneous Products"
        .AddItem "Miscellaneous Metal"
        .AddItem "Precast Metal"
        .AddItem "Forged Metal"
        .AddItem "Structural Steel"
        .AddItem "Fabricated Steel"
        .AddItem "Prebent Steel"
        .AddItem "Stock Steel"
        .ListIndex = 13
        .Width = 200
        .Caption = "Category"
        .Style = msoComboLabel
        .BeginGroup = True
        .OnAction = "Category_Select"

    End With
    'ctlComboBoxHandler.SyncBox newCombo
    newBar.Visible = True
End Sub

请指教。如果您知道更好的方法,那也会很棒!

2 个答案:

答案 0 :(得分:0)

古老的问题,但有一种方法可以在Office功能区中获得多选下拉列表。不过太花哨,因为在每次选择之后,你都必须重新打开下拉列表。 Example dropdown

您需要在DynamicMenu中使用Checkboxes

以下是我在自定义功能区UI中使用的XML:

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
  <ribbon>
    <tabs>
      <tab id="mso_c1.FD142A8" label="Diaverum" insertBeforeQ="TabHome">
        <group id="mso_c2.FD142A8" label="Szurés" imageMso="FilterByResource">
          <dynamicMenu id="FilterMenu" label="Beosztás szerint" getContent="GetMenuContent_FilterMenu" />
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

GetMenuContent_FilterMenu回调使用复选框填充动态菜单。它基本上创建一个XML字符串,其中包含用于创建复选框的命令。我在Excel中使用Table来获取值,但您可以更改此值。回调代码:

Sub GetMenuContent_Beosztas(control As IRibbonControl, ByRef returnedVal)

Dim CheckboxesXML As String
Dim myCell As Range
Dim i As Integer

For Each myCell In Range("tblBeosztas").Cells
  CheckboxesXML = CheckboxesXML & "<checkBox id=""chk_" & i & """ label=""" & myCell.Value & """ />" & vbNewLine
  i = i + 1
Next myCell

returnedVal = "<menu xmlns=""http://schemas.microsoft.com/office/2006/01/customui"">" & vbNewLine & _
    CheckboxesXML & _
    "</menu>"

End Sub

生成的XML如下所示:

<menu xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<checkBox id="chk_0" label="Nővér" />
<checkBox id="chk_1" label="Dializáló asszisztens" />
<checkBox id="chk_2" label="Technikus" />
<checkBox id="chk_4" label="Orvos igazgató" /> 
</menu>

答案 1 :(得分:0)

我最近使用的另一个替代方案是只有一个功能区按钮,弹出一个带有多选列表框的用户表单。这种方法的原因是我的用户必须选择类似8-10个选项的东西,并且每次选择都要打开它是痛苦的。

这种方法的好处在于选择表单只能通过该按钮获得,并且表单可以通过应用程序代码访问...因此即使没有显示,选择也始终可以检查。重新打开它仍然有以前的选择。

我将表单放在功能区正下方区域的顶部,并将此代码添加到表单中:

Public Sub reposition(ByVal aintX As Integer, ByVal aintY As Integer)
    Me.StartUpPosition = 0
    Me.Left = aintX
    Me.Top = aintY
End Sub

根据按钮的位置设置实际使用的X和Y,但是我还没想出怎么做,因为似乎没有任何方法可以从功能区获取该信息。我通过抓住我的功能区的屏幕截图来欺骗,然后只计算像素(好吧,我将屏幕截图粘贴到Paint中,然后绘制一个框以获取计数!)然后从中减去表单的宽度,然后添加窗口左侧的屏幕偏移等。它足以满足我的用户。