【问题标题】:Splitting text to columns in Excel在 Excel 中将文本拆分为列
【发布时间】:2015-10-19 00:47:12
【问题描述】:

我在Excel 中有一个列,其中包含以下格式的数据:“乐队名称专辑名称”。我想把这个单元格分成两个——一个用于全大写乐队名称,另一个用于专辑标题。以下是数据中的一些示例:

Column A
ABSORBED Demo '98 
ABSTRACT CELL THEORY Act
ABSTRACT SATAN Elite 7512 
ABSTRACT SATAN Aryan Blitzkrieg Union 
ABSTRACT SATAN Satanic Blood Circle 
ABSTRACT SHADOWS Symphony of Hakel 

按空格分割不起作用,因为乐队的名称中有不同数量的单词。任何帮助将不胜感激。

【问题讨论】:

    标签: excel text cell


    【解决方案1】:

    这是一个公式解决方案。不需要 VBA。

    假设您的列表从单元格 A1 开始,在单元格 B1 中输入以下公式:

    =LEFT(A1,MATCH(,--(CODE(MID(A1,ROW(OFFSET($A$1,,,LEN(A1))),1))<96),)-3)
    

    这是一个数组公式,必须用Ctrl+Shift+Enter确认。

    然后在 C1 单元格中输入:

    =MID(A1,MATCH(,--(CODE(MID(A1,ROW(OFFSET($A$1,,,LEN(A1))),1))<96),)-1,99)
    

    这是一个数组公式,必须用Ctrl+Shift+Enter确认。

    现在选择范围 B1:C1 并根据需要向下复制。

    .

    这是它们的工作原理。我们将讨论第一个公式。

    MID 函数将单元格 A1 的值拆分为单个字符。 CODE 函数返回每个字符的 ASCII 码。我们测试每个代码号,看它是否小于96,即“a”第一个小写字符。

    这为我们提供了一组布尔值(TRUE 或 FALSE),单元格 A1 中的每个字符都有一个布尔值。

    我们通过双一元 (--) 将布尔值转换为 ONES 和 ZEROES。

    我们使用 MATCH 函数在数组中搜索第一个零的位置。

    连续大写字母的结尾是 MATCH 返回的位置之前的三个字符位置。

    就是这样。

    使这一切成为可能的原因是位于由 ROW/OFFSET 组合生成的公式核心的数组。结合 LEN 函数,此组合生成一个类似于 {1;2;3;4;5;6;7;8;9;10;11} 的向量数组。该数组的最后一个也是最大的数字等于单元格 A1 中值的长度。

    .

    更新

    这是一个示例工作簿,显示这些公式适用于问题的示例数据:http://www.excelhero.com/samples/torentino_excelhero.xlsx

    【讨论】:

    • 你好Excel英雄,你能解释一下B1中的公式吗?我很难理解逻辑。谢谢。
    • @Sergio 请参阅我的答案更新后的下部以获得解释。
    • @ExcelHero 谢谢,但由此产生的拆分无法正常工作。我最终得到了两个单元格,但原始单元格中的乐队名称专辑标题在一个单元格中被转换为 BD NA,而另一个单元格中没有专辑标题。
    • @torentino 它有效。这是电子表格,您可以看到:excelhero.com/samples/torentino_excelhero.xlsx
    • @torentino 你能用我的示例工作簿来解决这个问题吗?
    【解决方案2】:

    这样的事情可能会将乐队名称从专辑中分离出来。

    Sub splt()
        Dim rw As Long, p As Long, r As Long, sp As Long, v As Long
        Dim bnd As String, ttl As String, tmp As Variant
    
        With Worksheets("Sheet1")
            For rw = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
                p = 1
                bnd = vbNullString
                ttl = Trim(.Cells(rw, 1).Value2) & Chr(32)
                tmp = Split(ttl)
                For v = LBound(tmp) To UBound(tmp)
                    If UCase(tmp(v)) = tmp(v) Then
                        bnd = Join(Array(bnd, tmp(v)), Chr(32))
                    Else
                        Exit For
                    End If
                Next v
                .Cells(rw, 2) = bnd
                .Cells(rw, 3) = Trim(Right(ttl, Len(ttl) - Len(bnd)))
            Next rw
        End With
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 2018-08-25
      • 1970-01-01
      相关资源
      最近更新 更多