Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
フィルターがかかった状態で選択している行数を取得
投稿日時: 23/06/08 08:28:38
投稿者: moug_tahara

選択している行数を知りたいのですが、
通常、Selection.Rows.Countで取得できますが、
フィルターがかかった状態でSelection.Rows.Countしても
間の行数まで取得してしまいます。
何か良い方法はありますでしょうか。

回答
投稿日時: 23/06/08 09:23:35
投稿者: simple

「フィルターがかかった状態で選択している行数を取得」でネット検索したら、
こちらの質問掲示板の即効テクニック↓がヒットしました。参考になりますか?
 
「フィルタで抽出したデータの数をカウントする」
https://www.moug.net/tech/exvba/0150043.html

回答
投稿日時: 23/06/08 10:32:35
投稿者: Suzu

フィルター適用時の 表示されている行の取得には、.SpecialCells(xlCellTypeVisible) を使います。
 
【OfficeTANAKA】
絞り込んだ結果の行を操作する
http://officetanaka.net/excel/vba/tips/tips155d.htm
 
更に、選択された範囲 は Selection で取得できますが、
先のフィルターの適用範囲と、Selection の重複範囲について取得したい事になりますから
 
Application.Intersect( オートフィルター適用範囲、Selection)
 
で、目的の範囲を取得できます。
 
が・・・
Selection が、連続の 範囲であれば良いのですが、
2〜3行目 と、飛んで 5行目 を選んだ場合、
Application.Intersect( オートフィルター適用範囲、Selection).Rows.Count
  と しても、最初の選択範囲 の 2〜3行目の Rows.Count の 2しか出てきません。
(Application.Intersect( オートフィルター適用範囲、Selection) に、5行目も含まれていますが
 Rows は、最初の連続範囲 のコレクションになります。 )
 
2番目の連続範囲のRows に対しても Countを行う必要があります。
この時、各連続範囲は、Areas(n) で取得できます。
 
なので・・・
 
For Each rng In Application.Intersect(Selection, .SpecialCells(xlCellTypeVisible)).Areas
 i = i + rng.Rows.Count
Next
Msgbox i
 
の様な感じになります。

投稿日時: 23/06/08 14:17:01
投稿者: moug_tahara

.SpecialCellsの箇所で、参照が不正または不完全です。とエラーになってしまいますが、
どうしたら良いでしょうか。

投稿日時: 23/06/08 14:50:03
投稿者: moug_tahara

以下で取得できるようになりました。
ありがとうございました。
  
   選択行数カウント = 0
    For Each Rng In Selection.Rows
        選択行数カウント = 選択行数カウント + Rng.Rows.Count
    Next
    Debug.Print 選択行数カウント