基于COUNTIF函数的动态列表

时间:2018-08-30 14:08:04

标签: excel excel-formula

List I        List II
A             G
B             X
I             R
G             L
H             U
K             A
L             S
N
R

在以下列表中,我使用了CountIF函数对在列表II中找到但不在列表I中找到的元素进行计数。随后,我创建了一个标题为CountIF的列,然后将其填充为1或0。然后打开一个新工作表并使用以下公式IF(CountIF_Column = 1;“”;列表II中的条目)。

问题:在新工作表中创建的列表有许多空单元格。我想要一个没有空格的列表,而不必手动删除空白单元格。

我的想法:我可以为带有空格的列表插入一个动态名称,然后以某种方式清除空格吗?不知道该怎么做...任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您可以使用数组和字典(仅保留唯一值)。下面假定list1在A列中,而list2在B列中,并从list2中而不是在C列中的list1中写出值。而且,假设在第1行中有标头。

Option Explicit
Public Sub test()
    Dim arr1(), arr2(), outputList As Object
    Dim lastRow1 As Long, lastRow2 As Long, i As Long
    With ThisWorkbook.Worksheets("Sheet1")
        lastRow1 = .Cells(.Rows.Count, "A").End(xlUp).Row
        lastRow2 = .Cells(.Rows.Count, "B").End(xlUp).Row

        If lastRow1 = 2 Then
            ReDim arr1(1, 1): arr1 = .Range("A2").Value
        Else
            arr1 = .Range("A2:A" & lastRow1).Value
        End If
        If lastRow2 = 2 Then
            ReDim arr2(1, 1): arr1 = .Range("B2").Value
        Else
            arr2 = .Range("B2:B" & lastRow2).Value
        End If

        arr1 = Application.WorksheetFunction.Transpose(Application.WorksheetFunction.Index(arr1, 0, 1))
        Set outputList = CreateObject("Scripting.Dictionary")

        For i = LBound(arr2, 1) To UBound(arr2, 1)
            If Not IsEmpty(arr2(i, 1)) Then
                If IsError(Application.Match(arr2(i, 1), arr1, 0)) Then
                    outputList(arr2(i, 1)) = 1
                End If
            End If
        Next
        If outputList.Count > 0 Then
            .Range("C2").Resize(outputList.Count, 1) = Application.WorksheetFunction.Transpose(outputList.keys)
        End If
    End With
End Sub