Excel

【Excel】エクセルで1行おきにコピー貼り付け(1つ飛ばし、1行ごとにコピペ)する方法

当サイトでは記事内に広告を含みます

エクセルでデータを扱う際、1行おきにデータをコピーして別のシートに貼り付けたいというケースがあります。

このような背景もありこの記事では、エクセルで1行おきにコピー貼り付け(1つ飛ばし、1行ごとにコピペ)について、数式とVBAマクロを使って解説します!

 

エクセルで1行ごとにコピーする方法【数式:元が2,4,6、、など最終行まで一つ飛ばしでコピーし、別シートに連続になるように貼り付け】

以下のような元データがあるとします。

 

ここから、2,4行目のデータを抽出して別シートに連続で貼り付けるには、以下の数式を使います。

左下のシートタブから、コピーしたい別シートに移動しましょう。その上で以下数式をA1に入れてみます(任意のセルでOKです)。

=OFFSET(Sheet1!$A$1,ROW(A1)*2-1,COLUMN(A1)-1)

この数式の意味詳細は以下の通りです。

OFFSET関数で、基準セル(Sheet1!$A$1)から相対位置を指定してデータを取

ROW(A1)*2-1で、1,3,5…と奇数行を指定

COLUMN(A1)-1で列位置を指定(A列なら0、B列なら1、、)

 

この数式をコピーして、必要な行数分だけ下方向に貼り付けると、以下のように1つ飛ばしで抽出されたデータが得られます。

 

VBA(マクロ)の場合

同じ処理をVBAマクロで行うこともできます。Alt+F11でVBE画面を開いて以下をコピペしましょう。

Sub CopyAlternateRows()
    Dim lastRow As Long
    Dim i As Long, j As Long
    
    lastRow = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
    
    For i = 2 To lastRow Step 2
        j = j + 1
        Sheets("Sheet2").Cells(j, 1) = Sheets("Sheet1").Cells(i, 1)
        Sheets("Sheet2").Cells(j, 2) = Sheets("Sheet1").Cells(i, 2)
    Next i
End Sub

 

 

このマクロの処理は以下の通りです。

1. lastRow変数で、Sheet1の最終行番号を取得
2. For文で2行目から2つずつ飛ばして最終行まで繰り返し
3. Sheet2のj行目に、Sheet1のi行目のデータをコピー
4. jを1つ増やして、次の行にデータを入れる準備

Alt+F8でマクロ選択画面を開きCopyAlternateRows関数を実行すると処理完了です!

 

エクセルで1行ごとにコピーする方法【数式:元が連続で2行目から最終行までコピーし、別シートに1つ飛ばしで貼り付け】

次は、元が連続したデータをコピー先で1行おきに飛ばして貼り付ける方法です。

元データは上と同じものを使用しています。

これを、1行飛ばしで以下のように貼り付けます。

 

このためには、以下の数式を使います。

=IF(MOD(ROW()-1,2)=0,OFFSET(Sheet1!$A$1,INT((ROW()-1)/2)+1,COLUMN()-1),"")  

 

 

この数式の意味は次の通りです:

– IF関数で、行番号を2で割った余りが0の時だけデータを表示
– MOD(ROW()-1,2)で、行番号が奇数か偶数かを判定
– OFFSET関数で元データから該当行を取得
– INT((ROW()-1)/2)+1で、飛ばし行に対応する元データの行番号を計算
– “”で、空白行に空文字列を入れる

この数式をコピーして必要な行数分貼り付ければ、1行飛ばしでデータが並びます。

状況によっては、再度コピー後、形式を選択して貼り付け&値のみ貼り付けとすると、数式でなく数値が飛び飛びで表示されることになります!

 

VBA(マクロ)の場合

VBAマクロでも同様の処理ができます。Alt+F11でVBE画面を開いて以下をコピペしましょう。

Sub CopyToAlternateRows()
    Dim lastRow As Long
    Dim i As Long, j As Long
    
    lastRow = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
    
    j = 1
    For i = 2 To lastRow
        Sheets("Sheet2").Cells(j, 1) = Sheets("Sheet1").Cells(i, 1)
        Sheets("Sheet2").Cells(j, 2) = Sheets("Sheet1").Cells(i, 2)
        j = j + 2
    Next i
End Sub

 

このマクロの処理の流れは次の通りです:

1. lastRow変数でSheet1の最終行番号を取得
2. For文で、Sheet1の2行目から最終行までループ
3. Sheet2のj行目に、Sheet1のi行目のデータをコピー
4. jを2つ増やして、1行飛ばしになるよう調整
5. 次のループへ

Alt+F8でマクロ選択画面を開きCopyToAlternateRows関数を実行すれば、指定通りのコピーが完了しますね(^^)/

 

以上、エクセルで1行おきや1つ飛ばしでコピペする方法を見てきました。数式とマクロのどちらを使うかは状況に応じて使い分けてください。数式のメリットは数式バーにペーストするだけと手軽なこと。一方、大量のデータを扱う場合はマクロの方が圧倒的に高速に処理できます。使いこなすことでエクセル業務の効率アップが期待できるでしょう。