10/04/2019

Excel。Excel VBAで抽出データをコピー。見出し行を除いてデータだけコピーしたい。【Copy without heading line】

Excel。Excel VBAで抽出データをコピー。見出し行を除いてデータだけコピーしたい。

<Excel VBA>

大きなデータから該当のデータのみを抽出したら、対象のデータを別のシートにコピーしたい。
しかも、見出し行はすでにあるので、見出し行を除いてコピーするという作業を日々繰り返すのは面倒。

そこで、作業効率を改善したいので、マクロで対応することができるといいですよね。

【見出しを含めてコピー】

まずは、データを抽出して、そのデータを別のシートに見出し行も含めてコピーする方法から確認しましょう。

次のデータを用意しました。

このデータから店舗名が新宿だけを抽出して、そのデータを別のシートに見出し行も含めてコピーするマクロをExcel VBAで作成していきます。

Sub オートフィルターで新宿コピー()
    Range("a1").AutoFilter field:=3, Criteria1:="新宿"
    Range("a1").CurrentRegion.Copy Worksheets("新宿").Range("a1")
    Range("a1").AutoFilter
End Sub

実行して確認してみましょう。

抽出されてコピーすることができました。
では、Excel VBAの構文を確認しておきましょう。

Range("a1").AutoFilter field:=3, Criteria1:="新宿"
A1を起点として、AutoFilter。つまりオートフィルターを設定します。

field:=3なので、左から3列目のデータが対象になります。3列目は店舗名ですね。

Criteria1:="新宿"の「Criteria」は抽出条件なので、抽出条件の1番目が「新宿」で抽出という意味になります。

たった、一行で、オートフィルターを設定して抽出まで処理をしてくれます。

Range("a1").CurrentRegion.Copy Worksheets("新宿").Range("a1")
A1を起点とした連続したセル(CurrentRegion)をコピーします。

どこに貼り付けるのかというと、Worksheets("新宿").Range("a1")ですね。

Range("a1").AutoFilter
これは、オートフィルターを解除するための一文ですね。
この一行だけで、解除することができます。

オートフィルターのボタンはオンオフですからね。

簡単なプログラム文ですが、これでは、常に見出し行も含めてコピーしてしまうので、見出し行があって、その下にデータをコピーする場合はどうしたらいいのでしょうか?

【見出し行を除いてコピーしたい】

見出し行を除いてコピーしたいわけですから、簡単に考えれば、見出し行を含めた範囲よりも、一行分少ない範囲をコピーすればいいわけですよね。

それを表現するようにプログラム文を作っていきましょう。

Sub オートフィルターで新宿コピー見出しあり()
    Range("a1").AutoFilter field:=3, Criteria1:="新宿"
    With Range("a1").CurrentRegion.Offset(1, 0)
        .Resize(.Rows.Count - 1).Copy Worksheets("新宿").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
    End With
    Range("a1").AutoFilter
End Sub

わざと2回連続で実行してみると、データの下に貼り付いていることがわかります。

見出し行は含まれていませんね。
プログラム文を確認しておきましょう。

With Range("a1").CurrentRegion.Offset(1, 0)~End With
With文ですね。With以降のRange("a1").CurrentRegion.Offset(1, 0)を何度も入力するのが面倒なので、With文を使うことで、わかりやすくなります。

そして、「.Resize(.Rows.Count - 1).Copy Worksheets("新宿").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)」

With文で省略していますが、省略しない状態にして説明していきます。
Range("a1").CurrentRegion.Offset(1, 0) .Resize(.Rows.Count - 1).Copy Worksheets("新宿").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)

A1を起点とした連続した範囲(CurrentRegion)を、1行下(Offset(1, 0))にずらす、1行下にずらすと関係ない行が含まれるので、Resize(.Rows.Count - 1)して、範囲選択をデータとフィットさせます。

そのデータを「新宿」というワークシートにコピーします。

貼り付け先は、(Cells(Rows.Count, 1).End(xlUp))でデータの一番下のセル番地を表します。このCells(Rows.Count, 1).End(xlUp)は、Excel VBAでは定番な考え方の一つです。

ただ、データの一番下なので、そのセルの下に貼り付けないといけないので、(.Offset(1, 0))して、一行下のセルを選択したところに貼り付けます。

このように、簡単に抽出からコピー貼り付けが可能になりますので、使ってみてはいかがでしょうか?