用于按行连接的VBA用户定义的函数
我有一些关于特定“服务”(例如鸟类调查)是否已经针对特定站点执行的数据,每个服务是“是”还是“否”。
例如
-
列A包含站点名称,比如A,B,C,D和E,A1中标题为“站点名称”,A2中包含“A”等。
-
B栏包含B1中的“鸟类调查”,然后是B2-B6的“是”或“否”。
-
C,D和E栏中的其他服务同上,分别说“蝙蝠调查”,“LVI”和“土地注册处”。
-
在FI想要连接包含“是”的每一行的服务名称。 EG可以说B2,C2,D2和E2的值是“是”,“是”,“否”和“是”,我想要F2包含鸟类调查,蝙蝠调查。
据我所知,在Excel中没有本地函数可以做到这一点,所以我一直在尝试在VBA中创build一个用户定义的函数。 我已经尝试了两种方法
-
一个基于将两个范围(列名和“是/否”的行)input到UDF中,然后将它们组合成一个数组来应用某种查找标准
-
另一个是从一个是/否范围返回列字母,然后根据列字母从列名select。
我还没有得到任何工作。 请注意,最后我需要创build一个适用于不同数量的服务的UDF,它们不会像本例中那样被预先定义。
有什么build议么?
提前谢谢了。
基于你正在寻找的东西,我发现这个function很久以前,它的工作魅力:
Function ConcatenateIf(CriteriaRange As Range, Condition As Variant, _ ConcatenateRange As Range, Optional Separator As String = ",") As Variant Dim i As Long Dim strResult As String On Error GoTo ErrHandler If CriteriaRange.Count <> ConcatenateRange.Count Then ConcatenateIf = CVErr(xlErrRef) Exit Function End If For i = 1 To CriteriaRange.Count If CriteriaRange.Cells(i).Value = Condition Then strResult = strResult & Separator & ConcatenateRange.Cells(i).Value End If Next i If strResult <> "" Then strResult = Mid(strResult, Len(Separator) + 1) End If ConcatenateIf = strResult Exit Function ErrHandler: ConcatenateIf = CVErr(xlErrValue) End Function
鉴于你的问题,它将被使用如下:
=ConcatenateIf(B2:E2,"yes",$B$1:$E$1,", ")
最初的信贷去这个链接 。
希望这个伎俩!