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

ExcelVBA

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

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

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

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

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

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

ということがあります。

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

サイト運営者
momo

大阪在住40代女性SE。現在は、子育てしながら自宅でフリーランスとして働いています。IT業務自動化が得意で、RPA(UiPath)やVBAを中心に、要件定義から設計・開発まで対応しています。

※主婦ブログも運営中「https://syufumesen.com/」

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

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

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

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

フリーランスへの第一歩はエージェント登録から。難しい契約や交渉は完全にお任せできて、1年目から高収入を実現できます。登録も相談も完全無料なので、自分の市場価値や将来性を確認するだけでも価値ありです。

ExcelVBA
シェアする
momoをフォローする
タイトルとURLをコピーしました