在Excel(VBA)中拆分字符串

3
我目前正在使用这段代码(从这里的另一个用户那里得到)来查找B1列中的每个单元格,并找出其中包含";"的单元格,例如"hello;goodbye"。该代码将在";"处分割单元格,并将"goodbye"直接放在"hello;"下面的全新行中。
现在我需要的是...如果一个单元格包含多个 ";"(例如"hello;goodbye;yo;hi;hey"),则它将在每个";"处分割,而不仅仅是第一个,然后将每个分割后的内容移动到新行中并排列在一起...
我需要做哪些修改?
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

你已经拥有它了。它被分割成了 saItem 数组(请注意,你的代码已经检索到了 saItem(0)saItem(1))。你所要做的就是迭代数组元素,在每个元素上调用 Trim$ 并将它们放入正确的行中(就像你的代码已经为第一个元素所做的那样)。 - Ken White
3
如果您有答案,请将其放入答案框中并从问题中删除,然后将其标记为答案。 - JimmyPena
2个回答

7

我知道这与您所拥有的接近,但我建议您使用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

小的修改是使用“2”代替“B”。如果您使用的是cells()而不是Range(),那么也可以走到底 :)


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接