ms excel vba 填充具有不同列要求的列表框

Posted

技术标签:

【中文标题】ms excel vba 填充具有不同列要求的列表框【英文标题】:ms excel vba populate listbox with varying column requirements 【发布时间】:2016-12-21 23:38:20 【问题描述】:

背景

我正在 ms excel 中开发一个用户表单,为分布在多个工作表上的数据提供一个“仪表板”。用户窗体显示一个组合框,然后从该选择中填充列表框。用户窗体还允许通过“复制”按钮复制列表框信息。列表框的行源可以是单列(例如,Budget!$L$191)或多列和行(例如,JKG.Slave!$I$38:$JM$44)。

我在列表框属性中选择了“MultiSelect”属性。

挑战

如何在多列(如果需要)列表框中显示所有行源数据? 如何动态捕获支持多列列表框所需的列数? 我可以使用变量来捕获列数并让它在运行时填充列表框吗?

项目代码示例

Public Sub ComboBox1_Change()

Dim cSelect As String
Dim lcount As Integer

cSelect = UserForm2.ComboBox1.Value

UserForm2.ListBox1.RowSource = cSelect

lcount = UserForm2.ComboBox1.ColumnCount

MsgBox lcount

End Sub  

即使行源是多行多列选择,变量 lcount 也会返回一 (1)。

感谢大家的帮助。

【问题讨论】:

用户是否从 ComboBox1 中选择了不同的范围?您是在查找组合框中的列数还是选定范围内的列数? 【参考方案1】:

在这里,我修改了对Excel ComboBox - Autosize Dropdown Only 的回答,以调整组合框或列表框的Column 计数和ListWidths

用法

ConfigureComboOrListBox ListBox1

Private Sub ConfigureComboOrListBox(LCBox As Object)
    Dim arrData, arrWidths
    Dim x As Long, y As Long, ListWidth As Double
    arrData = LCBox.List
    ReDim arrWidths(UBound(arrData, 2))

    For x = 0 To UBound(arrData, 1)
        For y = 0 To UBound(arrData, 2)

            If Len(arrData(x, y)) > arrWidths(y) Then arrWidths(y) = Len(arrData(x, y))

        Next
    Next

    For y = 0 To UBound(arrWidths)

        arrWidths(y) = arrWidths(y) * LCBox.Font.Size
        ListWidth = ListWidth + arrWidths(y)
    Next

    With LCBox
        .ColumnCount = UBound(arrWidths) + 1
        .ColumnWidths = Join(arrWidths, ";")
        .ListWidth = ListWidth
    End With

End Sub

【讨论】:

【参考方案2】:

要将项目添加到列表框,只需定义您的范围并循环它们以添加到列表中。

现在我刚刚指定了一个任意范围,您可以将该范围设置为动态范围以及您需要的任何内容,代码将为您调整列数和行数。您无需弄乱listbox 的列计数属性,因为它是通过编程方式完成的,以适应您问题的动态性质。

   Dim x      
   Dim i As Long
   Dim y As Long
   Dim yy As Long

    x = Range("C1:E20") ' change this to suit the range you want       
    y = (UBound(x, 2) - LBound(x, 2))

    ListBox1.ColumnCount = y + 1
    For i = 0 To UBound(x) - 1
      With ListBox1
       .AddItem
        For yy = 0 To y
          .List(i, yy) = x(i + 1, yy + 1)
        Next
      End With
    Next    

然后获取多选,改变列表框的属性,

【讨论】:

以上是关于ms excel vba 填充具有不同列要求的列表框的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA:自动填充公式的代码,无论左侧列的长度是多少(因此不需要指定范围)

使用 Excel VBA 从包括空列在内的多个列表生成组合

在列表框 ms-access 2013 VBA 中将多个不同的字段作为列表项返回

VBA比较两个列表并删除不同列中具有重复值的行

Excel VBA 跨列自动填充

如何使用 VBA 在 Excel 宏中删除具有两列的重复项?