跨多个工作表

时间:2017-03-24 00:52:42

标签: excel vba excel-vba

我有一个简单的if语句,我想用它将多个(25+)工作表的结果连接到主工作表上的一个单元格中。

如果陈述是

=IF('400'!C23="y",'400'!$C$2,"")

我目前的方法是将多个IF语句压缩成一个非常长的字符串(见下文),但我宁愿创建一个我可以调用的函数(例如,ifconcat()),它使用一个表列表我的标签名称可以浏览每个工作表。任何人都可以帮我这个吗?

IF('400'!C23="y",", "&'400'!$C$2,"")&IF('410'!C23="y",", "&'410'!$C$2,"")&IF('420'!C23="y",", "&'420'!$C$2,"")

目前将从工作表400,410和420返回C2中的值。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

尝试以下UDF。它从许多工作表中获取和连接值matchVal参数匹配。 matchCel是要比较的单元格,getCel是匹配成功的单元格。参数sheetNames是要查找的工作表的可选列表;如果缺少此参数,则从除调用者工作表之外的所有工作表中提取值。

Function FetchSheets(matchVal, matchCel As Range, getCel As Range, ParamArray sheetNames()) As String
    Dim sheetCol As New Collection, sh
    If UBound(sheetNames) < 0 Then
        For Each sh In ThisWorkbook.Worksheets
            If Not sh Is Application.Caller.Parent Then sheetCol.Add sh
        Next
    Else
        For Each sh In sheetNames
            sheetCol.Add Worksheets(sh)
        Next
    End If

    For Each sh In sheetCol
        If sh.Range(matchCel.address).Value2 = matchVal Then
            If Len(FetchSheets) > 0 Then FetchSheets = FetchSheets & ", "
            FetchSheets = FetchSheets & sh.Range(getCel.address).Value2
        End If
    Next
End Function

要将其应用于您的示例,您可以使用以下代码替换您的公式:

=FetchSheets("y", C23, $C$2, "400", "410", "420")

如果要从除主设备之外的所有工作表中提取,请在某个主设备单元格中输入:

=FetchSheets("y", C23, $C$2)