所以这对我来说似乎很棘手,但我有一组数据需要拆分成交替的列,我的意思是在下面的例子中,我将 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 词汇表可更快地找到解决方案。