Excel。VBA。空白セルを除いたデータを抽出して、別シートにコピーしたい
<Excel VBA>
提出日フィールドに、提出日が入力されているデータのみを、別シートにコピーしたいという作業が定期的に行いたいとします。
例えば、次のようなデータがあります。
今回のように、定期的に同じ作業を行うのは、単純作業であればあるほど、面倒なわけです。
作業工程としては、空白を除きたいわけですから、オートフィルターをつかって空白以外を抽出して、抽出されたデータのみを範囲選択して、別シートにコピーする。
そして、元のデータはオートフィルターを設定しているので、解除する。
ということになるわけです。
作業自体はとても、簡単だからこそ、面倒なわけです。
面倒で定期的に行うことがあるとなれば、Excel VBAでマクロを作っちゃいましょう。
次のようなプログラム文を作ってみました。
Sub 空白除外()
Range("a1").AutoFilter field:=3, Criteria1:="<>"
Range("a1").CurrentRegion.Copy Destination:=Worksheets("COPY").Range("a1")
Range("a1").AutoFilter
Worksheets("COPY").Columns("C:C").ColumnWidth = Columns("C:C").ColumnWidth + 1
End Sub
とりあえず、実行してみましょう。
該当のデータのみが別シートにコピーすることができました。
では、プログラム文を説明してきます。
Range("a1").AutoFilter field:=3, Criteria1:="<>"
AutoFilterメソッドをつかって、オートフィルターを設定します。
今回は、1行目にありましたので、A1のセルをつかっています。
field:=3 は、データの3列目を指しますので、C列の提出日フィールドに対してフィルターを設定していきます。
Criteria1:="<>" のCriteria1は、条件という意味です。
空白以外を抽出したいので、条件には、「"<>"」とすることで、空白以外を抽出することができます。
なお、逆に空白のみを抽出したい場合は、
Criteria1:="="
とすることで、空白のみのデータを抽出することができます。
Criteria1の設定は、間違えやすいので注意が必要ですね。
Range("a1").CurrentRegion.Copy Destination:=Worksheets("COPY").Range("a1")
抽出したデータを範囲選択して、COPYというシート名のA1にコピーします。
「Destination」をつかうことで、貼付け先を指定することができます。
Range("a1").AutoFilter
コピーが終わりましたので、オートフィルターを設定したままにする必要はありませんので、オートフィルターを解除するのが、この一行です。
オートフィルターは、ボタンのオンとオフなので、AutoFilterメソッドを再度つかうだけで、解除することができます。
Worksheets("COPY").Columns("C:C").ColumnWidth = Columns("C:C").ColumnWidth + 1
最後のこの行ですが、別に必要ないといえば必要ないのですが、せっかくなので追加しておくと便利なプログラム文です。
コピーして貼り付けると、文字数が多いと、「#」で表示されてしまいます。
日付は、「2021/12/31」と10文字分の列幅なので、「#」で表示される場合があるかもしれません。
せっかく、楽をするために、Excel VBAでマクロを作ったのに、列幅を自分で調整しなおすのは面倒です。
そこで、列幅を調整しています。
Columns("C:C")は、C列に対して設定します。
ColumnWidth は、列幅を設定するものです。
列幅を、1文字分広げたいので、「ColumnWidth + 1」としております。
なお、列幅を自動調整したい場合には、
Worksheets("COPY").Columns("C:C").AutoFit
とすることで、簡単に列幅を自動調整することができます。
今回のように、単純作業を高速処理できるし、「楽」したいものがあれば、Excel VBAをつかってみるという選択肢もありかもしれませんね。