11/07/2021

Excel。VBA。抽出したデータの見出し行を除いて別シートにコピーしたい【Data only】

Excel。VBA。抽出したデータの見出し行を除いて別シートにコピーしたい

<VBA>

データを読み込んだ後に、抽出だけを行って作業終了というよりも、その抽出したデータを別シートにコピーするなど、抽出後の作業が伴うことになるかと思います。


抽出したデータをコピーすること自体は、厄介ではないのですが、「見出し行」を除いてデータのみを別シートにコピーしたい場合は、どのようにしたらいいのでしょうか。


コピーする範囲をOffsetなどつかって、見出し行を除いた範囲を設定する方法もあるかもしれませんが、CurrentRegionプロパティをつかうことで、見出し行も含めてコピーすることができます。

そのため、コピーした後に見出し行を削除するほうが、簡単にデータのみにすることができます。


次のデータを使います。


店舗番号が3の品川店のデータのみを別シートにコピーするプログラム文を作っていきます。


Sub 見出し行除き()

    Range("a1").AutoFilter field:=2, Criteria1:=3

    

    If WorksheetFunction.Subtotal(3, Range("b:b")) > 1 Then

        Worksheets.Add after:=Sheets(Sheets.Count)

        Worksheets("data").Range("a1").CurrentRegion.Copy Range("a1")

        Range("a1").EntireRow.Delete

        Worksheets(Sheets.Count).Name = "copy"

        Worksheets("data").Range("a1").AutoFilter

    End If

End Sub


とてもシンプルなプログラム文で、見出し行を除いてコピーすることができます。

それでは、実行してみましょう。


 

このように、別シートに見出し行を除いたデータのみをコピーすることができました。


プログラム文を見ていきましょう。

Range("a1").AutoFilter field:=2, Criteria1:=3

この行は、オートフィルターをつかって抽出作業を行っています。


AutoFilter で、オートフィルターを設定します。

field:=2 は、左から2列目のフィールドを指しますので、「店舗番号」の列が該当します。


Criteria1:=3 の「Criteria」は条件。

つまり抽出条件のことなので、「3」の品川店を抽出する設定のオートフィルターを設定することができます。


If WorksheetFunction.Subtotal(3, Range("b:b")) > 1 Then ~End If

このIf文は、何をやっているのかというと、該当するデータがあれば、それ以降を実行して、抽出データがなければ、実行しないためのプログラム文です。


WorksheetFunction.Subtotal は、ワークシート関数のSubtotal関数をつかって、データのあるなしを確認しています。


Worksheets.Add after:=Sheets(Sheets.Count)

データがあることが判明したので、コピーを行うわけですが、コピー先のシートがないので、Worksheets.Add でシートを追加します。


なお、after:=Sheets(Sheets.Count)で、最終シートの後ろにシートを追加させます。Sheets.Count でブック内のシートの枚数を確認することができます。


Worksheets("data").Range("a1").CurrentRegion.Copy Range("a1")

追加したシートのA1に、抽出したデータをコピーします。



Range("a1").EntireRow.Delete

コピーしたデータの、1行目を削除します。これで、見出し行を除いたデータにすることができました。


Worksheets(Sheets.Count).Name = "copy"

追加したシート名が設定されていませんので、「copy」というシート名で設定します。


Worksheets("data").Range("a1").AutoFilter

コピー作業が終了したので、抽出するためのオートフィルターを解除します。


これ以外にも、様々な方法で作ることができますので、色々考えてみるのもいいかもしれませんね。