お品書き
書き直し中…
とりあえず、中へどうぞ
↓↓↓
スポンサーリンク

ACCESSで「オーバーフローしました。」のエラー

PC/ネット
仕事用で使っているデータベース、Microsoft Access を使っていますが、入力作業中に、

「オーバーフローしました。」

のエラーで突然停止。

結論から言うと

変数の宣言で整数型(Integer)を使用していたのですが。

この「 Integer 」で扱える数値の範囲というのは

-32,768 から 32,767 まで(整数のみ)

なんだとか!!

知らなかった、というか意識して使ったことなかった、問題になったことないので(^^;;;)

物件とか顧客とかに番号をふって管理していまして。

フォームを開いた時に、自動的に最終番号に+1した数値が入っているようにVBAを書いていたのですが
Private Sub コマンド1_Click() Dim bangou As Integer DoCmd.OpenForm "入力", acNormal, "", "", , acNormal DoCmd.GoToRecord , "入力", acLast bangou = Forms![入力]![番号] DoCmd.GoToRecord , "入力", acNewRec Forms![入力]![番号] = bangou + 1 End Sub
そこに、32,768番目のデータを追加しようとすると、オーバーフローになってしまうわけですね(^^;)

いやぁ、今回は焦りました、直せないかと・・・orz

※データベースは、長く使っているほど、データが壊れた時のダメージがクリティカルになっていきますね。。。

解決方法 ⇒ 変数の宣言を、「 Integer 」から「 Long 」に変えてやればOK

長整数型(Long)は -2,147,483,648 から 2,147,483,647 までの数値を扱えるそうです。

逆に言えば、2,147,483,647より大きい数値を使おうとするとエラーが出る、というわけですね・・・

これ、注意しないといけませんね、

例えば、番号に分かりやすく年月日+番号3桁(20190901001)みたいな付け方をしてしまうと、一瞬で超えてしまいますね(^^;)

さらに、これについて調べていたら、Integer 同士で計算させると、自動的に結果も Integer にされてしまうという注意点がVBAにはあるとの事。

例えば、330 × 100 という計算をさせると、どちらも Integer ですが、結果は Integer の使用可能範囲を超えてしまうので、「オーバーフロー」のエラーが出てしまうとのこと。。。

この場合は、CLng(330) × 100 のように、最初から数値が少なくてもLongで扱わせるように指定してやればよいそうです。

これ、滅多にないケースかも知れませんが、VBA で計算させている場合、注意が必要ですね。。。

Integerは廃止される方向?
こちらの解説によると
日本語訳抜粋
Integerデータ型とLongデータ型は、両方とも正または負の値を保持できます。これらの違いはサイズです:整数変数は-32,768〜32,767の値を保持でき、ロング変数は-2,147,483,648〜2,147,483,647の範囲です。従来、VBAプログラマは、必要なメモリが少ないため、整数を使用して小さな数値を保持していました。ただし、最近のバージョンでは、VBAは整数型として宣言されている場合でも、すべての整数値をLong型に変換します。したがって、整数変数を使用してもパフォーマンス上の利点はなくなりました。実際、VBAは変数を変換する必要がないため、Long変数はわずかに高速になる場合があります。
とのこと。そうすると、もしかして、Integerは将来的には廃止される方向かも知れませんね。

以前は、少しでも消費メモリを少なく抑えるために、必要がない場合はLongを使わないという慣習がVBAプログラミングではあったようですが、現在はメモリ量が大幅に増えたので、問題にならなくなったということでしょうか。

最近のバージョンのVBAではIntegerで宣言しても内部でLongに変換してしまうため、変換する手間が余計にかかるため、最初からLongで指定したほうが高速に動作する結果になるのだとか。

つまり、今後 Integer は使用しないほうが良いと言う事になりますね。。。

(自動で変換してくれるはずなのに、ACCESS VBA で実行するとエラーで動かないのは何故なんだろう・・・ACCESSのVBAは別とか???)

コメント