在多个空间拆分列

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)

分别用于 B1C1

编辑#2:

Siddharth 说得有道理。最好使用:

=MID(TRIM(A1),FIND(" ",TRIM(A1))+1,LEN(A1))

而不是:

=MID(TRIM(A1),FIND(" ",TRIM(A1))+1,99)