Excel 只要单元格中有内容,就可以使用字符串拆分器

Excel 只要单元格中有内容,就可以使用字符串拆分器,excel,excel-2007,vba,Excel,Excel 2007,Vba,我有这个代码来分割字符串。当前,如果计数器等于存在数据的行数,它将正常运行。但是,行数是可变的。如何使for循环在有数据的情况下运行 Sub SplitToColumns() Range("A1").Select For Counter = 0 To 100 Step 1 Selection.TextToColumns Destination:=ActiveCell, DataType:=xlDelimited, _ TextQuali

我有这个代码来分割字符串。当前,如果计数器等于存在数据的行数,它将正常运行。但是,行数是可变的。如何使for循环在有数据的情况下运行

Sub SplitToColumns()

    Range("A1").Select
    For Counter = 0 To 100 Step 1

        Selection.TextToColumns Destination:=ActiveCell, DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _
            Tab:=False, Semicolon:=False, Comma:=True, Space:=False, _
            Other:=False, _
            FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), _
            TrailingMinusNumbers:=True
        ActiveCell.Offset(1, 0).Select
    Next Counter
End Sub
大概是这样的:

获取列A中最后填充的行的行号。(替换为您选择的列)。然后在for循环中使用该行号,但从1开始,而不是从零开始。如果不再需要,请删除debug.print

Sub SplitToColumns()
Dim rowCount As Long
rowCount = Cells(rows.Count, "A").End(xlUp).Row
Debug.Print rowCount

    Range("A1").Select
    For Counter = 1 To rowCount Step 1

        Selection.TextToColumns Destination:=ActiveCell, DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _
            Tab:=False, Semicolon:=False, Comma:=True, Space:=False, _
            Other:=False, _
            FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), _
            TrailingMinusNumbers:=True
        ActiveCell.Offset(1, 0).Select
    Next Counter
End Sub
还有其他几种方法可以提高代码的效率。例如,在执行TextToColumns操作之前,不需要选择单元格。事实上,您可以在一系列单元格上执行TextToColumns,而不需要遍历该范围内的所有单元格

使用上述技术获取最后一行的行号,然后构建一个范围,从A1开始,扩展到a列,即最后填充的行号

然后在整个范围内一次性执行TextToColumns。比循环快得多

Sub SplitToColumns()
    Dim rowCount As Long
    Dim ws As Worksheet

    '~~> Change this to the relevant sheet
    Set ws = ThisWorkbook.Sheets("Sheet1")

    With ws
        rowCount = .Cells(.Rows.Count, "A").End(xlUp).Row

        .Range("A1:A" & rowCount).TextToColumns _
            Destination:=.Range("A1"), _
            DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, _
            ConsecutiveDelimiter:=False, _
            Tab:=False, _
            Semicolon:=False, _
            Comma:=True, _
            Space:=False, _
            Other:=False, _
            FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), _
            TrailingMinusNumbers:=True
    End With
End Sub

+我更喜欢第二套代码。(没有
.Activate
):)也不赞成使用
。在循环中选择
。事实上不赞成使用
。请选择
。)另外,
循环的
中的
步骤1
不是必需的…谢谢,Sid。重新激活:如果在工作表模块中使用,TextToColumns的结果将放在活动单元格所在的任何位置(至少Excel 2013在我的测试中是这样做的)。因此激活A1。请在不使用的情况下尝试,并在运行之前选择另一个单元格。如果为True,则需要在
目的地:=
:)中指定确切的目的地。我对您的代码做了一个小更改。如果你不高兴,请随时回滚更改。现在,无论哪个工作表处于活动状态,它都将只将结果输出到正确的工作表。:)“那很好,”悉达多说。我通常只在工作表模块中运行简单的东西,因为它的准备工作更少。晚上9点以后我就懒了。。。。。。