質問: ### 前提・実現したいこと オーバーフロー防止のため、 マクロ使用者がワークシート全体を選択した場合、 メッセージを表示してプロシージャーを終了させたいと思っています。 下記のtest1()の条件文を試したのですが、 シート全体を選択した場合 エラーになってしまいます。 みなさんのお知恵を借りたいと思います。 よろしくお願いします。 ### 発生している問題・エラーメッセージ ``` 実行時エラー'6': オーバーフローしました。 ``` ### 該当のソースコード ``` Sub test1() If Selection.Count > 1000000 Then MsgBox "注意文" Exit Sub End If End Sub Sub test2() MsgBox Cells.Select End Sub ``` ### 試したこと Cells.Selectがシート全選択のメソッドと知り、 マクロ使用者が全選択を行ったかを戻り値を得られないか試したのですが、 うまくいきませんでした。 その過程で疑問に思ったことがあります。 上記のtest2()を実行するとTrueが返ってくるのですが、 同時にシートが全体選択されています。 なぜMsgBoxの引数であるCells.Selectが動作しているのか疑問です。 冒頭の問題が解決さえすればよいのですが、 後学のために おわかりの方がいらっしゃれば 教えていただきたいと思います。 ### 補足情報(FW/ツールのバージョンなど) 環境はWindows 7、Excel 2010です。
回答: Range.CountLarge プロパティ を使用することで、オーバーフローせずに個数を取得できます。 なおこの時の返り値はLongLong型となりますが、32bit版VBAでは使えないため、変数に入れる場合はVariant型変数を使用します。 また、xls形式のファイルではシート上のセルの個数が変わるなど、数値を直接指定するのは不安が残ります。 以下のように、実際のシート上の個数を元に判定をした方がより堅牢になるかと思います。 (Selectionを使用する以上、これでも漏れはありますが...) ``` With Excel.ActiveWindow.RangeSelection If .CountLarge = .Worksheet.Cells.CountLarge Then '注意文~ End If End With ```