Vba “填充”;列表框“;使用高级过滤器(仅限唯一值)

Vba “填充”;列表框“;使用高级过滤器(仅限唯一值),vba,excel,excel-2007,Vba,Excel,Excel 2007,Excel 2007 我在A列中有大约1000行,其中250行是唯一的。我需要250个唯一的行以用户选择多个项目的形式显示。我一直在使用带有高级过滤器的宏记录器,无法获取要填充的列表。我正在尝试将列表分配给一个范围变量 Public Sub UniqueCMFundList() Dim CMFundList As Range Dim RangeVar1 As Range Dim RangeVar2 As Range Sheets("HiddenDataList").Activate Ran

Excel 2007

我在A列中有大约1000行,其中250行是唯一的。我需要250个唯一的行以用户选择多个项目的形式显示。我一直在使用带有高级过滤器的宏记录器,无法获取要填充的列表。我正在尝试将列表分配给一个范围变量

Public Sub UniqueCMFundList()

Dim CMFundList As Range
Dim RangeVar1 As Range
Dim RangeVar2 As Range

Sheets("HiddenDataList").Activate

Range("A2").Select
Set RangeVar1 = Range(Selection, Selection.End(xlDown)).Select
Set CMFundList = RangeVar1.AdvancedFilter(xlFilterInPlace, , , True)

'This is what I get with macro recorder:
        'Range("A1:A1089").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
            ' Range("A1:A1089"), Unique:=True

Debug.Print CMFundList.Value


End Sub
这里有一个方法:

Private Sub UserForm_Initialize()

    Dim arrUnqItems As Variant

    With Sheets("HiddenDataList")
        .Range("A1", .Cells(.Rows.Count, "A").End(xlUp)).AdvancedFilter xlFilterCopy, , .Cells(1, .Columns.Count), True
        arrUnqItems = Application.Transpose(.Range(.Cells(2, .Columns.Count), .Cells(.Rows.Count, .Columns.Count).End(xlUp)).Value)
        .Columns(.Columns.Count).Clear
    End With

    Me.ListBox1.Clear
    Me.ListBox1.List = arrUnqItems

    Erase arrUnqItems

End Sub

也可以使用集合对象来执行此操作。对于大型工作表,它应该比过滤快得多,特别是在涉及公式的情况下。请注意,如果希望返回集合,则只需更改将集合转换为数组的最后一位(该数组是为了方便您查看列表框)

我使用了下面的一个稍微细微的变体,它适用于数组和范围参数以及开关,可以一直忽略这些东西,而且速度非常快

'Just use it like:
Me.ListBox1.List = GetUniqueItems(Range("A1:A100"))

Public Function GetUniqueItems(rng As Range) As Variant()

    Dim c As Collection
    Dim arr, ele
    Dim i As Long
    Dim area As Range

    Set c = New Collection

    For Each area In rng.Areas

        arr = area.Value
        On Error Resume Next
        If IsArray(arr) Then
            For Each ele In arr
                c.Add ele, VarType(ele) & "|" & CStr(ele)
            Next ele
        Else
            c.Add arr, VarType(arr) & "|" & CStr(arr)
        End If
        On Error GoTo 0

    Next area

    If c.Count > 0 Then
        ReDim arr(0 To c.Count - 1)
        For i = 0 To UBound(arr)
            arr(i) = c(i + 1)
        Next i
        GetUniqueItems = arr
    End If

End Function
或者,一个高级过滤器(就地-无需在别处复制数据的开销):


你收到错误信息了吗?如果是这样的话,它是什么,它指的是哪条线。嘿,我以前从来没有注意到Transpose将列数组更改为向量。有用:-)谢谢。我是VB新手。我没有收到任何错误,但是列表框中也没有显示任何内容?我的用户表单(名称)是“ERSHOFFINGFILE”,而我的列表框(名称)是“ListBox\u SelectCMFund”,因此我将“UserForm\u Initialize()”替换为“ListBox\u SelectCMFund”,将“ListBox1”替换为“ListBox\u SelectCMFund”。如果更改了子名称,则需要手动运行子名称。我建议将子名称保留为“UserForm\u Initialize”。这是第一次加载userform时将运行的关键字子名称。因此,基本上,它将填充open上的列表框。难以准确理解此处发生的情况:。范围("A1…:复制唯一值arrUnqItems=:将值从columnar转换为array.Columns….清除:清除列如何将xlFilterCopy的结果传递给Application.Transpose?为什么要清除列?我在示例工作簿中注释掉了该行,但什么都看不见。我是VB新手。感谢您的帮助。我我无法在我的[ListBox(Name)ListBox\u SelectCMFund]中显示任何内容,它是[UserForm(Name)ErrsofuringFile]的一部分。我尝试了代码并尝试更新RowSource属性,但它只是空的。
Dim rng As Range
Dim uniques
Set rng = Range("A1:A1001")
rng.AdvancedFilter Action:=xlFilterInPlace, Unique:=True
uniques = Application.WorksheetFunction.Transpose(Intersect(rng, rng.Offset(1, 0)).SpecialCells(xlCellTypeVisible).Value)
rng.Show 'not necessary if you are only using the worksheet as hidden etc but this removes the filter
Me.Listbox1.List = uniques