2011-11-22 121 views
1

我正在使用此代码(来自此处的同伴用户)查找列b1中的每个单元格,并找到包含“;”像“你好;再见”。代码将在“;”分隔单元格并把“再见”直接放在“你好”之下一个全新的行..excel中分割字符串(vba)

我现在需要的是这样的......如果单元格中包含“;” (即“你好;再见;哟;你好;嘿”)它将分裂在每个“;”不只是第一个,然后每个移动到另一个下面的新行...

我需要做什么改变?

Dim r1 As Range, r2 As Range 
Dim saItem() As String 


For Each r1 In ActiveSheet.Range("B1", Cells(Application.Rows.Count, 2).End(xlUp)) 
If InStr(1, r1.Value2, ";") > 0 Then 
saItem = Split(r1.Value2, ";") 
r1 = Trim$(saItem(0)) & ";" 
r1.Offset(1).EntireRow.Insert (xlDown) 
r1.Offset(1) = Trim$(saItem(1)) 
End If 
Next r1 
+0

您已经拥有它。它被分成'saItem'数组(注意你的代码已经检索到'saItem(0)'和'saItem(1)')。你所要做的就是迭代数组的元素,在每个元素上调用'Trim $'并将它们放入正确的行(就像你的代码已经为第一个元素所做的那样)。 –

+3

如果您有答案,请将其放入答案框中,并将其从问题中删除,然后将其标记为答案。 – JimmyPena

回答

3

我找到答案了,在

http://www.excelforum.com/excel-programming/802602-vba-macro-to-split-cells-at-every.html

这是我给出的解决方案:

Sub tgr() 

Dim rindex As Long 
Dim saItem() As String 

For rindex = Cells(Rows.Count, "B").End(xlUp).Row To 1 Step -1 
    If InStr(Cells(rindex, "B").Value, ";") > 0 Then 
     saItem = Split(Cells(rindex, "B").Value, ";") 
     Rows(rindex + 1 & ":" & rindex + UBound(saItem)).Insert 
     Cells(rindex, "B").Resize(UBound(saItem) + 1).Value =  WorksheetFunction.Transpose(saItem) 
    End If 
Next rindex 

End Sub 
5

我知道它接近你的,但我想建议你使用Application.ScreenUpdating。这将节省相当多的时间,特别是在Excel中插入/删除行时。我也想建议你改变变量名称,让它更有意义。

Sub SplitCells() 

Application.ScreenUpdating = False 
Dim strings() As String 
Dim i As Long 

For i = Cells(Rows.Count, 2).End(xlUp).Row To 1 Step -1 
    If InStr(Cells(i, 2).Value, ";") <> 0 Then 
     strings = Split(Cells(i, 2).Value, ";") 
     Rows(i + 1 & ":" & i + UBound(strings)).Insert 
     Cells(i, 2).Resize(UBound(strings) + 1).Value = _ 
     WorksheetFunction.Transpose(strings) 
    End If 
Next 

Application.ScreenUpdating = True 

End Sub 

P.S.较小的改变是使用“B”的“2”点。如果您正在使用的替代范围()细胞(),不妨走一路:)