我需要搜索一行单元格,对于包含特定值的每个单元格,从上面的单元格返回值。
例如,请考虑以下事项
+---+--------+--------+--------+--------+--------+----------+
| | 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
这能做到吗?
谢谢
我找到了一个简单、可扩展的解决方案,它使用数组公式连接满足特定条件的多个单元格。
应用于您的示例,粘贴到单元格 F2 中:
=TEXTJOIN(",", TRUE, IF(B3:F3 = "YES", B$2:F$2, ""))
并按 按Ctrl + 转移 + 输入 输入为数组公式,然后复制单元格 F3--F4.
这之所以有效,留给读者作为练习。这很清楚,但我更喜欢"魔术"。
我希望这对任何有类似问题的人有所帮助。
编写自己的 UDF
原始解决方案。
文章摘
录- 通过单击"开发工具"选项卡上的"Visual Basic"或使用 Alt+F11 组合打开 VBA 编辑器
- 通过右键单击左上角Microsoft Excel 对象并选择 插入>模块 从上下文菜单中创建新模块。
- 插入以下代码
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,",")
在 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 次,列名也已更改。它检查当前行中的单元格是否具有"YES"。如果是这样,那么它将输入'A$1'
列的标题。请注意,$1 是对第一行(即标题)的绝对引用。
最后,我使用CONCATENATE
语句封装了所有五个IF
语句。
希望这有帮助。