6/01/2021

Excel。VBA。空白セルを除いたデータを抽出して、別シートにコピーしたい【Copy excluding blank cells】

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をつかってみるという選択肢もありかもしれませんね。