【ExcelVBA】テーブルをオートフィルタで絞りこんだ結果をコピーすると、非表示セルがコピーされてしまう問題

ExcelVBA

表をオートフィルターを使って絞りこみ、絞り込まれた見えている行だけをコピーすることがよくあります。

色んな入門書の説明によれば、絞りこみ表示されている結果(可視セルとも言います)のみコピーしてくれるから安心してください!って書いてあることが多いのですが、

テーブルの場合で試してみると・・・

いやいや、表示されていないデータもコピーされるじゃないですか・・・。

でも、何度か試していると、あれ?

言われている通り、表示されている行のみの場合もある・・・。

ということがあります。

今回は、そんな問題のお話です。

この記事を書いた人
momo

フリーランスSEとして、UiPathを中心に業務効率化・自動化を支援しています。
Excel・VBA・GAS・Python・生成AIなども活用し、日々の定型業務を減らす仕組みづくりを行っています。

momoをフォローする
003_midworks_img_300x250

まずはテーブルを絞り込んでコピーしてみる

例えばこんなテーブルがあるとします。

この表を、値が「a」の行のみに絞りこんで、絞りこんだ結果をコピペしたいとき、こんなコードになりますね。

With range("A1").ListObject
    .range.AutoFilter 1, "a"
    .range.Copy Sheets("to").range("A1")
End With

これを実行すると・・・

こんな風に、絞り込んだ「a」の2行だけコピーして欲しいんです。

でも、実は、全行がコピーされてしまうことがあります。これ、実は、、実行前にテーブルを選択しているかどうかなんです。

調べた結果

・テーブルのどこかを選択して実行→絞りこんだ結果だけコピー
・テーブル以外を選択して実行→テーブル全行をコピー

ということなんです。

これは、VBAの公式テキストによるとエクセルのバグらしく、どうしようもないようです。

テーブル以外を選択していても動くようにしよう!

エクセルのバグなら仕方ないですね。。。。

どこを選択していても、正しく絞り込んだ行だけコピーするように対処しておきましょう。

さっきのコードに、テーブル選択する処理を追加してみます。赤線の部分です。

With range("A1").ListObject
    .range.Select
    .range.AutoFilter 1, "a"
    .range.Copy Sheets("to").range("A1")
End With

こうしておけば、どこを選択していようが、最初にテーブルを選択するようになるので、問題ありません。

ちなみに、これはテーブルのときにだけ起こります。

テーブルではない、ただの表は問題ないので、テーブルのときはこれを思い出すと良いと思います。

この作業、自動化できる?と思ったら

毎日の入力、転記、集計、メール送信、ファイル整理など、繰り返し作業には効率化できるものがあります。

「そもそも自動化できる作業なのか知りたい」

そんな段階でも大丈夫です。

業務内容を確認し、できるだけシンプルで運用しやすい方法を考えます。

ExcelVBA