- hoehoe1234
- 923
- 1
- 0
- 0
ここまでのとり方はこうなっています。絞り込む前のデータ範囲がすべて含まれています。 pic.twitter.com/UN2Z1l1yJm
2021-05-11 21:00:50これをこのようにコピーすると、クリップボードにコピーされます。 pic.twitter.com/72RYORUvQp
2021-05-11 21:04:27ペーストするとこのようになっています。ここで問題発生です。ではこの6行をプログラムで取得するのはどうすればいいのでしょうか? pic.twitter.com/3AgjATYY9o
2021-05-11 21:05:31どうやら使えそうなのはRangeプロパティしかありません。 pic.twitter.com/ZzvvNsqgQj
2021-05-11 21:06:50しかし、Rangeプロパティでは絞り込む範囲をすべて取得してしまっています。 pic.twitter.com/yk1wyUl2ks
2021-05-11 21:08:00Copyメソッドでは可視行だけコピーされるのにちょっと違和感ありますね。なので調べていたらこうするといいというのがありました。 pic.twitter.com/OjaIBa54fz
2021-05-11 21:19:07なるほど。これならプログラムで扱えそうですね。ではどうすれば1行を個別に取得できるでしょうか?そうですね、Unionの特性を思い出しました(さっきまでわすれていました。)
2021-05-11 21:20:17このようにすれば取得できますね。areasは個々の範囲のコレクションでしたね。 pic.twitter.com/rM4KDajla2
2021-05-11 21:24:14個々のunionされた範囲は、セル分割されていますね。 pic.twitter.com/HkDbfZKIyE
2021-05-11 21:25:11注意してほしいのは、rowsではうまく取れないということですね。rowsは範囲のareas(1).rowsと解釈されるので出力を見ると順番の範囲が取れてますね。これはレンジのオーバランとでタイトル行からareas.count分だけが連続して選択されていますね。これは意図した範囲ではありません。 pic.twitter.com/kiaqvFEVoU
2021-05-11 21:28:10ちょっと調べてみたのですが、現時点ではAutoFilterされた範囲をVBAで取得しようとすると f.range.SpecialCells(xlCellTypeVisible).areas(i) という記法が良いのでは?という結論になりました。 もっとスマートな取得方法があれぜひ紹介してください。
2021-05-11 21:30:23AutoFilterオブジェクトにRange以外にもFilteredRangeとかいうプロパティがあって、絞り込んだ範囲を返してくれると思っていたのですが意外なことにありませんでした。みなさんはVBAでAutoFilterされた範囲をどのように取得していますか? おしまい。
2021-05-11 21:32:06@hoehoe1234 フィルタされた結果の行が隣り合っているとAreas(i)だとうまく行に分割されないのですよね… pic.twitter.com/HJv1gWd9bF
2021-05-11 21:40:18連続した行の場合は範囲が統合されるというご指摘を受けて対応してみました。単に選択された範囲を取得するだけで二重ループになっており悲しみが止まりません。なにかよい方法はないのでしょうか? pic.twitter.com/HxEoq9EeRl
2021-05-11 21:55:35@hoehoe1234 ぱっと思いつくのは1列だけ抜き出したものをFor Eachしてやり、各セル(=表示行の一番左のセルに対応)のEntireRowとf.RangeとのIntersectを取るという方法(添付のTestAutoFilter2())ですが…もっとスマートにできる気がしますよね…。 pic.twitter.com/E7mSxoA5EE
2021-05-11 21:58:38最終的に作成したAutoフィルターからフィルターされた行群を取得するライブラリ関数。 pic.twitter.com/a9fQioBIhm
2021-05-12 01:37:56