【问题标题】:How to Concatenate multiple columns if not empty如果不为空,如何连接多个列
【发布时间】:2014-12-29 13:17:12
【问题描述】:

我想用 | 将 9 列的值连接成 1 列值之间。问题是某些行的某些列是空的,因此使用 =CONCATENATE() 函数非常难看,因为您需要检查 =if(A2="";...) 9 列。

有没有更聪明的方法在 excel 中组合这些多列,只使用其中包含值的单元格?也许使用 VBA?

举例来说,工作表看起来像:

| A    | B    | C | D     | E       | F | G   | H   | I   |
|------+------+---+-------+---------+---+-----+-----+-----|
| lion | king |   |       | animals |   |     |     | dog |
| lion |      |   | queen |         |   | cat | jet |     |

第一行的输出应该是:“lion|king|animals|dog”,第二行的输出应该是:“lion|queen|cat|jet”

有人可以帮忙吗?

非常感谢!

【问题讨论】:

  • 除非您没有显示其他一些数据,否则空单元格不会影响连接功能
  • @SeanCheshire 空单元格不会影响功能,但以 OP 建议的方式使用,仍会产生分隔符 - 导致多个不需要的分隔符。也许OP可以更新问题以澄清这一点。

标签: vba excel excel-2007


【解决方案1】:

您可以使用简单的 UDF:

Function MyConcat(ConcatArea As Range) As String
  For Each x In ConcatArea: xx = IIf(x = "", xx & "", xx & x & "|"): Next
  MyConcat = Left(xx, Len(xx) - 1)
End Function

将上述代码复制到标准代码模块中,并在您的工作表中使用,如下所示:

=MyConcat(A1:J1)

在不使用凌乱的 SUBSTITUTE/IF 函数的情况下,真的没有办法用工作表公式来做到这一点。


编辑(OP 请求)

要删除重复项:

Function MyConcat(ConcatArea As Range) As String
  For Each x In ConcatArea: xx = IIf(x = "" Or InStr(1, xx, x & "|") > 0, xx & "", xx & x & "|"): Next
  MyConcat = Left(xx, Len(xx) - 1)
End Function

【讨论】:

  • 只是出于兴趣:您是否也可以对其进行修改以确保 Concat 中不包含重复项?如果 2 列具有完全相同的值,那么它在字符串中只出现一次?
  • 我需要您的专家意见。在可能的情况下,除了一个问题之外,此解决方案可以正常工作。问题是如果所有单元格值为空,则函数输出为#value。我正在努力解决这个问题。我该如何解决这个问题
  • 嗨@karim_fci,请为您的问题创建一个新帖子,如果需要,您可以添加此问题的链接以帮助解释背景。
【解决方案2】:
Public Function ConcatItNoDuplicities(ByVal cellsToConcat As Range) As String
    ConcatItNoDuplicities = ""
    If cellsToConcat Is Nothing Then Exit Function
    Dim oneCell As Range
    Dim result As String
    For Each oneCell In cellsToConcat.Cells
        Dim cellValue As String
        cellValue = Trim(oneCell.value)
        If cellValue <> "" Then
            If InStr(1, result, cellValue, vbTextCompare) = 0 Then _
                result = result & cellValue & "|"
        End If
    Next oneCell
    If Len(result) > 0 Then _
        result = Left(result, Len(result) - 1)
    ConcatItNoDuplicities = result
End Function

【讨论】:

    【解决方案3】:

    您可以使用这样的 UDF(根据自己的需要进行调整):

    Function Conc(v As Variant, Optional ByVal sDelim As String = "") As String
        Dim vLoop As Variant
        If IsArray(v) Or TypeName(v) = "Range" Then
            For Each vLoop In v
                If Conc = "" Then
                    Conc = vLoop
                ElseIf vLoop <> "" Then
                    Conc = Conc & sDelim & vLoop
                End If
            Next vLoop
        Else
            Conc = CStr(v)
        End If
    End Function
    

    【讨论】:

    • 仅供参考,没有必要让我看到的那样不稳定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    相关资源
    最近更新 更多