このサイト・インストラクターのネタ帳のアクセスログをチェックしていて、
「マクロ 最終行取得 xldown オーバーフローしました」
という検索キーワードに気づきました。
Range("A1").End(xlDown).Rowでオーバーフローするサンプルマクロ
以下のようなマクロを実行しようとしたのではないでしょうか。Dim end_row As Integer
end_row = Range("A1").End(xlDown).Row
End Sub
1行目にしかデータが存在しないときに上記のSubプロシージャを実行すると、必ず
「実行時エラー '6' オーバーフローしました。」
というエラーが発生します。
オーバーフローしましたエラーの発生する理由
1行目にしかデータが存在しないとき「Range("A1").End(xlDown).Row」というオブジェクト式は「1,048,576」を返します(2003形式のブックの場合は「65,536」)。
これに対して、VBAのIntegerは「-32,768」から「32,767」の整数です。
最大でも「32,767」までしか代入できない変数に「1,048,576」や「65,536」といった数値を入力しようとしたので、オーバーフローします。
ですから変数の宣言を
Dim end_row As Integer
ではなく、
Dim end_row As Long
で宣言すれば、上記の理由によるオーバーフローエラーは発生しなくなります。
VBAで整数の変数はLongでいいのでは
プログラミングでは、似たデータ型であれば、変数を小さいサイズの型で宣言するのが、原則です。
ですが、VBAはExcel 97の頃に現在の仕様がほぼ固まった、古い言語です。
最近のプログラミング言語の場合、Integerという名前のデータ型は4バイトの「-2,147,483,648 ~ 2,147,483,647」と定義されているケースが多いようですが、VBAのIntegerは2バイトの「-32,768 ~ 32,767」です。
整数タイプのサイズとしてはあまりに小さく、実行スピードでもLongより速いわけでもないので、私はIntegerを使うメリットはないと考えています。
Home » Excel VBA Rangeオブジェクト » Endプロパティ » 最終行番号を取得するRange("A1").End(xlDown).Rowでオーバーフロー