仕事用で使っているデータベース、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は別とか???)
コメント