EXCEL VBA 取代cell查找,使用数组,提速显著

最近在做数据对照查找,类似vlookup的使用。最初使用的是worksheet中的cell单元格数值对应相等,返回一个结果。后来发现速度很慢。查阅资料后,发现使用数组很快。特此记录。

思路:

将数据源的两列数据对应成两个数组,分别读入到数组中,再使用输入单元格的数值和数组数值对比,如果相等,则返回第二个数组的对应值。

Sub test2()
'合并,速度更快
Dim i    '用于数组的索引,如果数据量很大,用int可能会溢出(int最大3w多),所以设置成variant
Dim j As Integer
Dim s As String
Dim t    '用于记录运行时间'
Application.ScreenUpdating = False    '提速用的,最后再开启'

Dim Arr1    '第一列数组,用于记录比对数据库'
Dim Arr2    '第二列数组,用于返回对应数值:如果输入值和arr1的对应起来了,返回对应的arr2'

t = Timer
i = Worksheets("desc").Range("C65535").End(xlUp).Row
'本句为经典用法,range.end()用于返回连续选中单元格某一方向下,出现第一个空白单元格前的单元格(即不为空的最后一个单元格),返回对象为range。如果单元格本身为空,则返回空白单元格的边界单元格。'
'end括号中为方向,xlup表示向上。本句意思是从C65535(即最最底部的单元格)向上走,第一个不同的单元格的行数。本语句也可以使用Range("C1").End(xldown).Row,前提是中间没有空格。

Arr1 = Application.Transpose(Worksheets("desc").Range("C2:C" & i))
Arr2 = Application.Transpose(Worksheets("desc").Range("I2:I" & i))

'transpose是转置的意思,如果不转置,arr1,2都是二维数组(第二个维度是1 to 1)。转置后成为一维数组。

i = 2   '用于找desc序号'
j = 2   'for code in sheet1
s = Worksheets(1).Cells(j, 2).Value
Do
    For i = 1 To UBound(Arr1)    'ubound用于返回数组的上边界,当数组大小未知时,非常好用'
        If s = Arr1(i) Then
            Worksheets(1).Cells(j, 17).Value = Arr2(i)
            Exit For
        End If
        Next i
        If i = UBound(Arr1) Then
            Worksheets(1).Cells(i, 17) = "missing"
        End If
    j = j + 1
    s = Worksheets(1).Cells(j, 2).Value
Loop While (s <> "")
MsgBox "用时" & Format(Timer - t, "0.00" & "s")
Application.ScreenUpdating = True

End Sub

相比较,处理800行的数据,使用数组方法,处理时间为1s左右,而使用worksheet的cell值比对,处理时间在200s左右。由此可见vba调用worksheet内元素是耗费时间的关键。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值