2017-01-09 86 views
2

我试图电池串分割成不同的细胞在一个excel电子表格,然后复制和细胞分裂与新标题粘贴到一个新的工作表。下面是我想要分裂的图像。Excel中VBA-拆分单元格字符串成单个细胞和细胞复制新表

What I am trying to split

这里就是我想要的目的。 Wanted Outcome

可惜我是新来的StackOverflow,所以我的图片不会显示。如果用户不希望点击链接,我会尝试通过其他方式解释:

我有含有我试图分裂长字符串的各种细胞。 下面是我想拆分的两行的示例。

Setup  | MC 1: 1 x 18 , MC 2: 2 x 23 , MC 3: 2 x 32| 
------------|---------------------------------------------- 
    Microphone | 2 x PHILIP DYNAMI SBMCMD     | 

(其中|代表列断裂)

我想分裂以上以下标题如下所示。

Setup  |  |Speaker|Tables|People|Speaker|Tables|People|Speaker|Tables|People| 
---------------------------------------------------------------------------------- 
      |  | MC1 | 1 | 18 | MC2 | 2 | 23 | MC3 | 2 | 32 | 
-------------------------------------------------------------------------------------- 
      |  |  |  |  |  |  |  |  | 
--------------------------------------------------------------------------------------- 
Microphone |  |Number |Manufc| Model|MdlNum | 
    --------------------------------------------------------------------------- 
      |  | 2 |PHILIP|DYNAMI|SBMCMD | 

以下代码适用于安装行。但它不适用于麦克风行。它设法分割正确的分隔符,但它不会定位包含麦克风数据的正确行。

Sub Sample() 

Dim MYAr, setup 
Dim MicAr, Mic 
Dim ws As Worksheet, wsOutput As Worksheet 
Dim Lrow As Long, i As Long, j As Long, rw As Long, col As Long, Rrow As Long 

Dim arrHeaders 
Dim arrayHeadersMic 


Set ws = ThisWorkbook.Sheets("Sheet1") '~~> Set this to the relevant worksheet 
'Set wsOutput = ThisWorkbook.Sheets.Add '~~> Add a new worksheet for output 
Set wsOutput = ThisWorkbook.Sheets("Sheet2") 
rw = 2 '<< output starts on this row 
arrHeaders = Array("Speaker", "Tables", "People") 
arrHeadersMic = Array("Number", "Manufacturer", "Model", "Model Number") 

With ws 
    Lrow = .Range("B" & .Rows.Count).End(xlUp).Row '~~> get the last row 
    For i = 1 To Lrow 
     If .Cells(i, 1).Value = "Setup" Then 

      wsOutput.Cells(rw, 1).Value = "Setup" 
      wsOutput.Cells(rw + 3, 1).Value = "Microphone" 

      setup = .Range("B" & i).Value 
      If Len(setup) > 0 Then 'Len Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable. 

       MYAr = SetupToArray(setup) 
       'add the headers 
       wsOutput.Cells(rw, 3).Resize(1, 3).Value = arrHeaders 
       wsOutput.Cells(rw + 3, 3).Resize(1, 4).Value = arrHeadersMic 

       'fill headers across 
       wsOutput.Cells(rw, 3).Resize(1, 3).AutoFill _ 
        Destination:=wsOutput.Cells(rw, 3).Resize(1, UBound(MYAr) + 1) 
       'populate the array 
       wsOutput.Cells(rw + 1, 3).Resize(1, UBound(MYAr) + 1).Value = MYAr 

       'figure out the microphone values here.... 

       Lrow = .Range("B" & .Rows.Count).End(xlUp).Row 


       If .Cells(5, 1).Value = "Microphone" Then 



        setup = 0 
        Mic = .Range("B" & i).Value 
        'If Len(Mic) > 0 Then 

        MicAr = MicToArray(Mic) 

         'fill headers across 
         wsOutput.Cells(rw + 3, 3).Resize(1, 4).AutoFill _ 
         Destination:=wsOutput.Cells(rw + 3, 3).Resize(1, UBound(MicAr) + 1) 'UBound Returns the highest available subscript for the indicated dimension of an array. 

         'populate the array 
         wsOutput.Cells(rw + 4, 3).Resize(1, UBound(MicAr) + 1).Value = MicAr 

        'End If 

       End If 



       rw = rw + 7 
      End If 
     End If 
    Next i 


End With 

End Sub 

Function SetupToArray(v) 
Dim MYAr, i 
v = Replace(v, ":", ",") 
v = Replace(v, " x ", ",") 
MYAr = Split(v, ",") 
'trim spaces... 
For i = LBound(MYAr) To UBound(MYAr) 
    MYAr(i) = Trim(MYAr(i)) 
Next i 
SetupToArray = MYAr 
End Function 

Function MicToArray(w) 
Dim MicAr, i 
w = Replace(w, " x ", " ") 
'w = Replace(w, " ", ",") 
MicAr = Split(w, " ") 



