在多个空间拆分列
Splitting column on multiple spaces
我在电子表格中有一堆条目,我想将它们分成两个不同的列。
数据看起来像这样:
102483 STEIN LOKK B4-702
102482 STEIN LOKK BF-701
102413 RINGFUGEKULL 352X353X214 POS 2 Å1
102412 RINGFUGEKULL 352X353X135 POS 1 ÅI
102388 STEIN ISOLER MOSCONI MSB-475 500x250x 76
102387 STEIN ISOLER MOSCONI MSB-475 500x250x152
102384 OVNSFUNDAMENT CRADLE
102383 STEIN PLATE HA-040 KVAL,HSU95
102382 STEIN PLATE HA-039 KVAL,HSU95
102376 OLJE SYNT. MITRA 220
102341 KULL BUNN ÅI/ÅIIC D 3365 x 550 x 490
102291 OLJE 10W-40 HAVOLINE FORMULA 3 DIESEL
102241 FETT MINERALSK PATRON STARPLEX EP 2
102231 OLJE FYRINGSOLJE NR.1 (F)
102211 CALDE SRRIX 14
102141 STEIN ISOLER AAM HIPOR 230X114X 76
102103 STAMPEMASSE ILDFAST AL-85-F
102102 STEIN BORGESTAD INSULATING FIREBRICKS
102101 STAMPEMASSE TYPE T-JUSTERT ELKEM
101964 PAKNING LEX THERMOSEAL PGF-1 LEX Ø12mm
101939 BOKS KOMPENSASJON F/OVN 4 OG 4B 1170
分隔符是产品编号和名称之间的一串space。
尝试使用 Excel 的文本到列功能,似乎没有办法指定多个字符作为分隔符,如果我只使用一个 space它也会产生拆分产品名称的问题。
我写了一个小宏来为我做这件事(见下文),但我觉得我可能把事情弄得太复杂了。有没有更简单的方法来做到这一点?我的方法是否有任何明显的失败方式?我对正则表达式不太熟悉,所以我不确定我选择的模式是否是最好的...
Sub split_column()
Dim ws As Worksheet
Dim regexp As Object
Dim reMatches As Object
Dim c As Range
Call deaktiver
Set regexp = CreateObject("VBScript.RegExp")
Set ws = År_2017
With regexp
.Global = False
.MultiLine = False
.IgnoreCase = False
.Pattern = "^(\d+)\s{2,}(.+)$"
End With
For Each c In ws.Range("A2:A" & ws.Range("A2").End(xlDown).Row)
Set reMatches = regexp.Execute(c.Value2)
If reMatches.Count > 0 Then
c = Trim(reMatches(0).SubMatches(0))
c.Offset(0, 1) = Trim(reMatches(0).SubMatches(1))
End If
Next c
Call reaktiver
End Sub
Private Sub deaktiver()
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
End Sub
Private Sub reaktiver()
Application.EnableEvents = True
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.Calculation = xlCalculationAutomatic
End Sub
是的,有更简单...更快的方法。
Dim input_, output_, i&
input_ = ws.Range("A2:A" & ws.Range("A2").End(xlDown).Row).Value2
ReDim output_(LBound(input_) To UBound(input_), 1 To 2)
For i = LBound(input_) To UBound(input_)
output_(i, 1) = Split(input_(i, 1), " ")(0)
output_(i, 2) = Split(input_(i, 1), " ")(1)
Next
ws.Range("A2:B" & ws.Range("A2").End(xlDown).Row) = output_
您的数据有很好的固定格式。而不是 TextToColumns 或 VBA,在单元格 B1 中输入:
=LEFT(A1,6)
并在 C1 中使用:
=MID(A1,20,99)
编辑#1:
对于non-regular数据,使用:
=LEFT(A1,FIND(" ",A1)-1)
=MID(TRIM(A1),FIND(" ",TRIM(A1))+1,99)
分别用于 B1 和 C1。
编辑#2:
Siddharth 说得有道理。最好使用:
=MID(TRIM(A1),FIND(" ",TRIM(A1))+1,LEN(A1))
而不是:
=MID(TRIM(A1),FIND(" ",TRIM(A1))+1,99)
我在电子表格中有一堆条目,我想将它们分成两个不同的列。
数据看起来像这样:
102483 STEIN LOKK B4-702
102482 STEIN LOKK BF-701
102413 RINGFUGEKULL 352X353X214 POS 2 Å1
102412 RINGFUGEKULL 352X353X135 POS 1 ÅI
102388 STEIN ISOLER MOSCONI MSB-475 500x250x 76
102387 STEIN ISOLER MOSCONI MSB-475 500x250x152
102384 OVNSFUNDAMENT CRADLE
102383 STEIN PLATE HA-040 KVAL,HSU95
102382 STEIN PLATE HA-039 KVAL,HSU95
102376 OLJE SYNT. MITRA 220
102341 KULL BUNN ÅI/ÅIIC D 3365 x 550 x 490
102291 OLJE 10W-40 HAVOLINE FORMULA 3 DIESEL
102241 FETT MINERALSK PATRON STARPLEX EP 2
102231 OLJE FYRINGSOLJE NR.1 (F)
102211 CALDE SRRIX 14
102141 STEIN ISOLER AAM HIPOR 230X114X 76
102103 STAMPEMASSE ILDFAST AL-85-F
102102 STEIN BORGESTAD INSULATING FIREBRICKS
102101 STAMPEMASSE TYPE T-JUSTERT ELKEM
101964 PAKNING LEX THERMOSEAL PGF-1 LEX Ø12mm
101939 BOKS KOMPENSASJON F/OVN 4 OG 4B 1170
分隔符是产品编号和名称之间的一串space。
尝试使用 Excel 的文本到列功能,似乎没有办法指定多个字符作为分隔符,如果我只使用一个 space它也会产生拆分产品名称的问题。
我写了一个小宏来为我做这件事(见下文),但我觉得我可能把事情弄得太复杂了。有没有更简单的方法来做到这一点?我的方法是否有任何明显的失败方式?我对正则表达式不太熟悉,所以我不确定我选择的模式是否是最好的...
Sub split_column()
Dim ws As Worksheet
Dim regexp As Object
Dim reMatches As Object
Dim c As Range
Call deaktiver
Set regexp = CreateObject("VBScript.RegExp")
Set ws = År_2017
With regexp
.Global = False
.MultiLine = False
.IgnoreCase = False
.Pattern = "^(\d+)\s{2,}(.+)$"
End With
For Each c In ws.Range("A2:A" & ws.Range("A2").End(xlDown).Row)
Set reMatches = regexp.Execute(c.Value2)
If reMatches.Count > 0 Then
c = Trim(reMatches(0).SubMatches(0))
c.Offset(0, 1) = Trim(reMatches(0).SubMatches(1))
End If
Next c
Call reaktiver
End Sub
Private Sub deaktiver()
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
End Sub
Private Sub reaktiver()
Application.EnableEvents = True
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.Calculation = xlCalculationAutomatic
End Sub
是的,有更简单...更快的方法。
Dim input_, output_, i&
input_ = ws.Range("A2:A" & ws.Range("A2").End(xlDown).Row).Value2
ReDim output_(LBound(input_) To UBound(input_), 1 To 2)
For i = LBound(input_) To UBound(input_)
output_(i, 1) = Split(input_(i, 1), " ")(0)
output_(i, 2) = Split(input_(i, 1), " ")(1)
Next
ws.Range("A2:B" & ws.Range("A2").End(xlDown).Row) = output_
您的数据有很好的固定格式。而不是 TextToColumns 或 VBA,在单元格 B1 中输入:
=LEFT(A1,6)
并在 C1 中使用:
=MID(A1,20,99)
编辑#1:
对于non-regular数据,使用:
=LEFT(A1,FIND(" ",A1)-1)
=MID(TRIM(A1),FIND(" ",TRIM(A1))+1,99)
分别用于 B1 和 C1。
编辑#2:
Siddharth 说得有道理。最好使用:
=MID(TRIM(A1),FIND(" ",TRIM(A1))+1,LEN(A1))
而不是:
=MID(TRIM(A1),FIND(" ",TRIM(A1))+1,99)