2013-08-12 17 views
1

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

下面的代码添加了一个下拉菜单只

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 

请指点。如果你知道一个更好的方法来做到这一点,那也会很棒!

+0

工具栏?你是指丝带或只是一个UserForm? –

+0

功能区(在“添加”下) –

+1

'msoControlDropdown'不适合多选。 –

回答

0

古老的问题,但有办法在Office功能区中获取多选下拉列表。不太喜欢,因为每次选择后,您都必须重新打开下拉菜单。 Example dropdown

您需要使用DynamicMenuCheckboxes

这是我在自定义功能区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> 
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中,然后画了一个盒子来计算!),然后从中减去表单的宽度,然后添加屏幕左侧的屏幕偏移等。它足以满足我的用户。