'trimspace 
For i = LBound(MicAr) To UBound(MicAr) 
    MicAr(i) = Trim(MicAr(i)) 
Next i 
MicToArray = MicAr 

End Function 

非常感谢您的帮助!

+0

屏幕截图显示了管道分隔符,但您的示例文本是逗号分隔的:哪个是实际的分隔符? –

+0

道歉@TimWilliams让我们把它作为逗号,我将改变屏幕截图 – smurf

+2

最简单的方法是将所有不同的分隔符替换为单一类型,然后拆分。 –

回答

2

编辑:更新和测试 - 适用于您的“设置”数据

Sub Sample() 

    Dim MYAr, setup 
    Dim ws As Worksheet, wsOutput As Worksheet 
    Dim Lrow As Long, i As Long, j As Long, rw As Long, col As Long 
    Dim arrHeaders 


    Set ws = ThisWorkbook.Sheets("Sheet1") '~~> Set this to the relevant worksheet 
    Set wsOutput = ThisWorkbook.Sheets.Add '~~> Add a new worksheet for output 
    rw = 2 '<< output starts on this row 
    arrHeaders = Array("Speaker", "Tables", "People") 

    With ws 
     Lrow = .Range("B" & .Rows.Count).End(xlUp).Row '~~> get the last row 
     For i = 1 To Lrow 
      If .Cells(i, 1).Value = "Setup" Then 

       wsOutput.Cells(rw, 1).Value = "Setup" 
       wsOutput.Cells(rw + 1, 1).Value = "Microphone" 

       setup = .Range("B" & i).Value 
       If Len(setup) > 0 Then 

        MYAr = SetupToArray(setup) 
        'add the headers 
        wsOutput.Cells(rw, 3).Resize(1, 3).Value = arrHeaders 
        'fill headers across 
        wsOutput.Cells(rw, 3).Resize(1, 3).AutoFill _ 
         Destination:=wsOutput.Cells(rw, 3).Resize(1, UBound(MYAr) + 1) 
        'populate the array 
        wsOutput.Cells(rw + 1, 3).Resize(1, UBound(MYAr) + 1).Value = MYAr 

        'figure out the microphone values here.... 

        rw = rw + 6 
       End If 
      End If 
     Next i 
    End With 

End Sub 

Function SetupToArray(v) 
    Dim MYAr, i 
    v = Replace(v, ":", ",") 
    v = Replace(v, " x ", ",") 
    MYAr = Split(v, ",") 
    'trim spaces... 
    For i = LBound(MYAr) To UBound(MYAr) 
     MYAr(i) = Trim(MYAr(i)) 
    Next i 
    SetupToArray = MYAr 
End Function 
+0

谢谢你的提姆。我一直在尝试使用您的示例,但无法使用当前的代码实现它。我已经使用我所做的更改更新了代码,但得到了运行时错误1004:应用程序定义或对象定义的错误。 发生这种情况后,我改变了以下内容: '写入数组到 ws.output.Cells(rw,col).Resize(1,UBound(arr)+ 1).value = arr – smurf

+0

这是一个(现在固定的)在我的代码中输入错字'ws.output' >> wsOutput' –

+0

Cheers Tim。我对代码进行了更改,现在运行时错误为'1004':应用程序定义或对象定义的错误。我对VBA还很陌生,无法理解错误 – smurf

1
更容易

复制范围到Windows剪贴板,然后使用TSV文本格式(未测试):

Sheet1.Cells.Copy ' copy the range 

With CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") ' this is late bound MSForms.DataObject 
    Dim s As String 
    .GetFromClipboard     ' get the formats from the Windows Clipboard 
    s = .GetText      ' get the "Text" format 
    Application.CutCopyMode = False 

    ' magic 
    s = Replace(s, "MC ", "MC")  ' "MC 1" to "MC1" 
    s = Replace(s, " x ", "|")  ' "1 x 18" to "1|18" 
    s = Replace(s, " , ", "|")  ' "18 , MC" to "18|MC" 
    s = Replace(s, ": ", "|")  ' "MC1: 1" to "MC1|1" 
    s = Replace(s, " ", "|")  ' "2|PHILIP DYNAMI SBMCMD" to "2|PHILIP|DYNAMI|SBMCMD" 

    ' "more magic" 
    s = Replace(s, "Setup" & vbTab, "/Setup||Speaker|Tables|People|Speaker|Tables|People|Speaker|Tables|People/||") 
    s = Replace(s, "Microphone" & vbTab, "/Microphone||Number|manufacturer|Model|Model Num/||") 
    s = Replace(s, "|", vbTab)  ' cells are separated by tab 
    s = Replace(s, "/", vbNewLine) ' rows are separated by new line 

    .SetText s 
    .PutInClipboard 
End With 

Sheet2.PasteSpecial "Text"  ' or Sheet2.Range("A1").PasteSpecial