Selection.Count でオーバーフロー
今回はVBAの技術的な話です。
Excel2007になってから問題になっていたのは以下のようなカウント。
ふつうは選択されたセルの数を数えて一定数以上だと「大量のセルが選択されています!」と警告を出すのがセオリーですが・・・。
Dim lngCnt As Long
lngCnt = Selection.Count
しかし、セルを「全選択」してから実行してみると?以下のエラーがでます。
Excel2007から使用できる行が増えたのですべてのセルを選択するとLong型の最大値を超え、オーバーフローエラーとなります。
この現象の問題点は受けの変数がLong型だからじゃないのです。CountプロパティそのものがLong型なので回避不可なのです。
大分悩んでいたのですがオブジェクトブラウザを見るとなんか下にそれっぽいのプロパティがありました「CountLarge」
実際実行してみると
Dim varCnt As Variant
varCnt = Selection.CountLarge
値:17179869184
なんだ実行できるじゃん!
しかしずいぶんデカい値みたいだけど内部はどうなっているのか調べてみると
デバッグウィンドウ
20
Excel 2010ヘルプに以下の記述が。
定数名 | 値 | 説明 |
---|---|---|
vbLongLong | 20 | LongLong 型の整数 (64 ビット プラットフォーム上でのみ有効) |
64bitとありますが実際32bitのExcelでも動作は問題ないようです。
Excel2007ヘルプには載ってない型ですね。
CountLarge自体はExcel2007から追加のようですので問題はなさそうです。
Excel2007以降はSelectionやRangeのカウントはCountLargeを使用するのがよさそうですね。
最近のコメント