5

のバリエーションを使用しようとすると、一部の SO ユーザーが問題に遭遇するのを見てきましたCells.Count。場合によっては、VBA コードがオーバーフロー エラーをスローします。

参考までに、この回答のコメントを参照してください。

これでうまくいくと思いますが、「オーバーフロー」エラーが発生し、「If Master.Cells.SpecialCells(xlCellTypeVisible).Count > 0 Then」というコードが表示されます --- 特に何もフィルタリングしていないようです– user1556069

そしてこの答え

後者は整数、16ビット、最大値65,536を使用し、スプレッドシート全体がより大きな数値を返したため、これは機能していますか(そしてCells.Countは機能しませんでしたか)?– fast_code


舞台裏のどこかで、VBA がセル数を小さな整数 (16 ビット) または長整数 (32 ビット) に強制しようとしていると想定しています。Excel 2007 ワークシートのセル数は、これらのデータ型の両方をオーバーフローします。残念ながら、Excel 2007 のコピーが手元になく、エラーを実際に再現できないため、今すぐ特定することはできません。– mwolfe02

これを理解しようとして、私は自分自身を再現しようとしましたがCells.Count、整数として割り当てようとするとオーバーフローが発生しました。整数データ型には値が大きすぎるため、これは理にかなっています。

以下のコードを Excel 2003 と 2010 の両方で使用すると、Long または Variant として代入しようとすると、数値の結果が得られました。

Option Explicit

Sub testInteger()
    Dim i As Integer
    i = Cells.Count 'Overflow
    Debug.Print i 'Doesn't get this far...
End Sub

Sub testLong()
    Dim l As Long
    l = Cells.Count
    Debug.Print l 'Prints 16777216 in both versions
End Sub

Sub testVariant()
    Dim v As Variant
    v = Cells.Count
    Debug.Print v 'Prints 16777216 in both versions
End Sub

私のコメントでわかるように、Cells.Count値は16777216(2003 年には正しい) ですが、両方のバージョンで同じであり、私には意味がありません。上記のリンクされた回答の 1 つからmwolfe02を引用するには:

Excel 2007 ワークシートには、1,048,576 行と 16,384 列、合計 17,179,869,184 セルがあります。

これは、2010年に印刷された値が少なくとも(実際には同じであるべきだと私は信じています)17,179,869,184.

では、なぜこの数値が正しく印刷されないのか、2003 年の値が 2010 年に返されるのはなぜでしょうか?

4

1 に答える 1

7

このような大きな数を計算するときは、.Countlargeプロパティを使用します。

例えば

Sub CellsCount()
    Dim l As Double
    l = ActiveSheet.Cells.CountLarge
    Debug.Print l
End Sub

また、worksheet オブジェクトを指定せずに使用しCells.Countないでください。Cells.CountLargeこれは、互換モードで誤ったカウント/エラーが発生しないようにするためです。同様に絶対に使用しないでRows.Countください。常に使用しますws.Rows.Count。これは、Excel で最後の行を見つけようとしているときに最も一般的なエラーです。例えば

これ

lRow = ws.Range("A" & Rows.Count).End(xlUp).Row

lRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row

常に同じ結果が得られるとは限りません。

これをさらに読むこともお勧めします。

于 2012-07-30T23:54:28.980 に答える