Excel實(shí)現(xiàn)返回所有符合條件的值

眾所周知,在使用vlookup查找數(shù)據(jù)時(shí)笨腥,只能返回一個(gè)符合條件的值刨摩。那么如何實(shí)現(xiàn)返回所有符合條件的值呢?


舉例

如果要在B13返回條件為 “性別男” 的所有姓名俭厚,B14返回條件為 “性別女” 的所有姓名户魏,如何使用公式呢?以下有2種VBA自定義函數(shù)可實(shí)現(xiàn)

以下2種VBA代碼都摘自網(wǎng)絡(luò)挪挤,僅對其細(xì)微修改

1叼丑,簡易的,只能返回單條件且相等的值

VBA自定義函數(shù)代碼

Function Contxt_1(a As Range, b As Range, c As String)
    
    '函數(shù)定義Contxt_1(條件區(qū)域扛门,返回值區(qū)域鸠信,條件),簡易版本
    '自定義函數(shù)返回符合匹配條件的所有值论寨,以"星立,"分割爽茴,但結(jié)果會以","開頭绰垂,可用函數(shù)=MID(i,2,LEN(i)-1)去除
    '要求:a和b2個(gè)區(qū)域不能為整列室奏,需為有大小的區(qū)域,且大小相同劲装,為整列時(shí)數(shù)據(jù)計(jì)算量巨大可能導(dǎo)致程序崩潰
    Dim t As String
    '如果a與b的區(qū)域大小不同胧沫,就顯示“錯(cuò)誤”
    If a.Rows.Count <> b.Rows.Count Then Contxt_1 = "錯(cuò)誤": Exit Function
    '在區(qū)域a循環(huán)
    For i = 1 To a.Rows.Count
        '如果在a中找到與c相同的值,就把同一行中的b的內(nèi)容提取出來酱畅,存入變量t中琳袄,同時(shí)插入分隔符"江场,"纺酸。
        If a.Cells(i, 1) = c Then t = t & "," & b.Cells(i, 1)
    Next
    '將變量的值賦給自定義函數(shù)址否,同時(shí)去除開頭的"餐蔬,"
    t = Mid(t, 2, Len(t) - 1)
    Contxt_1 = t

End Function

在B13處輸入公式

=Contxt_1($B$2:$B$9,$A$2:$A$9,A13)

然后回車即可得到結(jié)果,B13下拉公式至B14佑附,如圖:


公式

結(jié)果

公式中“VBA宏文件.xlsm”為WPS保存VBA代碼的文件

2樊诺,復(fù)雜的,能返回符合多條件的值

VBA自定義函數(shù)代碼

Function contxt(ParamArray args() As Variant) As Variant
    '函數(shù)定義Contxt(返回值區(qū)域&分隔符),返回值有為空的也會返回音同,沒有分隔符則直接拼接字符串词爬,如Contxt(1,2,3)返回12
    '在WPS中,單元格區(qū)域在256個(gè)以內(nèi)才行权均,超過了就不能返回?cái)?shù)組顿膨,Office的Excel無此限制
    Dim tmptext As Variant, i As Variant, Cellv As Variant
    Dim Cell As Range
    tmptext = ""
    
    For i = 0 To UBound(args)
        If Not IsMissing(args(i)) Then
            Select Case TypeName(args(i))
                Case "Range"
                    For Each Cell In args(i)
                        tmptext = tmptext & Cell
                    Next Cell
                Case "Variant()"
                    For Each Cellv In args(i)
                        tmptext = tmptext & Cellv
                    Next Cellv
                Case Else
                    tmptext = tmptext & args(i)
            End Select
        End If
    Next i
    '將變量的值賦給自定義函數(shù),同時(shí)去除末尾的分隔符
    tmptext = Mid(tmptext, 1, Len(tmptext) - 1)
    contxt = tmptext
    
End Function

值得注意的是叽赊,“在WPS中恋沃,單元格區(qū)域在256個(gè)以內(nèi)才行,超過了就不能返回?cái)?shù)組”必指,即下行公式單元格區(qū)域B2:B9共8個(gè)單元格囊咏,小于256,因此在WPS可以得到結(jié)果塔橡。經(jīng)過測試在Office的Excel無此限制

在B13處輸入公式

=Contxt(IF(($B$2:$B$9=A13),$A$2:$A$9&"梅割,",""))

然后按鍵盤 ctrl+shift+enter 得到數(shù)組公式,B13下拉公式至B14葛家,如圖:


公式

結(jié)果

2個(gè)自定義函數(shù)返回的結(jié)果是一致的

2.1户辞,contxt函數(shù)最簡單的運(yùn)用

假設(shè),單元格A1=1惦银,A2=2咆课,A3=3
在A4單元格使用數(shù)組公式{=Contxt(A1:A3&"末誓,")},返回值如下


contxt返回值

2.2书蚪,contxt函數(shù)返回符合多條件的值

如果要在B13返回條件為 “性別男喇澡,分?jǐn)?shù)低于60” 的所有姓名,B14返回條件為 “性別女殊校,分?jǐn)?shù)低于60” 的所有姓名晴玖,如何使用公式呢?
在B13處輸入公式

