【问题标题】:Excel extracting text into columnsExcel将文本提取到列中
【发布时间】:2020-10-30 09:33:24
【问题描述】:

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

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

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

【问题讨论】:

  • 你有哪个版本的excel?

标签: excel vba text split substring


【解决方案1】:

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

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

【讨论】:

  • 好主意 + 拉伸原始字符串并在之后重新调整它们。然而,第 2 行及以下行似乎包含前缀字符串“姓名:”、“地址:”和“年龄:”,而不是用“”代替它们。 - 仅供参考,通过过滤添加了 VBA 数组方法。
【解决方案2】:

如果您不介意使用公式代替 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 / Power Pivot / Power BI 中执行此操作的任何其他方式?不幸的是,我无法访问 0365 版。
  • @WojciechUrjasz,当然。虽然我添加了FILTERXML 路由的非 O365 版本。
  • 值得一提的是,JvDV 在Extract substrings using FilterXML() 上发布了对FilterXML XPath 案例的出色概述。 FYI 发布了另一种 VBA 方法。 @JvdV
【解决方案3】:

VBA 数组方法

除了上面的有效答案之外,这篇迟到的帖子还演示了数组方法和双重拆分:

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

由于如何使用Split() 函数的方法并不广为人知, 输出限制为 2 个标记,如[2] 部分所示,请查看

语法

拆分(表达式,[分隔符,[限制,[比较]]])

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多