源数据:
代码:
Sub 对比()
Dim arr, brr, crr
Dim i, j, n, lastrowA, lastrowB As Integer
'建立字典对象
Set d = CreateObject("scripting.dictionary")
'获取数据区域最后一行的行数
lastrowA = Sheets("对比对齐两列数据").Cells(Rows.Count, 1).End(xlUp).Row
lastrowB = Sheets("对比对齐两列数据").Cells(Rows.Count, 2).End(xlUp).Row
'将数据区域导入数组
arr = Sheets("对比对齐两列数据").Range("A3:A" & lastrowA)
brr = Sheets("对比对齐两列数据").Range("B3:B" & lastrowB)
'重新定义数组crr,数组行数:数组arr+数组brr元素数和,列数:2
ReDim crr(1 To UBound(arr) + UBound(brr), 1 To 2)
'循环数组arr,将arr的值赋值给crr的第一列,同时,建立字典,字典的关键字为数组的值,对应的项目给该值对应的位置
'举例来说,字典的第一个关键字为淮安,淮安对应的项为1
For i = 1 To UBound(arr)
crr(i, 1) = arr(i, 1)
d(arr(i, 1)) = i
Next
n = UBound(arr)
'循环数组brr,首先判断brr的元素在字典中是否存在,如果存在,那么通过d(brr(j, 1))找到这个元素在字典中所在的位置,然后把这个元素赋值给crr该元素所在位置的第二列
'举例来说,brr的第一个值是青岛,在arr中是第17个,通过上面的循环和写入字典,可以判断,青岛已经是字典的关键字,并且对应的值是17,同时,数组crr的第17行,第1列的值就是青岛
'此时brr也出现了青岛,通过判断,字典中存在,那么d(brr(j, 1))=d(青岛)=17,即crr(17,2)=brr(j,1)=青岛,把青岛写入到crr的第17行,第2列
For j = 1 To UBound(brr)
If d.exists(brr(j, 1)) Then
crr(d(brr(j, 1)), 2) = brr(j, 1)
Else
'如果不存在,那么就写入到crr的n行2列,n的初始值是arr元素的数量,n+1,即第一个不在arr中的brr值写到crr的n+1行,之后每次出现都加一行,依次往下赋值
n = n + 1
crr(n, 2) = brr(j, 1)
End If
Next
'将crr的数据赋值到单元格区域
Sheets("对比对齐两列数据").Range("D3").Resize(n, 2).Value = crr
End Sub