Home » Excel VBA Rangeオブジェクト » Endプロパティ » 最終行番号を取得するRange("A1").End(xlDown).Rowでオーバーフロー

最終行番号を取得するRange("A1").End(xlDown).Rowでオーバーフロー

対象:Excel2010, Excel2013, Windows版Excel2016

最終行番号を取得するRange(

このサイト・インストラクターのネタ帳のアクセスログをチェックしていて、
「マクロ 最終行取得 xldown オーバーフローしました」
という検索キーワードに気づきました。

[スポンサードリンク]

Range("A1").End(xlDown).Rowでオーバーフローするサンプルマクロ

以下のようなマクロを実行しようとしたのではないでしょうか。
Sub オーバーフローするサンプル()
 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でオーバーフロー

Copyright © インストラクターのネタ帳 All Rights Reserved.

.