Excel VBA - 从数组中填充多列userform列表框。当数组只有1个项目时没有数据

时间:2016-09-15 10:28:49

标签: arrays excel vba listbox

我有以下函数,我用它来填充一个userform列表框,其中包含数组中的数据:

Activity

我的列表框包含两列,其中包含以下属性:

enter image description here

问题

数组中的数据具有ID列和lastname列。我不希望用户看到ID列,所以我在表单中将列宽设置为0。

当我导入包含多行的数据时,数据会按预期显示在列表框中。

但是,当数组只包含一行数据时,列表框显示为空白!

我已经尝试删除上图中的列宽,当我这样做并重新导入一行数据时,我将ID和姓氏堆叠在一起。但是,当然这不是我想要的结果。

我甚至尝试用Function PopulateListboxWithArray(lstbox As MSForms.ListBox, var As Variant) With lstbox If Not IsEmpty(var) Then .Clear .list = Application.Transpose(var) .ListIndex = -1 End If End With End Function 替换.list = Application.Transpose(var)无效。

我在这里做错了什么,或者有更好的方法来填充列表框?

欢呼声

2 个答案:

答案 0 :(得分:0)

我在这篇文章中找到了答案:Adding item in listbox with multiple columns

我需要使用.List属性我的函数现在看起来像这样:

Function PopulateListboxWithArray(lstbox As MSForms.ListBox, var As Variant)

With lstbox

    If Not IsEmpty(var) Then
            .Clear
        If UBound(var, 2) > 0 Then
            .list = Application.Transpose(var)
        Else
            .AddItem var(0, 0)
            .list(.ListCount - 1, 1) = var(1, 0)
        End If

    End If

End With

End Function

答案 1 :(得分:0)

修改以添加更多"背景"

不太清楚你为什么要使用Application.Transpose()

    With lstbox
        If Not IsEmpty(var) Then
            .Clear
            If UBound(var, 1) = 1 Then
                .AddItem
                .List(0, 0) = var(1, 1)
                .List(0, 1) = var(1, 2)
            Else
'               .List = Application.Transpose(var)
                .List = var
            End If
            .ListIndex = -1
        End If
    End With

我以下列方式填充var

Private Sub UserForm_Initialize()
    Dim var As Variant

    With Worksheets("LB") '<--| change "LB" to your actual sheet name
        var = .Range("B1", .Cells(.rows.Count, "A").End(xlUp)).Value '<--| populate var with columns "A:B" cells values from row 1 down to column "A" last non empty row
    End With
    With Me.ListBox1
        .ColumnCount = 2 '<--| set listbox columns count
        .ColumnWidths = "0;144" '<--| set listbox columns width
    End With
    PopulateListboxWithArray Me.ListBox1, var
End Sub