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

わかりましたので、修正しようとしているのは、2 番目の部分で rng を手動で W1 に設定することです。rng は次の空の列である必要があります。そのため、MsgBox を使用する lastColumn は列「W」を返しますが、それを rng (型の不一致) に設定することはできません。ああ、num変数は、挿入する必要がある列の量に設定されています。私のデータは次のようになります。

カウント | の列; データは分離する必要があります | の列; データは分離する必要があります

5 | セミコロンで区切られた 5 セットのデータ | これはシートの終わりなので気にしないでください

これを行う簡単な方法はありますか?私も近いですか?

4

2 に答える 2

0

セットアップを正しく理解していると仮定すると、次のコードが機能するはずです。

データ列を右から左に処理する場合、列が挿入されたときにアドレス参照が変更されることを心配する必要はありません。つまり、挿入/変換コードの 1 つのブロックを使用して、2 つのデータ アドレス参照 ( Q1R1.

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 に答える