tôi coi là lựa chọn thay thế sau:
- VLOOKUP mảng công thức
- Đội hình thi đấu/INDEX
- VBA (sử dụng một cuốn từ điển)
Việc thực hiện so là:
- VLOOKUP công thức đơn giản: ~ 10 phút s
- VLOOKUP mảng công thức: ~ 10 phút (1: 1 hiệu suất index)
- Đội hình thi đấu/INDEX: ~ 2 phút (5: 1 chỉ số hiệu suất)
- VBA (sử dụng một cuốn từ điển): ~ 6 giây (100: chỉ số 1 hiệu suất)
Sử dụng tờ tài liệu tham khảo cùng
1) tấm Lookup: (mảng VLOOKUP thức phiên bản)
A B
1
2 key51359 {=VLOOKUP(A2:A10001;sheet1!$A$2:$B$100001;2;FALSE)}
3 key41232 formula in B2
4 key10102 ... extends to
... ... ...
99999 key4153 ... cell B100001
100000 key12818 ... (select whole range, and press
100001 key35032 ... CTRL+SHIFT+ENTER to make it an array formula)
100002
2) tấm Lookup: (trận đấu + chỉ số phiên bản)
A B C
1
2 key51359 =MATCH(A2;sheet1!$A$2:$A$100001;) =INDEX(sheet1!$B$2:$B$100001;B2)
3 key41232 =MATCH(A3;sheet1!$A$2:$A$100001;) =INDEX(sheet1!$B$2:$B$100001;B3)
4 key10102 =MATCH(A4;sheet1!$A$2:$A$100001;) =INDEX(sheet1!$B$2:$B$100001;B4)
... ... ... ...
99999 key4153 =MATCH(A99999;sheet1!$A$2:$A$100001;) =INDEX(sheet1!$B$2:$B$100001;B99999)
100000 key12818 =MATCH(A100000;sheet1!$A$2:$A$100001;) =INDEX(sheet1!$B$2:$B$100001;B100000)
100001 key35032 =MATCH(A100001;sheet1!$A$2:$A$100001;) =INDEX(sheet1!$B$2:$B$100001;B100001)
100002
3) tấm Lookup: (vbalookup phiên bản)
A B
1
2 key51359 {=vbalookup(A2:A50001;sheet1!$A$2:$B$100001;2)}
3 key41232 formula in B2
4 key10102 ... extends to
... ... ...
50000 key91021 ...
50001 key42 ... cell B50001
50002 key21873 {=vbalookup(A50002:A100001;sheet1!$A$2:$B$100001;2)}
50003 key31415 formula in B50001 extends to
... ... ...
99999 key4153 ... cell B100001
100000 key12818 ... (select whole range, and press
100001 key35032 ... CTRL+SHIFT+ENTER to make it an array formula)
100002
NB: Đối với một số lý do (bên ngoài nội bộ), các vbalookup thất bại để trả lại hơn 65536 dữ liệu cùng một lúc. Vì vậy, tôi đã phải chia công thức mảng thành hai.
và mã VBA liên quan:
Function vbalookup(lookupRange As Range, refRange As Range, dataCol As Long) As Variant
Dim dict As New Scripting.Dictionary
Dim myRow As Range
Dim I As Long, J As Long
Dim vResults() As Variant
' 1. Build a dictionnary
For Each myRow In refRange.Columns(1).Cells
' Append A : B to dictionnary
dict.Add myRow.Value, myRow.Offset(0, dataCol - 1).Value
Next myRow
' 2. Use it over all lookup data
ReDim vResults(1 To lookupRange.Rows.Count, 1 To lookupRange.Columns.Count) As Variant
For I = 1 To lookupRange.Rows.Count
For J = 1 To lookupRange.Columns.Count
If dict.Exists(lookupRange.Cells(I, J).Value) Then
vResults(I, J) = dict(lookupRange.Cells(I, J).Value)
End If
Next J
Next I
vbalookup = vResults
End Function
NB: Scripting.Dictionary
đòi hỏi một referenc để Microsoft Scripting Runtime
mà phải thêm bằng tay (Tools-> đơn Tài liệu tham khảo trong cửa sổ Excel VBA)
Kết luận:
Trong ngữ cảnh này, VBA sử dụng từ điển nhanh hơn 100 lần so với sử dụng VLOOKUP và nhanh hơn 20 lần so với MATCH/INDEX
với tập dữ liệu lớn như vậy thì Excel có thể không phải là lựa chọn tốt. Sử dụng một cơ sở dữ liệu chuyên nghiệp như * SQL hoặc truy cập MS sẽ tốt hơn nhiều –