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

时间:2014-03-25 15:57:05

标签: excel function vba

我有一些数据表明是否已针对特定网站执行特定“服务”(例如鸟类调查),每项服务均为“是”或“否”。

E.G。

  • A栏包含网站名称,例如A,B,C,D和E,A1中的标题为“Site Name”,A2中则为“A”等。

  • B栏包含B1中的“鸟类调查”,B2-B6则包含“是”或“否”。

  • 同样可以列出C,D和E栏中的其他服务,分别说“蝙蝠调查”,“LVI”和“土地注册处”。

  • 在F中我想连接包含“是”的每一行的服务名称。例如。让我们说B2,C2,D2和E2的值是“是”,“是”,“否”和“是”,我希望F2包含鸟类调查,蝙蝠调查。

据我所知,excel中没有可以执行此操作的本机函数,因此我一直在尝试在VBA中创建用户定义的函数。我尝试了两种方法

  • 一个基于将两个范围(列名和“是/否”的行)输入UDF,然后将这些组合成一个数组以应用某种查找标准

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

我以前无法上班。请注意,最后我需要创建一个适用于不同数量服务的UDF,它们不会像本例中那样预先定义。

有什么建议吗?

非常感谢提前。

1 个答案:

答案 0 :(得分: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

鉴于你的问题,它将按如下方式使用:

=ConcatenateIf(B2:E2,"yes",$B$1:$E$1,", ")

初始赠送金额为this link

希望这可以解决问题!!