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))して、一行下のセルを選択したところに貼り付けます。
このように、簡単に抽出からコピー貼り付けが可能になりますので、使ってみてはいかがでしょうか?