<< 図のリンク貼り付け | main | テーブルの左上セルを空欄にしたい >>

Cells.Countがオーバーフロー

0
    マクロでCells.Countを取得しようとするとオーバーフローします。これは、ベータ版で発見して報告したバグですが、製品版でも直っていないようです。残念。

    たとえば、次のコードはエラーになります。



    オーバーフローしているのは黄色い行です。



    これは当然ですね。Long型では入るはずがありません。
    しかし、受ける変数をDoubleに変えても



    それならバリアント型では



    いずれにしてもエラーです。
    ここでは、Cells.Countを変数に代入していますが「MsgBox Cells.Count」でも「Debug.Print Cells.Count」でも「If Cells.Count > 1 Then」でもオーバーフローします。
    どうやら、そもそもCellsのCountが怪しいようです。
    オブジェクトライブラリで調べてみると



    なるほど、Countプロパティ自体がLong型で宣言されているのですね。Excel 2007はワークシートの領域が広がりましたので、全セルの合計は17,179,869,184個です。Long型の許容値2,147,483,647を楽に超えています。おそらくこれが原因でしょう。

    ちなみに、次のようなコードもオーバーフローします。



    ここまでのマクロは標準モジュールに書きました。これをSheet1などのシートモジュールに書くと、エラー表示が異なります。



    これではデバッグもできませんね。
    もっとも、なぜか次のように明示的にWorksheetオブジェクトを指定してやると、全行数×全列数の計算結果は取得できるようです。理由は調べていませんが、不思議ですね・・・てゆーか、早いとこ直して欲しいです。






    コメント
    古い記事なので、すでに解決済みとは思いますが、この問題で困っていて、ここに辿り着いた訪問者の方のことも考慮し、コメントを記します。巨匠のブログにコメントする失礼をお許しください。

    CountLarge プロパティーが追加されました。こちらはオーバーフローしません。
    Count は後方互換性の理由から、型を変更しなかったと考えられます。
    コメントする









    この記事のトラックバックURL
    トラックバック
    [VBA] Long 型同士の乗算がエラーにならない理由
    田中さんのブログに、Excel 2007 に関する、以下のような実験コードがありました。次のようなコードもオーバーフローします。Sub Sample1() Dim n n = Rows.Count * Columns.Count MsgBox n End Subなぜか次のように明示的にWorksheetオブジェクトを指
    • Orator's IO
    • 2007/12/09 9:38 PM
    Topページへ戻る
    calendar
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
    << March 2017 >>
    selected entries
    categories
    archives
    recent comment
    recent trackback
    recommend
    recommend
    recommend
    recommend
    recommend
    links
    profile
    search this site.
    others
    mobile
    qrcode