1. 程式人生 > 其它 >EXCEL 筆記 --不定時更新

EXCEL 筆記 --不定時更新

用以記錄實際工作中遇到的需求解決方案

EXCEL 筆記

用以記錄實際工作中遇到的需求解決方案,主要是用作備份以便後期查詢,不負責回答疑問
別問我公式什麼意思,有的我也不知道,能用就行

2021-09-01

vlookup 陣列

需求

如下圖,A列是診斷,有合併書寫的情況,需要將每個診斷單獨匹配標準名稱,並在B列給出每個診斷對應的ICD編碼

方法一

首先想到的是VBA,自己寫一個函式,呼叫即可。程式碼如下

Public Function ArrVlookup(OriText As String, splitsymbol As String, table_array_arr As String, col_index_num_arr As Integer, Optional range_lookup_arr As Boolean = 0, Optional otherfile As Boolean = 1)
'''
'
'OriText: 待分割字串
'splitsymbol: 分割字元
'otherfile: 傳遞給vlookup 的range_lookup_arr引數處理方法不同
'其他引數均與vlookup函式的引數相同
'
'''
Dim result(), vlookup_result As String

vlookup_result = ""
OriText = Replace(OriText, "|", ",") '支援使用 | 分組,此處將 | 替換為英文逗號,後面統一分組
arr = split(OriText, splitsymbol)
end_arr = UBound(arr)
ReDim result(0 To end_arr)


Select Case otherfile
Case False
    Workbook = ActiveWorkbook.Name
    Worksheet = ActiveSheet.Name
    cell_arr = Replace(table_array_arr, "$", "")
Case True
    workbook_s = InStr(table_array_arr, "[")
    workbook_e = InStr(table_array_arr, "]")
    Workbook = Mid(table_array_arr, workbook_s + 1, workbook_e - workbook_s - 1)
    worksheet_e = InStr(table_array_arr, "!")
    Worksheet = Mid(table_array_arr, workbook_e + 1, worksheet_e - workbook_e - 1)
    workrange = Right(table_array_arr, Len(table_array_arr) - worksheet_e)
    cell_arr = Replace(workrange, "$", "")
End Select


For i = 0 To end_arr
    result(i) = Application.VLookup(arr(i), Workbooks(Workbook).Worksheets(Worksheet).Range(cell_arr), col_index_num_arr, range_lookup_arr)
    On Error Resume Next
Next i


For j = 0 To end_arr
    If j = 0 Then
        vlookup_result = result(j)
    Else
        vlookup_result = vlookup_result & "," & result(j)
    End If
Next j

ArrVlookup = vlookup_result

End Function

然後直接在excel表格中呼叫ArrVlookup即可,注意引數range_lookup_arr需要用英文雙引號引起來作為字串使用,這一點與內建的vlookup不同。

方法二

網上搜了一下關於vlookup在陣列中使用的文章,找到如下教程 http://excel880.com/blog/archives/11253 裡面提到的公式如下:

=VLOOKUP(T(IF({1},I3:I7)),$C$3:$F$10,4,0)

其中,I3:I7是作為陣列使用,因此,只需要將此處稍作修改即可。

將A列按,分割後作為陣列,替換I3:i7即可,但excel內建函式中似乎沒有相關函式,所以,還得借用VBA中的 split

方法。

Public Function Split_arr(text As String, delimiter As String)
Split_arr = split(text, delimiter)
End Function

VLOOKUP在使用陣列後返回的仍然是陣列,不符合結果在同一個單元格的要求,所以,用TEXTJOIN連線一下即可。

最終公式如下:

=TEXTJOIN(",",0,VLOOKUP(T(IF({1},Split_arr(C264,","))),[ICD國標版.xlsx]對照用!$D:$F,3,0))