=Contxt((IF(($B$2:$B$9=A13)*($C$2:$C$9<60),$A$2:$A$9&"为流,","")))

然后按鍵盤 ctrl+shift+enter 得到數(shù)組公式呕屎,B13下拉公式至B14,如圖:


公式

結(jié)果

3敬察,使用方法類似vlookup返回所有符合條件的值

Function VLOOKUP_ALL(lookup_value As String, table_array As Range, Optional col_index As Integer = 2) As String
    '函數(shù)定義VLOOKUP_ALL(要查找的值秀睛,查找區(qū)域,匹配值所在列數(shù))返回與要查找的值匹配的所有結(jié)果
    Dim arr, i As Long, delimiter As String, result As String
    arr = table_array.Value
    delimiter = "莲祸,"   '分隔符
    For i = 1 To UBound(arr)
        If arr(i, 1) = lookup_value Then
            result = result & delimiter & arr(i, col_index)
        End If
    Next
    Select Case result
        Case ""
            VLOOKUP_ALL = "#N/A#"  '未查找返回值蹂安,區(qū)分函數(shù)未正確運(yùn)行"#N/A"
        Case Else
            VLOOKUP_ALL = Right(result, Len(result) - Len(delimiter))  '返回結(jié)果,同時(shí)去除開頭的分隔符
    End Select
    
End Function

Sub VLOOKUP_ALL幫助信息()
    '運(yùn)行一次后該幫助信息生效
    Dim 函數(shù)名稱 As String        '函數(shù)名稱
    Dim 函數(shù)描述 As String        '函數(shù)描述
    Dim 參數(shù)(0 To 2) As String     '函數(shù)參數(shù)描述 數(shù)組 個(gè)數(shù)
    
    函數(shù)名稱 = "VLOOKUP_ALL"
    函數(shù)描述 = "擴(kuò)展VLOOKUP锐帜,可以返回所有匹配的值并用“田盈,”分隔,完全匹配"
    參數(shù)(0) = "要查找的值缴阎,單元格允瞧、文本字符串"
    參數(shù)(1) = "查找區(qū)域,同VLOOKUP蛮拔,第1列包含要查找的值"
    參數(shù)(2) = "匹配值所在列數(shù)述暂,同VLOOKUP,數(shù)字"
    
    Call Application.MacroOptions(macro:=函數(shù)名稱, Description:=函數(shù)描述, ArgumentDescriptions:=參數(shù))
    
End Sub

VLOOKUP_ALL()函數(shù)的另一種寫法

Function VLOOKUP_ALL(lookup_value As String, table_array As Range, Optional col_index As Integer = 2) As String
    '函數(shù)定義VLOOKUP_ALL(要查找的值语泽,查找區(qū)域贸典,匹配值所在列數(shù))返回與要查找的值匹配的所有結(jié)果
    Dim arr, i As Long, delimiter As String, srr, n
    arr = table_array.Value
    delimiter = ","   '分隔符
    srr = Array()  '保存匹配的值踱卵,空數(shù)組
    For i = 1 To UBound(arr)
        If arr(i, 1) = lookup_value Then
            n = UBound(srr) + 1
            ReDim Preserve srr(n)  '重定義數(shù)組長度廊驼,但數(shù)據(jù)保留
            srr(n) = arr(i, col_index)
        End If
    Next
    VLOOKUP_ALL = Join(srr, delimiter)  '未查找返回值,返回空值
    
End Function
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惋砂,一起剝皮案震驚了整個(gè)濱河市妒挎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌西饵,老刑警劉巖酝掩,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異眷柔,居然都是意外死亡期虾,警方通過查閱死者的電腦和手機(jī)原朝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來镶苞,“玉大人喳坠,你說我怎么就攤上這事∶荆” “怎么了壕鹉?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長聋涨。 經(jīng)常有香客問我晾浴,道長,這世上最難降的妖魔是什么牍白? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任脊凰,我火速辦了婚禮,結(jié)果婚禮上淹朋,老公的妹妹穿的比我還像新娘笙各。我一直安慰自己钉答,他們只是感情好础芍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著数尿,像睡著了一般仑性。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上右蹦,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天诊杆,我揣著相機(jī)與錄音,去河邊找鬼何陆。 笑死晨汹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贷盲。 我是一名探鬼主播淘这,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼巩剖!你這毒婦竟也來了铝穷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤佳魔,失蹤者是張志新(化名)和其女友劉穎曙聂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鞠鲜,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宁脊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年断国,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榆苞。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡并思,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出语稠,到底是詐尸還是另有隱情宋彼,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布仙畦,位于F島的核電站输涕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏慨畸。R本人自食惡果不足惜莱坎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寸士。 院中可真熱鬧檐什,春花似錦、人聲如沸弱卡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽婶博。三九已至瓮具,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凡人,已是汗流浹背名党。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挠轴,地道東北人传睹。 一個(gè)月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像岸晦,于是被迫代替她去往敵國和親欧啤。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容