【问题标题】:How to merge rows in a column into one cell in excel?如何将一列中的行合并到excel中的一个单元格中?
【发布时间】:2011-12-29 11:26:22
【问题描述】:

例如

A1:I
A2:am
A3:a
A4:boy 

我想将它们全部合并到一个单元格“Iamaboy”
此示例显示 4 个单元格合并为 1 个单元格,但是我有很多单元格(超过 100 个),我无法使用 A1 & A2 & A3 & A4 逐个键入它们我该怎么办?

【问题讨论】:

  • 他们都是 4 人的垂直组吗?还是你想要一个单元格中的所有 A 列?
  • 考虑到 VBA 中接受的答案,我们是否可以编辑此问题以使其也具有 Excel-VBA 标记?另外,一直有人问questions like this,我想将它们标记为重复,因为这里有答案。

标签: excel vba


【解决方案1】:

我向您介绍我的 ConcatenateRange VBA 函数(感谢 Jean 的命名建议!)。它将采用一系列单元格(任何维度、任何方向等)并将它们合并为一个字符串。作为可选的第三个参数,您可以添加分隔符(如空格或逗号)。

在这种情况下,您可以编写以下代码来使用它:

=ConcatenateRange(A1:A4)

Function ConcatenateRange(ByVal cell_range As range, _
                    Optional ByVal separator As String) As String

Dim newString As String
Dim cell As Variant

For Each cell in cell_range
    If Len(cell) <> 0 Then
        newString = newString & (separator & cell)
    End if
Next

If Len(newString) <> 0 Then
    newString = Right$(newString, (Len(newString) - Len(separator)))
End If

ConcatenateRange = newString

End Function

【讨论】:

  • 这是不必要的,而只需添加一个 = A1&A2&A3&A4 就足够了,添加 A1&" "&A2&" "&A3&""&A4 会在每个单元格的值之间留一个空格。
  • +1 但我会称之为ConcatenateRange!愚蠢的 Excel CONCATENATE 函数不接受范围作为输入,只接受单个单元格的列表作为单独的参数...
  • 谢谢琼!我采纳了你的建议!迈克尔,你没有抓住重点 - 为数百个细胞这样做既乏味又毫无意义。
  • 所有你需要做的是 "=CocatenateRange(A1:A10, CHAR(10))" 通过传递 CHAR(10) 你正在传递换行符。 :)
  • 好东西。用Else newString = newString &amp; (separator &amp; Space(1)) 修改,因为我需要在结果字符串中保留固定宽度。
【解决方案2】:

如果您更愿意在没有 VBA 的情况下执行此操作,可以尝试以下方法:

  1. 将数据保存在单元格 A1:A999(或类似)中
  2. 将单元格 B1 设置为“=A1”
  3. 将单元格 B2 设置为“=B1&A2”
  4. 将单元格 B2 一直复制到 B999(例如,通过复制 B2、选择单元格 B3:B99 并粘贴)

单元格 B999 现在将包含您要查找的串联文本字符串。

【讨论】:

  • 如果要复制值:- 复制 (ctrl+c) 最后一个单元格 (B999),单击空白单元格,然后在“主页”选项卡的“剪贴板”组中的“粘贴”图标下,点击粘贴值。
  • 这很浪费,但有点棒!
  • 这对于一份一次性工作来说一点也不浪费(这类问题通常是这样的)。这是要走的路,因为它允许您查看正在发生的事情,而且您可以轻松地进一步修改连接操作(添加分隔符等)。对于一次性工作,VBA 就像用大锤敲碎坚果。
  • 这不适用于大型数据集。 (内存不足)
  • 这是天才。
【解决方案3】:

在简单的情况下,您可以使用不需要创建函数或将代码复制到多个单元格的 next 方法:

  1. 在任何单元格中写入下一个代码

    =Transpose(A1:A9) 
    

其中 A1:A9 是您要合并的单元格。

  1. 不离开手机按F9

之后,单元格将包含字符串:

={A1,A2,A3,A4,A5,A6,A7,A8,A9}

来源:http://www.get-digital-help.com/2011/02/09/concatenate-a-cell-range-without-vba-in-excel/

更新:一部分可能不明确。不离开单元格意味着让您的单元格处于编辑器模式。或者,您可以在单元格编辑器面板中按 F9(通常可以在电子表格上方找到)

【讨论】:

  • 不管是什么,这是个好主意,但它对我不起作用。我假设因为我的文本中有很多特殊字符,所以它没有将它们组合成正确的输出。我最终手动输入 a1&b1&c1&......
  • 克里斯,这个解决方案的一个奇怪之处在于,在按 F9 之前,您必须将注意力集中在单元格上。 “保持焦点”是指让您的编辑器光标闪烁并能够继续输入文本。
  • 在 Mac 版本的 excel 上按 F9 不起作用。
【解决方案4】:

我使用CONCATENATE 方法获取列的值并用引号将它们括起来并在它们之间加上列,以便快速填充SQL 语句的WHERE IN () 子句。

我总是只输入=CONCATENATE("'",B2,"'",","),然后选择它并将其向下拖动,这将创建=CONCATENATE("'",B3,"'",",")=CONCATENATE("'",B4,"'",",") 等,然后突出显示整列,将粘贴复制到纯文本编辑器并在需要时粘贴回来,从而剥离行分离。它有效,但同样,就像一次性交易一样,对于一直需要它的人来说,这不是一个好的解决方案。

