对比2个表数据

2020-07-28 10:25:45 浏览数 (1)

在学会了If、For语句,了解了Range等VBA一些对象后,Excel里的大多数的问题应该都可以解决。

只要不停的用For循环,If语句判断,不去考虑效率的情况下,确实是这样的,今天用一个实际经常碰上的问题来试试这种简单的处理方法。

假设有2列数据,现在需要对比列C与列A的数据,找出列C中不在列A中出现的数据,并输出到E列:

代码实现:

代码语言:javascript复制
Sub CompareData()
    Dim arrA() As Variant
    Dim arrC() As Variant
    
    Dim rowA As Long
    Dim rowC As Long
    
    '获取A列和C列的最后一行行号
    rowA = Cells(Cells.Rows.Count, 1).End(xlUp).Row
    rowC = Cells(Cells.Rows.Count, 3).End(xlUp).Row
    
    '将A列和C列的数据存放到数组中
    arrA = Range("A1").Resize(rowA, 1).Value
    arrC = Range("C1").Resize(rowC, 1).Value
    
    '声明存储结果的数组
    Dim result() As Variant
    '数组使用一定要明确定义大小
    '结果数组肯定不会超过C列的数据数量,所以可以定义结果行的最大下标为rowC
    ReDim result(1 To rowC, 1 To 1) As Variant
    
    '记录标题
    result(1, 1) = arrC(1, 1)
    
    '记录结果数据的个数
    Dim resultCount As Long
    resultCount = 1 '标题占用1个
    
    '用循环找出列C中不在列A中出现的数据
    Dim i As Long, j As Long
    '数据是从第2行开始的
    For i = 2 To rowC
        '判断C列的每一个数据在A列中是否出现了
        For j = 2 To rowA
            '判断是否相同
            If arrA(j, 1) = arrC(i, 1) Then
                '如果相同就可以提前退出A列的循环了
                'Exit For退出最近的那个For循环
                Exit For
            End If
        Next
        '如果A列不是Exit For结束的,这时候j的值会等于rowA 1
        If j = rowA   1 Then
            '说明是在A列没有出现的数据,记录下来
            resultCount = resultCount   1 '结果的数量增加1
            result(resultCount, 1) = arrC(i, 1)
        End If
    Next
    
    '输出结果
    Range("E1").Resize(resultCount, 1).Value = result
End Sub

基本上只用了For、If就可以完成这个任务,但这种是没有考虑到效率的,数据量一旦多了,就会发现执行速度明显变慢!

但作为新手能熟练运用这些解决碰到的问题已经不错了,熟练运用这些是基础,而提高效率的方法在熟练运用基本语句之后,是比较简单的。

0 人点赞