在学会了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就可以完成这个任务,但这种是没有考虑到效率的,数据量一旦多了,就会发现执行速度明显变慢!
但作为新手能熟练运用这些解决碰到的问题已经不错了,熟练运用这些是基础,而提高效率的方法在熟练运用基本语句之后,是比较简单的。