【讨论】:

    【解决方案5】:

    使用 VBA 已有的Join 函数。 VBA 函数未在 Excel 中公开,因此我将 Join 包装在一个公开其功能的用户定义函数中。最简单的形式是:

    Function JoinXL(arr As Variant, Optional delimiter As String = " ")
        'arr must be a one-dimensional array.
        JoinXL = Join(arr, delimiter)
    End Function
    

    示例用法:

    =JoinXL(TRANSPOSE(A1:A4)," ") 
    

    作为数组公式输入(使用 Ctrl-Shift-Enter)。


    现在,JoinXL 只接受一维数组作为输入。在 Excel 中,范围返回二维数组。在上面的示例中,TRANSPOSE 将 4×1 二维数组转换为 4 元素一维数组(这是TRANSPOSE 在输入单列二维数组时的记录行为) .

    对于水平范围,你必须做一个双 TRANSPOSE:

    =JoinXL(TRANSPOSE(TRANSPOSE(A1:D1)))
    

    内部 TRANSPOSE 将 1×4 二维数组转换为 4×1 二维数组,然后将外部 TRANSPOSE 转换为预期的 4 元素一维数组。

    TRANSPOSE 的这种用法是在 Excel 中将 2D 数组转换为 1D 数组的一种众所周知的方法,但它看起来很糟糕。更优雅的解决方案是将其隐藏在 JoinXL VBA 函数中。

    【讨论】:

    • 在大表中,这个函数比@aevanko 的函数快很多。
    【解决方案6】:

    对于 Mac 上的 Excel 2011,情况有所不同。我是分三步完成的。

    1. 在 A 列中创建一列值。
    2. 在 B 列中,在第一个单元格的右侧,创建一个对列值和“,”使用连接函数的规则。例如,假设 A1 是第一行,则 B1 的公式为 =B1。对于 N 行的下一行,公式为 =Concatenate(",",A2)。你最终得到:
    质量保证 ,塞库利 ,测试 ,应用工具 ,视觉测试 ,测试自动化 ,硒
    1. 在 C 列中创建一个连接所有先前值的公式。因为它是添加剂,所以你最终会得到所有。单元格 C1 的公式是 =B1。对于 N 的所有其他行,公式为 =Concatenate(C1,B2)。你会得到:
    质量保证,塞库利 QA、Sekuli、测试 QA、Sekuli、测试、Applitools QA、Sekuli、测试、Applitools、视觉测试 QA、Sekuli、测试、Applitools、可视化测试、测试自动化 QA、Sekuli、测试、Applitools、可视化测试、测试自动化、Selenium

    列表的最后一个单元格将是您想要的。这与 Windows 或 Mac 上的 Excel 兼容。

    【讨论】:

    • 可以在一个公式中连接三个值。我在 A 列中有值,B1 是 A1 和 B2 的副本,其公式类似于 =CONCATENATE(B1;",";A2)。然后你必须在所有行的单元格中拖动右下点,最后一个值将是结果
    【解决方案7】:

    CONCATENATE 内部,如果您展开它(F9),您可以使用TRANSPOSE,然后删除周围的{}brackets,如this 推荐

    =CONCATENATE(TRANSPOSE(B2:B19))
    

    变成

    =CONCATENATE("Oh ","combining ", "a " ...)
    

    您可能需要在末尾添加自己的分隔符,例如创建一个 C 列并转置该列。

    =B1&" "
    =B2&" "
    =B3&" "
    

    【讨论】:

    • 为精美的 .gif 插图点赞
    【解决方案8】:

    对于那些拥有 Excel 2016(我想是下一个版本)的人,现在直接有 CONCAT 函数,它将取代 CONCATENATE 函数。

    所以在 Excel 2016 中正确的做法是:

    =CONCAT(A1:A4)
    

    这将产生:

    我的男孩

    对于旧版本 Excel 的用户,其他答案是相关的。

    【讨论】:

    【解决方案9】:

    我知道这确实是一个非常古老的问题,但我试图做同样的事情,我偶然发现了一个名为“TEXTJOIN”的 Excel 新公式。

    对于问题,下面的公式解决了问题

    =TEXTJOIN("",TRUE,(a1:a4))
    

    “TEXTJOIN”的签名解释为TEXTJOIN(delimiter,ignore_empty,text1,[text2],[text3],...)

    【讨论】:

    【解决方案10】:

    我需要一个通用的 Concatenate With Separator(因为我没有 TEXTJOIN)所以我写了这个:

    Public Function ConcatWS(separator As String, ParamArray cell_range()) As String
        '---concatenate with seperator
        
        For n = LBound(cell_range) To UBound(cell_range)
            For Each cell In cell_range(n)
                If Len(cell) <> 0 Then
                    ConcatWS = ConcatWS & IIf(ConcatWS <> "", separator, "") & cell
                End If
            Next
        Next n
    End Function
    

    这让我们可以灵活地包含单元格范围:

    =ConcatWS(" ", Fields, E1:G2, L6:M9, O6)
    

    注意:“字段”是命名范围,分隔符可能为空白

    【讨论】:

      猜你喜欢
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      相关资源
      最近更新 更多