Excel 将文本提取到列中
Excel extracting text into columns
有没有办法从单个单元格中提取数据并按 headers 将其拆分为列。例如,我们在 A1 单元格中有这样的文本:
Name: John
Address: USA, New York
Age: 66
我想将此文本拆分为 headers Name
、Address
、Age
的列,并将数据提取到以下列。我将不胜感激。
如果您不介意使用公式代替 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 的所有版本。按照下面的屏幕截图将 Name
、Address
、Age
放入 B1
、C1
和 D1
单元格,然后将下面的公式放入 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
有没有办法从单个单元格中提取数据并按 headers 将其拆分为列。例如,我们在 A1 单元格中有这样的文本:
Name: John
Address: USA, New York
Age: 66
我想将此文本拆分为 headers Name
、Address
、Age
的列,并将数据提取到以下列。我将不胜感激。
如果您不介意使用公式代替 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 的所有版本。按照下面的屏幕截图将 Name
、Address
、Age
放入 B1
、C1
和 D1
单元格,然后将下面的公式放入 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