【问题标题】:How to concatenate values in multiple cells based on a condition?如何根据条件连接多个单元格中的值?
【发布时间】:2015-03-17 12:45:50
【问题描述】:

我需要搜索一行单元格,对于每个包含特定值的单元格,从上面的单元格返回值。

例如,考虑以下情况

+---+--------+--------+--------+--------+--------+----------+
|   |   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

这个可以吗?

谢谢

【问题讨论】:

    标签: excel excel-formula lookup textjoin


    【解决方案1】:

    编写自己的 UDF

    Original solution.

    摘自文章

    1. 通过单击开发人员选项卡上的Visual Basic或使用Alt+F11组合打开VBA编辑器
    2. 通过右键单击左上角的 Microsoft Excel 对象 并从上下文菜单中选择 Insert->Module 来创建新模块。
    3. 插入以下代码

    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,",")
    

    【讨论】:

      【解决方案2】:

      我找到了一个简单、可扩展的解决方案,它使用数组公式连接多个满足特定条件的单元格。

      应用于您的示例,粘贴到单元格 F2:

      =TEXTJOIN(",", TRUE, IF(B3:F3 = "YES", B$2:F$2, ""))
      

      点击ctrl+shift+enter数组公式的形式输入,并复制单元格F3--F4。

      这个工作的原因留给读者作为练习。这很清楚,但我更喜欢“魔术”。

      我希望这对遇到类似问题的人有所帮助。

      【讨论】:

      • 请注意,TEXTJOIN 仅在 Excel 2016 和 Office 365 中可用。
      【解决方案3】:

      在 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 是对第一行即标题的绝对引用。

      最后,我用CONCATENATE语句封装了所有五个IF语句。

      希望这会有所帮助。

      【讨论】:

      • 谢谢泽山。这很好用,但我想知道是否有更容易管理的解决方案 - 也许使用数组公式。我从没想过在我的原始帖子中提到它,但我的电子表格有几百列。这意味着几百个 IF 语句。如果我在任何时候添加或删除一列(这会经常发生),我将需要不断更新所有 IF 语句。
      • 我会检查并回复您。
      猜你喜欢
      • 2021-08-26
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多