AutoFilterされた範囲をVBAで取得するには?

6
ほえほえ@スプシマン @hoehoe1234

こういう表を 第一列=3でオートフィルターすると。 pic.twitter.com/X6AjHwrWWd

2021-05-11 20:58:10
拡大
ほえほえ@スプシマン @hoehoe1234

ここまでのとり方はこうなっています。絞り込む前のデータ範囲がすべて含まれています。 pic.twitter.com/UN2Z1l1yJm

2021-05-11 21:00:50
拡大
ほえほえ@スプシマン @hoehoe1234

これをこのようにコピーすると、クリップボードにコピーされます。 pic.twitter.com/72RYORUvQp

2021-05-11 21:04:27
拡大
ほえほえ@スプシマン @hoehoe1234

ペーストするとこのようになっています。ここで問題発生です。ではこの6行をプログラムで取得するのはどうすればいいのでしょうか? pic.twitter.com/3AgjATYY9o

2021-05-11 21:05:31
拡大
ほえほえ@スプシマン @hoehoe1234

どうやら使えそうなのはRangeプロパティしかありません。 pic.twitter.com/ZzvvNsqgQj

2021-05-11 21:06:50
拡大
ほえほえ@スプシマン @hoehoe1234

しかし、Rangeプロパティでは絞り込む範囲をすべて取得してしまっています。 pic.twitter.com/yk1wyUl2ks

2021-05-11 21:08:00
拡大
ほえほえ@スプシマン @hoehoe1234

Copyメソッドでは可視行だけコピーされるのにちょっと違和感ありますね。なので調べていたらこうするといいというのがありました。 pic.twitter.com/OjaIBa54fz

2021-05-11 21:19:07
拡大
ほえほえ@スプシマン @hoehoe1234

なるほど。これならプログラムで扱えそうですね。ではどうすれば1行を個別に取得できるでしょうか?そうですね、Unionの特性を思い出しました(さっきまでわすれていました。)

2021-05-11 21:20:17
ほえほえ@スプシマン @hoehoe1234

このようにすれば取得できますね。areasは個々の範囲のコレクションでしたね。 pic.twitter.com/rM4KDajla2

2021-05-11 21:24:14
拡大
ほえほえ@スプシマン @hoehoe1234

個々のunionされた範囲は、セル分割されていますね。 pic.twitter.com/HkDbfZKIyE

2021-05-11 21:25:11
拡大
ほえほえ@スプシマン @hoehoe1234

注意してほしいのは、rowsではうまく取れないということですね。rowsは範囲のareas(1).rowsと解釈されるので出力を見ると順番の範囲が取れてますね。これはレンジのオーバランとでタイトル行からareas.count分だけが連続して選択されていますね。これは意図した範囲ではありません。 pic.twitter.com/kiaqvFEVoU

2021-05-11 21:28:10
拡大
ほえほえ@スプシマン @hoehoe1234

ちょっと調べてみたのですが、現時点ではAutoFilterされた範囲をVBAで取得しようとすると f.range.SpecialCells(xlCellTypeVisible).areas(i) という記法が良いのでは?という結論になりました。 もっとスマートな取得方法があれぜひ紹介してください。

2021-05-11 21:30:23
ほえほえ@スプシマン @hoehoe1234

AutoFilterオブジェクトにRange以外にもFilteredRangeとかいうプロパティがあって、絞り込んだ範囲を返してくれると思っていたのですが意外なことにありませんでした。みなさんはVBAでAutoFilterされた範囲をどのように取得していますか? おしまい。

2021-05-11 21:32:06
風柳 @furyutei

@hoehoe1234 フィルタされた結果の行が隣り合っているとAreas(i)だとうまく行に分割されないのですよね… pic.twitter.com/HJv1gWd9bF

2021-05-11 21:40:18
拡大
ほえほえ@スプシマン @hoehoe1234

連続した行の場合は範囲が統合されるというご指摘を受けて対応してみました。単に選択された範囲を取得するだけで二重ループになっており悲しみが止まりません。なにかよい方法はないのでしょうか? pic.twitter.com/HxEoq9EeRl

2021-05-11 21:55:35
拡大
風柳 @furyutei

@hoehoe1234 ぱっと思いつくのは1列だけ抜き出したものをFor Eachしてやり、各セル(=表示行の一番左のセルに対応)のEntireRowとf.RangeとのIntersectを取るという方法(添付のTestAutoFilter2())ですが…もっとスマートにできる気がしますよね…。 pic.twitter.com/E7mSxoA5EE

2021-05-11 21:58:38
拡大
ほえほえ@スプシマン @hoehoe1234

最終的に作成したAutoフィルターからフィルターされた行群を取得するライブラリ関数。 pic.twitter.com/a9fQioBIhm

2021-05-12 01:37:56
拡大