问题描述
我在电子表格中有一堆条目,我想分成两列。
数据看起来像这样:
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
尝试使用Excel的“文本转列”功能,似乎没有一种方法可以指定多个字符作为分隔符,并且如果我仅使用一个空格,那么也会产生产品名称拆分的问题。
我写了一个小宏来为我做这件事(见下文),但是我觉得我可能会使事情变得过于复杂。有没有更简单的方法可以做到这一点?我的方法是否有任何明显的方法可能失败?我对正则表达式不太熟悉,所以我不确定我选择的模式是否是最好的...
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
解决方法
您的数据具有很好的固定格式。在单元格 B1 中输入:
,而不是TextToColumns或VBA。=LEFT(A1,6)
并在 C1 中使用:
=MID(A1,20,99)
EDIT#1:
对于非常规数据,请使用:
=LEFT(A1,FIND(" ",A1)-1)
=MID(TRIM(A1),TRIM(A1))+1,99)
分别用于 B1 和 C1 。
EDIT#2:
Siddharth 有一个要点。最好使用:
=MID(TRIM(A1),LEN(A1))
而不是:
=MID(TRIM(A1),99)
,
是的,它更简单,更快。
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)
Next
ws.Range("A2:B" & ws.Range("A2").End(xlDown).Row) = output_