EXCEL 筆記 --不定時更新
阿新 • • 發佈:2021-09-03
用以記錄實際工作中遇到的需求解決方案
方法。
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))