VBA中调用VLookup

'****************************************************************
'* 函数名:sVlookup
'* 功能:进行批量匹配,是对vlookup函数功能的拓展。该函数为数组函数,使用时请注意。
'* 参数: lookup_value_array  必选,需要匹配的值所在的区域
'*       table_array_key     必选,原始数据中对应匹配的关键值所在的区域
'*       table_array_item    必选,原始数据中需要返回的值所在区域
'* 错误: 计算出错时返回#VALUE!
'*****************************************************************

Public Function sVlookup(lookup_value_array As Range, table_array_key As Range, table_array_item As Range)
Set d = CreateObject("scripting.dictionary")

aRng = Intersect(lookup_value_array, lookup_value_array.Parent.UsedRange)
bRng = Intersect(table_array_key, table_array_key.Parent.UsedRange)
cRng = Intersect(table_array_item, table_array_item.Parent.UsedRange)
'参数格式错误检查
Dim i As Long

Do
If UBound(aRng, 2) > 1 Then
MsgBox "第1个参数只能为单列数据"
Exit Do
End If


If UBound(bRng, 2) > 1 Then
MsgBox "第2个参数只能为单列数据"
Exit Do
End If

If UBound(cRng, 2) > 1 Then
MsgBox "第3个参数只能为单列数据"
Exit Do
End If


If UBound(bRng, 1) <> UBound(cRng, 1) Then
MsgBox "第2个参数与第3个参数行数不一致,检查两列数据"
Exit Do
End If

For i = 1 To UBound(bRng, 1)
    d(bRng(i, 1)) = cRng(i, 1)
Next

Dim arr(), s As Long
s = UBound(aRng, 1)
ReDim arr(1 To s, 1 To 1)
For i = 1 To s
    If d.exists(aRng(i, 1)) Then
        arr(i, 1) = d(aRng(i, 1))
    Else
        arr(i, 1) = "无匹配值"
    End If
Next

sVlookup = arr
Exit Do
Loop

Set d = Nothing
End Function

字典

补充说明

Sub 随便取()
Set d = CreateObject("scripting.dictionary")
'如果要使用字典功能,必须先创建变量,字母d可以自己换
arr = Sheet2.Range("a2:e" & Cells(Rows.Count, 1).End(xlUp).Row)
'这一步创建了一个arr的数组,并将sheet2上的源数据写入数组;
For i = 1 To UBound(arr)
'这里用for…next循环,从1循环到arr数组的最大下标
d(arr(i, 1)) = arr(i, 5)
'往字典里写入源数据,第一列的值为key,第五列的值为item
'这里的1和5都要根据你源数据的实际情况去修改
Next
'n循环完之后,sheet2上的源数据全部写入字典d中
接下来开始做匹配了,后面的代码替代vlookup的功能

For Each rng In Sheet1.[a2:a30620]
'这里创建了rng这个对象变量,并使用for each …next公式,遍历sheet1
上A列的每个单元格
rng.Offset(, 20) = d(rng.Value)
'针对A列的每个单元格,对它往后平移20位的单元格赋值;
'赋的什么值?字典中rng单元格中的值所对应的item
'这里的20也是可以自己修改的,如果要把匹配到的值写在B列中,就改成1
Next
End Sub

上面这段涉及到了数组、两种循环方式,对初学者来说还是比较难理解的,所以改了一个稍微简单一点的版本。

Sub 搞事情()
Set d = CreateObject("scripting.dictionary")
sheets(2).select
For i = 1 To sheet2源数据的行数
d(arr(i, 1)) = arr(i, 5)
Next

sheets(1).select
for i =1 to 30620

if d.exists(cells(i,1).value) then
cells(i,21)=d(cells(i,1).value)
end if

Next
End Sub
Sub 优化()
Set d = CreateObject("scripting.dictionary")
sheets(2).select
temp=cells(rows.count,"A").end(xlup).row
arr=range("a1:e" & temp)
For i = 1 To ubound(arr)
d(arr(i, 1)) = arr(i, 5)
Next

sheets(1).select
temp=cells(rows.count,"A").end(xlup).row
brr=range("a1:a" & temp)
crr=range("u1:u" & temp)

for i=1 to ubound(brr)
if d.exists(brr(i,1)) then
crr(i,1)=d(brr(i,1))
end if
Next

End Sub

来源网络,仅供个人学习

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容