Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 将筛选后的表数据传递给ListBox_Excel_Vba - Fatal编程技术网

Excel 将筛选后的表数据传递给ListBox

Excel 将筛选后的表数据传递给ListBox,excel,vba,Excel,Vba,我的表格如下: 我试图过滤数据,然后将过滤后的数据显示到用户表单上的列表框中。 迄今为止的代码: Dim iList As Variant Sheet1.ListObjects("PostOneTable").Range.AutoFilter Field:=1, Criteria1:=TextBox1.Value & "*" Sheet1.ListObjects("PostOneTable").Range.AutoFilte

我的表格如下:

我试图过滤数据,然后将过滤后的数据显示到用户表单上的列表框中。 迄今为止的代码:

Dim iList As Variant

Sheet1.ListObjects("PostOneTable").Range.AutoFilter Field:=1, Criteria1:=TextBox1.Value & "*"
Sheet1.ListObjects("PostOneTable").Range.AutoFilter Field:=2, Criteria1:=TextBox2.Value & "*"
Sheet1.ListObjects("PostOneTable").Range.AutoFilter Field:=3, Criteria1:=TextBox3.Value & "*"
Sheet1.ListObjects("PostOneTable").Range.AutoFilter Field:=5, Criteria1:=TextBox4.Value & "*"

Dim jList As Range

Set jList = 
Sheet1.ListObjects("PostOneTable").DataBodyRange.SpecialCells(xlCellTypeVisible)

ListBox1.List = jList
然而,在运行代码时,我遇到了一些问题。 首先,过滤器似乎应用不正确。例如,如果我使用字符串,例如:

Sheet1.ListObjects("PostOneTable").Range.AutoFilter Field:=1, Criteria1:="ryd"
我只希望在表和列表框中看到第四项。然而,两者都是空白的

第二个问题是,代码不会将过滤列表驱动到文本框

请注意,我知道使用循环进行搜索的其他方法。然而,这种方法 这很好,因为最终用户可以直接在表中看到他们在表单上的操作结果

谢谢

编辑:
在玩它的时候,我注意到了一些有趣的东西。如果我注释掉将数据驱动到列表框的部分并重写过滤行,过滤现在可以工作。

Range.Value
只返回范围中第一个区域的值<代码>范围。SpecialCells(xlCellTypeVisible)将返回一个范围,其中每个相邻的单元格块都有一个区域

ListBox1.List
将仅包含第一组可见行的数据(第一组位于
jList

您仍然可以使用
ListObject
来过滤数据。您只需要编写一个函数来返回可见数据。这是一项琐碎的任务

ListBox1.List=ListObjectVisibleData(Sheet1.ListObjects(“PostOneTable”))


列表框的格式必须与指定给它的列表的列数相同。您还应该指定所有列的宽度,并指定一个BoundColumn。@Variatus all done。Listbox有六列,并且正确指定了宽度。这一切都是在属性框中完成的;不在代码中。在这种情况下,请尝试将未筛选的数据源范围分配给列表框。如果可以,请将
jList.Value
传输到由您的代码格式化的数组中。如果不起作用,则将
jList.Value
传输到字符串数组。但无论采用哪种方法,都需要与使用Add方法填充listbox:-)@Variatus一样多的代码和时间。错误代码为“无法设置列表属性。无效的属性数组索引。”错误位于“ListBox1.List=jList”。你能告诉我加法吗?自从发布后,我可能更喜欢循环……对于多列数据,
AddItem
方法有点麻烦,而且比将数组分配到
ListBox.List
要慢得多。但是对于初学者或中级开发人员来说,编写我的答案可能比编写我的答案更容易。就像一个符咒。我有点好奇。什么是“ReDim”?我没见过多少,但我绝对没见过。就算这不是辅导课……
ReDim
Redimension
的缩写。它允许您设置数组的维度。您应该在代码模块中键入Redim,然后按F1键导航到帮助文档。
ListBox1.List = jList
Public Function ListObjectVisibleData(ByVal ListObject As ListObject)
    Dim Map As New Collection
    Dim Row As Range
    For Each Row In ListObject.DataBodyRange.Rows
        If Not Row.EntireRow.Hidden Then
            Map.Add Row
        End If
    Next
    
    Dim Results As Variant
    Dim r As Long, c As Long
    
    If Map.Count = 0 Then
        ReDim Results(1 To 1, 1 To ListObject.ListColumns.Count)
    Else
        ReDim Results(1 To Map.Count, 1 To ListObject.ListColumns.Count)
        For Each Row In Map
            r = r + 1
            For c = 1 To UBound(Results, 2)
                Results(r, c) = Row.Cells(1, c).Value
            Next
        Next
    End If
    
    ListObjectVisibleData = Results
End Function