Selection.Count でオーバーフロー

Selection.Count でオーバーフロー

今回はVBAの技術的な話です。
Excel2007になってから問題になっていたのは以下のようなカウント。
ふつうは選択されたセルの数を数えて一定数以上だと「大量のセルが選択されています!」と警告を出すのがセオリーですが・・・。

    Dim lngCnt As Long
    lngCnt = Selection.Count

しかし、セルを「全選択」してから実行してみると?以下のエラーがでます。
overflow01
Excel2007から使用できる行が増えたのですべてのセルを選択するとLong型の最大値を超え、オーバーフローエラーとなります。
この現象の問題点は受けの変数がLong型だからじゃないのです。CountプロパティそのものがLong型なので回避不可なのです。
大分悩んでいたのですがオブジェクトブラウザを見るとなんか下にそれっぽいのプロパティがありました「CountLarge」

overflow02

実際実行してみると

    Dim varCnt As Variant
    varCnt = Selection.CountLarge

値:17179869184
なんだ実行できるじゃん!
しかしずいぶんデカい値みたいだけど内部はどうなっているのか調べてみると

デバッグウィンドウ

?vartype(Selection.CountLarge)
20

Excel 2010ヘルプに以下の記述が。

定数名

説明
vbLongLong

20

LongLong 型の整数 (64 ビット プラットフォーム上でのみ有効)

64bitとありますが実際32bitのExcelでも動作は問題ないようです。
Excel2007ヘルプには載ってない型ですね。
CountLarge自体はExcel2007から追加のようですので問題はなさそうです。
Excel2007以降はSelectionやRangeのカウントはCountLargeを使用するのがよさそうですね。

ABOUTこの記事をかいた人

はてなブックマークで驚愕の1600越えを記録した伝説が今明らかに! エクセル方眼紙 四天王の1人(ほぼ最弱)窓の杜大賞2014 大賞受賞! Excelを便利にする250以上の機能を体系化したアドインはこちらです。