使用高级过滤器获取唯一值不起作用?

时间:2017-03-21 23:56:55

标签: excel vba excel-vba advanced-filter

我有两张纸:

表2:

Column C
Supplier Name
A
A
B
B
C

表1(期望结果)

Column G
A
B
C

我正在尝试在工作表1的G列中创建唯一供应商名称列表,如上所示。

我正在使用此代码:

Sub LIST()
    Dim r1 As Range, r2 As Range

    Dim lastrow As Long
    lastrow = Sheets("Data").Cells(Rows.Count, "C").End(xlUp).row

    Set r1 = Sheets("Data").Range("C2:C" & lastrow)
    Set r2 = Sheets("Sheet1").Range("G16")

    r1.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=r2, unique:=True



End Sub

此代码无法正常运行。它将第一个供应商名称A显示为重复,如下所示:

第1页

Column G
A
A
B
C

1 个答案:

答案 0 :(得分:2)

高级过滤器需要在“复制到”操作中携带的标题行。由于您没有绑定或包含一个,r1.AdvancedFilter命令假定C2是标题行。

Range("C2:C" & lastrow)更改为Range("C1:C" & lastrow),以便高级过滤器有一个标题行可以传输。

Sub LIST()
    Dim r1 As Range, r2 As Range

    Dim lastrow As Long
    lastrow = Sheets("Data").Cells(Rows.Count, "C").End(xlUp).Row

    Set r1 = Sheets("Data").Range("C1:C" & lastrow)
    Set r2 = Sheets("Sheet1").Range("G16")

    r1.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=r2, Unique:=True

End Sub

请注意,您将携带C1到Sheet1!G16。如果不需要,请将其删除。

替代直接值转移和RemoveDuplicates而不是AdvancedFilter。

Sub nodupeLIST()
    Dim r1 As Range, lastrow As Long

    With Worksheets("Data")
        lastrow = .Cells(Rows.Count, "C").End(xlUp).Row
        Set r1 = .Range("C2:C" & lastrow)
    End With

    With Worksheets("Sheet1")
        With .Range("G16").Resize(r1.Rows.Count, 1)
            .Cells = r1.Value
            .RemoveDuplicates Columns:=1, Header:=xlNo
        End With
    End With

End Sub