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中的条目)。
问题:在新工作表中创建的列表有许多空单元格。我想要一个没有空格的列表,而不必手动删除空白单元格。
我的想法:我可以为带有空格的列表插入一个动态名称,然后以某种方式清除空格吗?不知道该怎么做...任何帮助表示赞赏。
答案 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