如何将“A,B,C”和“X,Y,Z”等列拆分并分配为“A,X,B,Y,C,Z”?

如何将“A,B,C”和“X,Y,Z”等列拆分并分配为“A,X,B,Y,C,Z”?

所以这对我来说似乎很棘手,但我有一组数据需要拆分成交替的列,我的意思是在下面的例子中,我将 A 列拆分为 CE 和 G 等,具体取决于单元格中有多少组数据,用逗号分隔,然后将 B 列分隔成交替的列 DF 和 H 等

    | Column A | Column B | Column C | Column D | Column E | Column F | Column G |Column  H |
    | A, B, C  | X, Y, Z  | A        | X        | B        | Y        | C        | Z        |

类似上述内容,我的最终目标是实现

   |     Column J    |
   |A, X, B, Y, C, Z |

如果有人能帮忙我将不胜感激

答案1

如果您愿意使用 VBA,这将是一个相对简单的解决方案。是的,它使用 VBA,但我认为它比使用命名范围的解决方法更容易遵循。代码如下。您可以在工作表中使用类似 的函数调用此函数=BlendCells(", ",A2,B2)。第一个参数是,strDelimiter它允许您输入文本的分隔方式。在您的示例中,这将是一个逗号和一个空格。接下来的两个参数是您想要混合的两个单元格。

Option Explicit

Public Function BlendCells(strDelimiter As String, Range1 As Range, Range2 As Range) As String

    'Declarations
    Dim arr1() As String
    Dim arr2() As String
    Dim i As Long

    'Setup each array
    arr1 = Split(Range1.Value, strDelimiter)
    arr2 = Split(Range2.Value, strDelimiter)

    'Blend the text
    For i = Application.Min(LBound(arr1), LBound(arr2)) To Application.Max(UBound(arr1), UBound(arr2))
        If i <= UBound(arr1) Then BlendCells = BlendCells & arr1(i) & strDelimiter
        If i <= UBound(arr2) Then BlendCells = BlendCells & arr2(i) & strDelimiter
    Next

    'Trim the results
    BlendCells = Left(BlendCells, Len(BlendCells) - Len(strDelimiter))

End Function

答案2

要将子字符串放入各个列中,您可以使用:

C1:  =INDEX(TRIM(MID(SUBSTITUTE(OFFSET($A$1,0,MOD(COLUMNS($A:A)+1,2)),",",REPT(" ",99)),{1,99,198},99)),MOD(COLUMNS($A:A)-1,3)+1)

并填充至 I1 左侧。

或者,您也可以使用数据/文本到列工具,以逗号作为分隔符。

为了获得最终结果,您可以连接各个列:

=B1 & "," & C1 & "," & D1 & "," & E1 & "," & F1 & "," & G1 & "," & H1 & "," & I1

或者,如果您确实不需要单独的列,则可以使用单个公式:

J1: =CONCATENATE(
INDEX(TRIM(MID(SUBSTITUTE(A1,",",REPT(" ",99)),{1,99,198},99)),1),",",
INDEX(TRIM(MID(SUBSTITUTE(B1,",",REPT(" ",99)),{1,99,198},99)),1),",",
INDEX(TRIM(MID(SUBSTITUTE(A1,",",REPT(" ",99)),{1,99,198},99)),2),",",
INDEX(TRIM(MID(SUBSTITUTE(B1,",",REPT(" ",99)),{1,99,198},99)),2),",",
INDEX(TRIM(MID(SUBSTITUTE(A1,",",REPT(" ",99)),{1,99,198},99)),3),",",
INDEX(TRIM(MID(SUBSTITUTE(B1,",",REPT(" ",99)),{1,99,198},99)),3))

如果段数超过三,只需扩展数组常量和连接公式即可。如果段数可变,VBA 解决方案会更简单,具体取决于您想要什么;数据的性质、输出的位置等。

答案3

如果您想在不使用 VBA 的情况下实现它,这并不是一件容易的事。

一种可能的解决方案是在命名范围内使用几个数组公式:

  • 选择任意单元格第一行
  • 打开Formulas功能区选项卡 >Name Manager对话框 ( Ctrl+ F3)
  • New...为下列每个公式 插入一个命名范围:
    • 将每一行复制并粘贴到对话框Name:的字段中New Name,然后剪切公式部分并将其粘贴到Refers to:字段中
名称指
separator     =","
special       ="^"
enum          =ROW($1:$10)
each_left_A   =IFERROR(FIND(special, SUBSTITUTE($A1, separator, special, enum)), 999)
each_left_B   =IFERROR(FIND(special, SUBSTITUTE($B1, separator, special, enum)), 999)
each_right_A  =IFERROR(FIND(special, SUBSTITUTE($A1, separator, special, enum + 1)), 999)
each_right_B  =IFERROR(FIND(special, SUBSTITUTE($B1, separator, special, enum + 1)), 999)
nth_str       =MID($A1, each_left_A, each_right_A - each_left_A) & MID($B1, each_left_B, each_right_B - each_left_B)
space         =IF(MID(nth_str, 2, 1)=" ", " ", "")
first_str     =LEFT($A1, each_left_A) & space & LEFT($B1, each_left_B - 1)
  • 然后在输出列中输入以下公式之一(它本身不是一个数组公式,因此只需通过确认ENTER,您可以INDEX根据需要重复多次 - 但大多数enum情况下,额外的索引只会产生空字符串,但如果您的表很大,则会降低性能)

    =first_str & INDEX(nth_str, 1) & INDEX(nth_str, 2)
    =first_str & INDEX(nth_str, 1) & INDEX(nth_str, 2) & INDEX(nth_str, 3) & INDEX(nth_str, 4) & INDEX(nth_str, 5) & INDEX(nth_str, 6) & INDEX(nth_str, 7) & INDEX(nth_str, 8) & INDEX(nth_str, 9) & INDEX(nth_str, 10)
    

    像这样(来自 Excel 2010 的截图):

合并文本截屏

如果需要详细解释所有/部分公式,请告诉我。
另请参阅Excel 词汇表可更快地找到解决方案

相关内容