前景提要
之前我們學習了陣列中運用函式match來進行資料的匹配,雖然說我們上一節學習的是判斷是否存在,其實在某種程度上來說,也算是資料的匹配,不過說到資料的匹配,大家一定會首先想到函式中的vlookup,那麼萬能的vlookup函式,是否能夠用在VBA的陣列中呢?
當然可以的,當我們在利用vba的陣列的時候,其實也是可以利用Excel的函式進行資料的匹配的,話不多說,上案例
場景模擬
這個是我們今天的模擬資料,我們假設左邊兩行都是成績表,我們現在需要用VBA陣列的方式來獲得F列這些學生的成績
其實這樣的場景,用vlookup函式絕對是最簡單的,但是考慮到我們實際的操作中環境中,是在vba,所以我們要調整下場景,看看再VBA中,如何來使用這個vlookup函式
程式碼區
Sub test()
Dim arr, arr2, arr3
arr = Range(Cells(1, 1), Cells(26, 2))
arr2 = WorksheetFunction。Transpose(Range(Cells(2, “f”), Cells(6, “f”)))
arr3 = WorksheetFunction。VLookup(arr2, arr, 2, 0)
Range(“G2:G6”) = WorksheetFunction。Transpose(arr3)
End Sub
程式碼看起來並不長,但是似乎感覺每句程式碼有很長,這其中有什麼玄機嘛?
不方,我們先來看看程式碼執行的結果
和VLOOKUP的效果是一樣的,一番操作之後,成功的將結果匹配出來了並且填充到單元格中
程式碼解析
來看看今天的程式碼解析
我們看到程式碼中,一上來就創造了兩個陣列,arr和arr2
arr = Range(Cells(1, 1), Cells(26, 2))
arr2 = WorksheetFunction。Transpose(Range(Cells(2, “f”), Cells(6, “f”)))
arr還是很好理解的,就是直接將A、B兩列的資料直接全部裝到arr中,那麼arr2呢?
看起來似乎有一點複雜,其實我們可以拆開來理解,這裡其實執行了兩個動作,我們來看看第一個動作
動作1:將F列的資料裝入陣列arr2,對應
arr2 = Range(Cells(2, “f”), Cells(6, “f”))
那麼這樣看來,多出來的那一堆程式碼就是動作二了
動作2:將二維陣列轉化成為一維陣列
WorksheetFunction。Transpose
這一點程式碼執行的就是這個效果,
那麼這裡大家肯定會問,為什麼要多此一舉,將二維轉化成為一維陣列的目的又是什麼?
先跳過,我們直接來到下一句程式碼,就是vlookup函式這裡
在陣列中,如果使用vlookup函式的話,那麼有幾點要求留意
資料來源必須要二維陣列
所謂的資料來源,就是AB兩列的資料,如果你只有一列資料,那麼只有一列在陣列中也是一個二維陣列
2。匹配值必須是一維陣列
這就是上面我們為什麼要將二維轉化成為一維的原因,因為匹配值必須是一個一維陣列,在陣列的概念中,一列資料裝到陣列中,哪怕只是一列,也是一個二維陣列,需要利用WorksheetFunction。Transpose將它轉化成為一維陣列,我們可以看看arr2在轉置前後有什麼不同
我們將兩個步驟分開來,對應的結果是不同的,arr22是一維陣列,而arr2則是二維陣列,留意到他們的座標會有不同,有兩個數字的,很明顯是一個二維陣列
瞭解了這一點之後,後面的就是vlookup函式的匹配了,這點對大家來說就很簡單了。