• ベストアンサー

オーバーフローします

sub X() dim a a=1000*33 end sub たったこれだけですが「オーバーフロー」というエラーになります。なぜでしょうか vb5、access97のVBAでも同じです。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#2補>としてもエラーがきます。これはどう考えたらいいでしょうか。 元の質問については、#2で解説されている通りなので、補足について Dim a as Double としても同じエラーが起こってしまうのは、 #2で解説されていることと同じです。 入れ物は、Double になったのですが、右辺は、整数型しか現れていないので、整数型(Integer)の範囲で計算しようとしそれでオーバーフローを起こしてしまうのです。 普通に整数の定数を記述して整数型になってしまう場合、 一部の整数を長整数型(long)で記述してやると全体が長整数型で計算するようになります。 例えば、次のように記述します。 a = 1000& * 33 1000& の様に定数の最後に& を付けることで長整数型の定数だと表すことができます。 ちなみに、Double で計算させたい場合は、1000# の様に# をつけてやることでDouble 型の定数だと示すことができます。 なので Dim a As Double a = 1000 * 33 の場合 a = 1000# * 33 のようにしてやっても良いです。

___xxx
質問者

お礼

ありがとうございました。 現象はよくわかりました。 他の言語でもそうなのか、なぜそうなるのか調べてみます。

その他の回答 (2)

  • taocat
  • ベストアンサー率61% (191/310)
回答No.2

こんにちは。 変数aがVariant型で、かつ、  1000*33 と整数型だけで計算しているからです。 試してみれば分かりますが、  a= 1000000*33 (長整数型×整数型)  a= 10000* 3.3 (整数型×浮動小数点型) はOKです。 要するにVariant型は右辺の型の「入れ物の大きな方」に合わせて計算するということですね。 以上です。  

___xxx
質問者

補足

ありがとうございます。 ところで Sub X() Dim a As Double a = 1000 * 33 End Sub としてもエラーがきます。 これはどう考えたらいいでしょうか。

  • TK1961
  • ベストアンサー率35% (16/45)
回答No.1

変数aで扱える数値より大きい数値を代入しようとしているからです。 1000*33は33000ですが、ヘルプによると、整数型では、プラマイ32767の範囲内のはずなので、明らかにオーバーしています。 この様な場合、長整数型に指定すれば、なんとかなると思います。 ヘルプより:a=CLng(1000)*33

関連するQ&A