我需要搜索一行单元格,并且对于包含特定值的每个单元格,从上面的单元格返回值。
例如,请考虑以下内容
+---+--------+--------+--------+--------+--------+----------+
| | A | B | C | D | E | F |
+---+--------+--------+--------+--------+--------+----------+
| 1 | UK | DE | FR | HK | TW | |
+---+--------+--------+--------+--------+--------+----------+
| 2 | YES | | YES | YES | | |
+---+--------+--------+--------+--------+--------+----------+
| 3 | | YES | | YES | YES | |
+---+--------+--------+--------+--------+--------+----------+
| 4 | YES | | | YES | | |
+---+--------+--------+--------+--------+--------+----------+
所以我想在细胞F2,F3和F4中插入一个公式,这将给出以下结果
F2 = UK,FR,HK
F3 = DE,HK,TW
F4 = UK,HK
可以这样做吗?
由于
答案 0 :(得分:6)
我找到了一个简单,可扩展的解决方案,它使用数组公式来连接满足特定条件的多个单元格。
应用于您的示例,粘贴到单元格F2:
=TEXTJOIN(",", TRUE, IF(B3:F3 = "YES", B$2:F$2, ""))
然后按 ctrl + shift + enter 输入数组公式,并复制细胞F3 - F4。
这个工作的原因留给读者练习。这很清楚,但我更喜欢“魔术”。
我希望这可以帮助任何有类似问题的人。
答案 1 :(得分:2)
在F2中复制粘贴此公式:
=CONCATENATE(IF($A2="YES",A$1&",",),IF($B2="YES",B$1&",",),IF($C2="YES",C$1&",",),IF($D2="YES",D$1&",",),IF($E2="YES",E$1&",",))
并向下拖动列。
说明:
IF($A2="YES",A$1&",",)
IF($B2="YES",B$1&",",)
IF($C2="YES",C$1&",",)
IF($D2="YES",D$1&",",)
IF($E2="YES",E$1&",",)
上面的代码已被重写5次,并且列名已被更改。它检查当前行中的单元格是否为“是”。如果是,那么它将输入'A$1'
列的标题。请注意,$ 1是第一行的绝对引用,即标题。
最后,我使用IF
语句封装了所有五个CONCATENATE
语句。
希望这有帮助。
答案 2 :(得分:1)
UDF:
Function ConcatenateIf(CriteriaRange As Range, _
Condition As Variant, _
ConcatenateRange As Range, _
Optional Separator As String = ",") As Variant
'Update 20150414
Dim xResult As String
On Error Resume Next
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
xResult = xResult & Separator & ConcatenateRange.Cells(i).Value
End If
Next i
If xResult <> "" Then
xResult = VBA.Mid(xResult, VBA.Len(Separator) + 1)
End If
ConcatenateIf = xResult
Exit Function
End Function
以后,如果您在工作簿中启用了宏,则可以使用它。
在您的特定示例中,将以下公式写入F2单元格并在所需范围内复制。
=ConcatenateIf($A2:$E2,"YES",$A$1:$E$1,",")