エラーの原因
このエラーが発生する原因はデータの型が扱える形式ではない、または扱える数値の範囲を超えている場合に起こります。
まずエラーを再現してみましょう。

上図のように「B3」セルの数値を「B4」セルにコピーするコードを組んでみました。
Sub TEST()
Dim a As Integer
a = Range("B3")
Range("B4") = a
End Sub
このコードを実行すると
このように「オーバーフローしました。」とエラーが発生しました。

これは「B3」セルに入力されている数値(33000)がデータ型の「Integer」の数値の範囲(32,767)を超えていたために発生したエラーです。
各データ型の数値の範囲は以下の表を確認してみてください。
データ型 | 範囲 |
---|---|
Integer | -32,768 ~ 32,767 |
Long | -2,147,483,648~2,147,483,647 |
Single | -3.40…×1038~3.40…×1038(少数) |
Double | -1.79…×10308~1.79…×10308(少数) |
Variant | すべてのデータが入る |
変数のデータ型については変数の型について Excel(エクセル)マクロ(VBA)で詳しく解説していますので、こちらの記事を参照してください。
エラー発生個所の探し方
ほとんどの場合、長いコードの中のどこでエラーが発生しているのか分かりません。
そこで、まずエラーが発生したら「デバッグ」を押してください。

するとこのようにエラーが発生している場所が黄色くハイライトされていることが分かります。

黄色くハイライトされている範囲を確認してみると、Integer型で宣言されている「a」という変数に「B3」セルの値を代入するときにエラーが発生していることが分かります。
続いて「B3」セルを確認してみると「33000」という数値が入っていることが分かりました。

ここでデータ型の格納できる数値範囲をもう一度確認してみましょう。
データ型 | 範囲 |
---|---|
Integer | -32,768 ~ 32,767 |
Long | -2,147,483,648~2,147,483,647 |
Single | -3.40…×1038~3.40…×1038(少数) |
Double | -1.79…×10308~1.79…×10308(少数) |
Variant | すべてのデータが入る |
「Integer」に格納できるのは最大で「32,767」までの整数であることが分かりました。そのため、33,000を格納しようとしてエラーが発生したのではないかと仮説を立てることができます。
そこで、データ範囲の「32,000」に数値を変えて先ほどのコードをテストしてみます。

すると、上図のようにエラーは発生せずに「B4」セルに値をコピーすることができました。これによってエラーの原因が確定しました。
エラーを修正する
今回のエラーは、格納できる数値範囲よりも対象の数値が大きかったため発生していたので、データ範囲が、より広い「Long」にデータ型を変更することでエラーが発生しなくなるはずです。
そこで、このように「Integer」を「Long」に変更して、もう一度このコードを実行してみます。
Sub TEST()
Dim a As Long
a = Range("B3")
Range("B4") = a
End Sub
すると、エラーは発生せずに「B3」セルと同じ値が「B4」セルに入力されました。

エラーを発生させない対策
データの型を変更する
扱えるデータ型または範囲になっているかどうか確認する
数値なら「long」(長い整数)にしてみる。
少数なら「Double」(長い少数)にしてみる。
それでもだめなら「string」(文字列)にしてみる。
それでもだめなら「variant」これは何でも入るデータ型です。
それでも「オーバーフロー」が発生する場合は
どんなデータ型にしてもダメな場合は書式が悪いのかもしれません。
例えばセルの書式設定が日付になっていて、西暦10000年1月1日以降の日付のシリアル値(2958466以上)がセルに入力されると「######」となってしまいます。

「2958466」という数値は「Long」のデータ型の数値範囲であるにも関わらず、この状態でコードを実行すると「オーバーフローしました。」となってしまいます。

この場合はなんとデータ型を何でも入るはずの「Variant」にしても「オーバーフローしました。」のエラーが出てしまいました。
この場合はセルの書式設定を「標準」や「数値」に変更することでエラーが出なくなります。
正しく表示されているセルの書式をコピペしてみる
「B4」セルを右クリックして、表示されたメニューから「コピー」をクリックします。

「B3」セルを右クリックして、表示されたメニューから「書式設定」を選択して、書式の貼り付けをします。

シート保護がかかっているとうまく修正できないのでシート保護を解除する
解除できないときは【パスワードを忘れた】シート保護の解除方法 Excel(エクセル)を参照してください。
コメント