0

基本上我正在使用 TextToColumns 函数来分离在同一单元格中用分号分隔的数据。问题是有 2 列数据需要完成此功能,我必须在不覆盖的情况下插入数据。

(轻松一点,第一次使用 VBA 和 excel)这是我目前拥有的:

Sub Button1_Click()
    Dim rng As Range
    Dim sh As Worksheet

    Set sh = Worksheets("Sheet1")
    With sh

        Set rng = .[Q1]
        Set rng = .Range(rng, .Cells(.Rows.Count, rng.Column).End(xlUp))

        num = Application.WorksheetFunction.Max(Columns("P"))

        rng.Offset(0, 1).Resize(1, num).EntireColumn.Insert

        rng.TextToColumns Destination:=rng, DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=True, Comma:=False, Space:=False, Other:=False, _
        FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), TrailingMinusNumbers:=True
    End With

    Set sh2 = Worksheets("Sheet1")
    With sh2
        num2 = Application.WorksheetFunction.Max(Columns("P"))

        Dim lastColumn As Integer

        lastColumn = ActiveSheet.UsedRange.Column - 1 + ActiveSheet.UsedRange.Columns.Count

        MsgBox Replace(Cells(1, lastColumn).Address(False, False), "1", "")

        MsgBox lastColumn

        Set rng = .[W1]
        Set rng = .Range(rng, .Cells(.Rows.Count, rng.Column).End(xlUp))



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

好的,所以我要修复的是在第二部分中将 rng 手动设置为 W1。rng 需要是下一个空列。所以使用 MsgBox 的 lastColumn 确实返回列“W”,但我无法将其设置为 rng(类型不匹配)。哦,num变量设置为我需要插入的列数。我的数据如下所示:

计数 | 带有 ; 的列 数据需要分离 | 带有 ; 的列 数据需要分离

5 | 分号隔开的5组数据| 不在乎,因为这是工作表的结尾

有没有更简单的方法来做到这一点?我什至接近吗?

4

2 回答 2

0

...如果我正确理解您的问题,最简单的解决方案...您为什么不创建一个等于 的第三列Column1 & ";" & Column2,然后在该单列上执行文本到列?

还是我错过了什么?

于 2013-04-17T18:34:28.507 回答
0

假设我正确理解了您的设置,以下代码应该可以工作。

如果从右到左处理数据列,则不必担心插入列时地址引用的变化。这意味着您可以使用单个插入/转换代码块,迭代两个数据地址引用,我假设它们是 Q1and R1

另请注意,我向TextToColumns目标添加了一个偏移量,以避免覆盖原始数据。

Option Explicit

Sub myTextToColumns()
   Dim sh As Worksheet
   Dim rng As Range
   Dim num As Long
   Dim arr As Variant
   Dim i As Long  
   Set sh = Worksheets("Sheet1")
   arr = Array("R1", "Q1")
   num = Application.WorksheetFunction.Max(Columns("P"))
   With sh
       For i = LBound(arr) To UBound(arr)
           Set rng = .Range(arr(i))
           Set rng = .Range(rng, .Cells(.Rows.Count, rng.Column).End(xlUp))
           rng.Offset(0, 1).Resize(1, num).EntireColumn.Insert
           rng.TextToColumns Destination:=rng.Offset(0, 1), DataType:=xlDelimited, _
              TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
              Semicolon:=True, Comma:=False, Space:=False, Other:=False, _
              FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), TrailingMinusNumbers:=True
       Next
   End With
End Sub
于 2013-04-18T03:16:58.203 回答