0

次の操作をどのように行うかについてのリクエストがあります。

私は csv ファイル (Excel で開いている) にデータ 50X2 (rowsXcolumns) のブロックを追加している csv ファイルを持っています。完成した csv ファイルを使用して、50 行ごとに (両方の列) が選択され、データが基本的に切り取られて次の 2 つの使用可能な列にコピーされるプロセスを自動化したいと考えています。

例として、$A$1:$B$50 からのデータが csv にあり、2 番目のサンプルが取得され、2 番目のデータ セットが $A$51:$B$100 に移動し、2 番目のセットを次の場所に自動的に移動したいとします。 $C$1:$D$50 を実行し、取得したすべてのサンプルに対してその移動を実行します。

この操作の最適な方法 (マクロ/VBA/など) がわかりません。簡単に実行できる場合は、これに関する支援をお願いします。

お時間をいただき、ありがとうございました。

4

2 に答える 2

2

何をする必要があるかの背後にある基本的な考え方は次のとおりです。

  • 作成する新しい列の数を取得します (例: Total Rows/#rows per column)
  • nth + 1作成する新しい列ごとに、行から最後の行まで切り取ります。ここで、nth行は必要な列ごとの行数です (この場合は 50)。
  • 切り取った行を、データが含まれている最後の列の右側に貼り付けます
  • すべての列が作成されるまで繰り返します

ここに、作業を開始するためにまとめたサンプル コードをいくつか示します。これは、データがセル A1 から始まり、各列に最大 10 行が含まれていることを前提としています。必要に応じて値を変更できrowsToSkipます。また、これは開始するためのものであり、さらにテストが必要なことに注意してください。必要に応じて変更します。

Public Sub MakeColumnsFromRows()
    Dim totalCutsToMake As Integer
    Dim currentColumn As Integer
    Dim currentCut As Integer
    Dim rowsToCut As Integer

    Sheets(1).Activate
    rowsToSkip = 10
    totalCutsToMake = (ActiveSheet.UsedRange.Rows.Count / rowsToSkip)
    currentColumn = 1

    Dim RowCount As Integer
    For currentCut = 1 To totalCutsToMake
        RowCount = Cells(Rows.Count, currentColumn).End(xlUp).Row
        Range(Cells(rowsToSkip + 1, currentColumn), Cells(RowCount, currentColumn + 1)).Select
        Selection.Cut
        Cells(1, currentColumn + 2).Select
        ActiveSheet.Paste
        currentColumn = currentColumn + 2
    Next
End Sub

これが行うことは、最初に作成する新しい列の数を見つけ、次に各列の 11 行目から最後の行までを切り取り、データを含む最後の列の後にそれらの値を貼り付けることです。これは、すべての新しい列が作成されるまで行われます。これにより、列ごとに 10 行のデータが残ることに注意してください。これを 50 に変更するには、rowsToSkip変数をに変更するだけです50

前後のスクリーンショットは次のとおりです。

ここに画像の説明を入力

ここに画像の説明を入力

于 2013-02-05T14:07:32.250 に答える
0

これはどう?

Sub move()
    Dim ws As Worksheet
    Dim r As Range
    Dim columnCounter As Long
    Dim rowCounter As Long
    Set ws = Sheets("Sheet1")


    columnCounter = 1
    rowCounter = 51

    Set r = ws.Cells(rowCounter, 1)

    Do While r.Value <> vbNullString
        ws.Range(r, r.Offset(49, 1)).Cut ws.Cells(1, columnCounter)

        columnCounter = columnCounter + 2
        rowCounter = rowCounter + 50

        Set r = ws.Cells(rowCounter, 1)
    Loop
End Sub
于 2013-02-04T22:17:21.507 に答える