vlookup是在excel中最常使用的函数之一
但是当数据量非常大的时候
大量的vlookup会吃掉excel内存,导致文件变得很慢
下面提供一段vba的代码,让你在vba内部实行和vlookup完全一致的能力
因为使用的是在数组中比对数据的做法,计算速度会比在表内计算要提高数倍
在数据非常大量的情况下很适合使用
缺点是只能在vba内部使用,在外部不会留下函数,修改也只能在vba内部修改
以下是简单的代码外加注释说明
Function A_Vlookup()
Dim Lsr As Long, SHTname As String, VEV As String '定义三个变量,最终行,表名称,和vlookup取得值
Dim DataArray() As String '定义一个数组
SHTname = "sheet1"
Set SHT_INPUT = Worksheets(SHTname) '选中需要vlookup的表
With SHT_INPUT
Lsr = .Cells(Rows.Count, 1).End(xlUp).Row '取得第一列的最后一个数据,以此作为数组最终行数据
For j = 0 To 4 '用j循环取值所需的列
ReDim Preserve DataArray(Lsr - 1, j) '每次循环取值都制造一个新的空列,从0到4
For i = 1 To Lsr
DataArray(i - 1, j) = .Cells(i, j + 1).Value '把excel内的数据按照列单位一一取入数组
Next i
Next j
On Error Resume Next '因为在vba内使用vlookup,NA状态就成为error,所以此行必须
VEV = WorksheetFunction.VLookup(Format(.Cells(1, 7).Value, "@"), DataArray, 2, 0) '数组全是文字列,因此使用worksheetfunction功能直接从所定单元格进行查找,之后的部分就是熟悉的配方
On Error GoTo 0 '因为使用了resume next,此行必须,将error回归到0,以便下面出现error仍能启动debug机能
.Cells(1, 8).Value = VEV '在所定单元格导入查找结果
VEV = "" '使用后清除变数内容,因为使用了跳过error机能,没有此行将有可能返回以前数据
End With
End Function