我有一个简单的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中的值。
感谢您的帮助!
答案 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)