VBA用户定义函数,用于"按行连接"

vba*_*hon 2 excel vba function

我有一些数据表明是否为特定网站执行了特定的"服务"(例如鸟类调查),每项服务都有"是"或"否".

例如

  • 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中创建用户定义的函数.我尝试了两种方法

  • 一个基于将两个范围(列名和"是/否"的行)提供给UDF,然后将它们组合成一个数组以应用某种查找标准

  • 并且从一个是/否范围返回另一个返回列字母,然后根据列字母从列名称中选择.

虽然我还没能上班.请注意,最后我需要创建一个适用于不同数量服务的UDF,它们不会像本例中那样预先定义.

有什么建议?

提前谢谢了.

Joh*_*tos 7

基于你正在寻找的东西,我很久以前发现了这个功能,并且它有一个魅力:

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
Run Code Online (Sandbox Code Playgroud)

鉴于您的问题,它将使用如下:

=ConcatenateIf(B2:E2,"yes",$B$1:$E$1,", ")
Run Code Online (Sandbox Code Playgroud)

最初的功劳归于此链接.

希望这样做!