相信不少人看到標(biāo)題泥从,立即嗤之以鼻句占,VLOOKUP 誰不會(huì)?是的躯嫉,大家都會(huì)纱烘,但用的好的人不多。相信我祈餐,這篇文章一定可以算得上通俗易懂凹炸,又有深度的一篇文章,熟練掌握本文所講內(nèi)容昼弟,一定會(huì)在日常 Excel 處理時(shí)如魚得水啤它。
預(yù)備知識(shí)
Excel 數(shù)組
Excel 用 {a,b,c}
或 {a;b;c}
表示數(shù)組。數(shù)組的主要作用是用于有多個(gè)返回值的公式 (數(shù)組公式)或函數(shù)舱痘。我舉一個(gè)必須用數(shù)組公式的例子变骡。假設(shè)有三個(gè)字段,是按行放置的芭逝,我們想進(jìn)行轉(zhuǎn)置塌碌,像下面這樣:
要求用函數(shù)來實(shí)現(xiàn),不能用選擇性粘貼旬盯。正確的答案如下圖(注意數(shù)組函數(shù)最后必須 CTRL+SHIFT+ENTER
三個(gè)鍵同時(shí)按下台妆,否則錯(cuò)誤 )
注意地址欄是公式有大括號(hào)括起來:{=TRANSPOSE(A2:C2)}
,這個(gè)是 Excel 數(shù)組公式的標(biāo)志胖翰。
我們可以把數(shù)組簡(jiǎn)單地理解為:Excel 把工作表的某區(qū)域 (Range) 值接剩,按照行列整體在內(nèi)存中存儲(chǔ),并可以方便的再將數(shù)組在工作表的 Range 中進(jìn)行顯示萨咳。
來看一個(gè)操作懊缺,印證和理解一下。在 A1:C3
這個(gè)區(qū)域存放著兩筆信息培他,我們用數(shù)組公式將數(shù)據(jù)放到同樣大小的一塊區(qū)域 E1:G3
將光標(biāo)放到編輯欄鹃两,按下 F9,對(duì)舀凛,你沒有看錯(cuò)俊扳,Excel 對(duì)數(shù)組使用的是域,所以用 F9 來解析猛遍,我們發(fā)現(xiàn)馋记,編輯欄變成了這樣:
地址欄的數(shù)據(jù)為:
{"ID","姓名","地址";"001","Stone","Wuhan";"002","Tom","England"}
如果我們這么寫看起來就更清晰了:
{ "ID","姓名","地址";
"001","Stone","Wuhan";
"002","Tom","England"
}
這是一個(gè)二維的數(shù)組碎绎。我們可以看到,行數(shù)據(jù)用逗號(hào)分隔(水平數(shù)組)抗果,列數(shù)據(jù)用分號(hào)分割(垂直數(shù)組)独悴。剛才的操作可以這樣解釋:Excel 把 A1:C3
的數(shù)據(jù)拷貝到數(shù)組溜哮,然后再把數(shù)組的數(shù)據(jù)拷貝到 E1:G3
椒袍。那么秦士,這樣操作的作用是什么呢蒋伦?注意咐汞,這個(gè)是理解后續(xù)函數(shù)操作的關(guān)鍵:我們之所以要用數(shù)組公式把數(shù)據(jù)放到數(shù)組中卒落,就是為了在需要在函數(shù)中要用到 Excel Range 的地方栖秕,也可以用數(shù)組來代替墩划,從而獲得某種靈活性√楦眨現(xiàn)在不理解,不著急乙帮,后面有例子說明杜漠。
數(shù)組的運(yùn)算
如果把某個(gè)值和一個(gè)數(shù)組進(jìn)行運(yùn)算,那么這個(gè)值會(huì)和數(shù)組中的每一個(gè)元素(或稱每一項(xiàng))進(jìn)行運(yùn)算察净。如果將兩個(gè)數(shù)組進(jìn)行運(yùn)算驾茴,那么數(shù)組中的每個(gè)對(duì)應(yīng)位置的元素都會(huì)執(zhí)行某種運(yùn)算。這種運(yùn)算規(guī)律非常像線性代數(shù)的矩陣運(yùn)算氢卡。
舉個(gè)例子:
IF 函數(shù)高級(jí)用法
IF 除了返回一個(gè)單值锈至,還可以返回一個(gè)數(shù)組。此時(shí) IF 函數(shù)的語法如下:
IF({1,0}, range1, range2)
理解:因?yàn)?{1,0}
表示一個(gè)數(shù)組译秦,所以每一個(gè)元素都會(huì)執(zhí)行運(yùn)算峡捡,首先獲取第一個(gè)元素 1, IF 函數(shù)對(duì)不為零的條件筑悴,返回 range1们拙;然后再獲取第二個(gè)元素 0, IF 函數(shù)對(duì) 0,返回 range2阁吝。最后睛竣,函數(shù)再將 range1 和 range2 組合成一個(gè)新的數(shù)組。
舉例: 運(yùn)用 IF 函數(shù)將 ID
和 姓名
兩個(gè)字段改變順序
{=IF({1,0},B1:B3,A1:A3)}
VLOOKUP 基本用法
VLOOKUP 的語法如下:
VLOOKUP(Lookup_value, Table_array, Col_index_num, TRUE/FALSE)
- Lookup_value: 要查找的值
-
Table_array: 查找的范圍求摇。查找的范圍中射沟,
Lookup_value
對(duì)應(yīng)的列(為了表述方便,后面將對(duì)應(yīng)的列稱作關(guān)鍵列)關(guān)鍵列必須處在第一列位置与境。 -
Col_index_num: 查找的列數(shù)验夯。在查找范圍中,要找的值從第一列算起摔刁,所在列的偏移值挥转。比如從 A 算起,如果要在 B 列中查找某值,則列的偏移值為 2绑谣,以此類推党窜。要點(diǎn):查找的列一定要在
Lookup_value
所在列的右邊。 - 第四個(gè)參數(shù)借宵,如果為 FALSE 或者 0幌衣,表示精確匹配,如果為 TRUE 或者 非零值壤玫,表示模糊匹配
文字描述總是難理解一些豁护,可以參考視頻 VLOOKUP 函數(shù) 來學(xué)習(xí)。
接下來介紹 VLOOKUP 函數(shù)的幾個(gè)比較高級(jí)一點(diǎn)的用法欲间。
向左查找
比如我們要根據(jù) ID
來查找姓名楚里,但不巧 姓名
在 ID
的左邊:
我們前面講過使用 IF 函數(shù)構(gòu)造一個(gè)數(shù)組,通過這個(gè)數(shù)組來改變列的位置猎贴,也講過函數(shù)需要使用 Range 的地方班缎,可以使用數(shù)組來代替。將上面兩個(gè)技術(shù)結(jié)合她渴,就可以達(dá)到目的吝梅。
函數(shù)如下:
=VLOOKUP(E2,IF({1,0},B1:B3,A1:A3),2,0)
函數(shù)理解: IF({1,0},B1:B3,A1:A3)
返回一個(gè)數(shù)組,數(shù)組內(nèi)容為:
{"ID","姓名";"001","Stone";"002","Tom"}
所以 VLOOKUP 函數(shù)利用這個(gè)數(shù)組惹骂,可以在第二列中就開到對(duì)應(yīng)姓名苏携。
多條件查找
比如我們要根據(jù)公司
和姓名
兩個(gè)字段來確定人員對(duì)應(yīng)的補(bǔ)助:
方法是將公司和姓名組合成一個(gè)字段,然后再使用 VLOOKUP 函數(shù):
H2 單元格的函數(shù)為:
{=VLOOKUP(E2&F2,IF({1,0},A1:A5&B1:B5,C1:C5),2,0)}
注意這里必須使用公式數(shù)組对粪,同時(shí)按下 CTRL+SHIFT+ENTER
右冻。
VLOOKUP 和 COLUMNS 函數(shù)聯(lián)合起來
比如我們要根據(jù)補(bǔ)助標(biāo)準(zhǔn)來發(fā)放補(bǔ)助,但表的字段太多著拭,補(bǔ)助
在 AJ
列纱扭。如果使用 VLOOKUP 函數(shù),需要計(jì)算 A 到 AJ 的列數(shù)儡遮。
這個(gè)時(shí)候乳蛾,我們可以通過 columns 函數(shù)來幫助我們計(jì)算 A 到 AJ 共計(jì)多少列。columns 函數(shù)的語法如下:
COLUMNS(A:AJ)
結(jié)合 VLOOKUP 函數(shù)用法如下:
=VLOOKUP(AL2,A:AJ,COLUMNS(A:AJ),0)
手寫一個(gè)比 VLOOKUP 更好用的函數(shù)
如果我們覺得 VLOOKUP 函數(shù)復(fù)雜鄙币,或者想按自己的邏輯來增強(qiáng) VLOOKUP 函數(shù)肃叶,我們也可以自定義一個(gè)自定義的函數(shù)。當(dāng)然十嘿,自定義函數(shù)是另一個(gè)話題因惭,可以寫一系列文章。這里绩衷,給出一個(gè)并不是太有意義的實(shí)現(xiàn)蹦魔,比如:
VLOOKUPPRO(lookup_value, range1, range2)
根據(jù) lookup_value 在 range1 中找到 lookup_value, 然后返回 range2 對(duì)應(yīng)的值激率。這樣,不用計(jì)算列數(shù)勿决,一般情況下乒躺,我們也用不到模糊查找,我們使用精確查找低缩。
Public Function VLookupPro(lookup_value As Range, lookup_range As Range, target_range As Range) As Variant
Dim result As Variant
Dim table_array1() As Variant
Dim table_array2() As Variant
Dim table_array As Variant
Dim firstRow As Long
Dim lastRow As Long
Dim usedRng As Range
Set usedRng = lookup_range.Worksheet.UsedRange
firstRow = usedRng.Cells(1, 1).Row
lastRow = usedRng.Cells(usedRng.Rows.Count, 1).Row
' Populate lookup_range and target_range
Dim i As Long
Dim rowCount As Long
rowCount = lastRow - firstRow + 1
ReDim table_array1(1 To rowCount)
ReDim table_array2(1 To rowCount)
For i = 1 To rowCount
table_array1(i) = lookup_range.Cells(i, 1).Value
table_array2(i) = target_range.Cells(i, 1).Value
Next
ReDim table_array(1 To UBound(table_array1), 1 To 2)
For i = 1 To UBound(table_array)
table_array(i, 1) = table_array1(i)
table_array(i, 2) = table_array2(i)
Next
result = Application.WorksheetFunction.VLookup(lookup_value.Value, table_array, 2, False)
VLookupPro = result
End Function
使用方法示例如下: