在Excel中拆分字符串(vba)

时间:2011-11-22 17:54:05

标签: excel vba excel-vba replace

我目前正在使用此代码(来自此处的其他用户)查找列b1中的每个单元格并找到包含“;”的单元格像“你好;再见”之类的东西。代码将细胞分裂为“;”并将“再见”直接置于“你好”之下在一个全新的行..

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

我需要做出哪些改变?

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

2 个答案:

答案 0 :(得分:6)

我知道它与你拥有的很接近,但我想建议你使用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”instad。如果你使用的是cell()而不是Range(),那么也可以一直使用:)

答案 1 :(得分: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