Excel 将文本提取到列中

Excel extracting text into columns

有没有办法从单个单元格中提取数据并按 headers 将其拆分为列。例如,我们在 A1 单元格中有这样的文本:

Name: John
Address: USA, New York
Age: 66

我想将此文本拆分为 headers NameAddressAge 的列,并将数据提取到以下列。我将不胜感激。

如果您不介意使用公式代替 VBA:


与 Excel O365:

B2中的公式:

=TRANSPOSE(TRIM(FILTERXML("<t><s>"&SUBSTITUTE(SUBSTITUTE(A2,":",CHAR(10)),CHAR(10),"</s><s>")&"</s></t>","//s[position() mod 2 = 0]")))

Excel 2013 年或更高版本,O365 除外:

=INDEX(TRIM(FILTERXML("<t><s>"&SUBSTITUTE(SUBSTITUTE($A2,":",CHAR(10)),CHAR(10),"</s><s>")&"</s></t>","//s[position() mod 2 = 0]")),COLUMN(A1))

然后上下拖动...

这有点棘手,但适用于 excel 的所有版本。按照下面的屏幕截图将 NameAddressAge 放入 B1C1D1 单元格,然后将下面的公式放入 B2 单元格然后根据需要向下和向右拖动。

=SUBSTITUTE(TRIM(MID(SUBSTITUTE($A2,CHAR(10),REPT(" ",100)),((COLUMN(A)-1)*100)+1,COLUMN($A)*100)),B1&": ","")

一个VBA数组方法

除了上面的有效答案之外,最近 post 演示了数组方法和双重拆分:

  • 部分 [1] 通过 vbLf 分隔符(等于 Chr(10))、
  • 分成多行
  • 部分 [2] 将拆分限制为两部分(通过“:”)

由于如何通过 输出限制为 2 个标记来使用 Split() 函数并不广为人知,如 [2] 部分所示,有一个看看

语法

Split(expression, [ delimiter, [ limit, [ compare ]]])

Option Explicit

Sub SplitIntoTokens()
With Sheet1                                   ' << change to your project's sheet Code(Name)
    '[0] get string content
    Dim lastRow As Long
    lastRow = .Range("A" & .Rows.Count).End(xlUp).Row
    Dim data As Variant
    data = .Range("A1:D" & lastRow).Value
    
    Dim i As Long
    For i = 2 To UBound(data)
        '[1] split into lines
        '    ~> Name: John|Address: USA, New York|Age: 66
        Dim lines: lines = Split(data(i, 1), vbLf)
        
        '[2] split into 2 parts only and take the 2nd one
        Dim ii As Long, tmp
        For ii = 0 To UBound(lines)
            lines(ii) = Split(lines(ii), ": ", 2)(1)    ' split via ": "-delimiter, 2nd part via index (1)
            data(i, ii + 2) = lines(ii)
        Next
        'Debug.Print Join(lines, "|") optional (display results in VB Editors Immediate Window
    Next
    
    '[3] write array results back to sheet
    .Range("A1").Resize(UBound(data), 4) = data             ' write data
    .Range("A1:D1") = Split("Data,Name,Address,Age", ",")   ' write header (if not existant)
End With
End Sub