- ベストアンサー
オーバーフローします
sub X() dim a a=1000*33 end sub たったこれだけですが「オーバーフロー」というエラーになります。なぜでしょうか vb5、access97のVBAでも同じです。
- みんなの回答 (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 のようにしてやっても良いです。
その他の回答 (2)
- taocat
- ベストアンサー率61% (191/310)
こんにちは。 変数aがVariant型で、かつ、 1000*33 と整数型だけで計算しているからです。 試してみれば分かりますが、 a= 1000000*33 (長整数型×整数型) a= 10000* 3.3 (整数型×浮動小数点型) はOKです。 要するにVariant型は右辺の型の「入れ物の大きな方」に合わせて計算するということですね。 以上です。
補足
ありがとうございます。 ところで Sub X() Dim a As Double a = 1000 * 33 End Sub としてもエラーがきます。 これはどう考えたらいいでしょうか。
- TK1961
- ベストアンサー率35% (16/45)
変数aで扱える数値より大きい数値を代入しようとしているからです。 1000*33は33000ですが、ヘルプによると、整数型では、プラマイ32767の範囲内のはずなので、明らかにオーバーしています。 この様な場合、長整数型に指定すれば、なんとかなると思います。 ヘルプより:a=CLng(1000)*33
お礼
ありがとうございました。 現象はよくわかりました。 他の言語でもそうなのか、なぜそうなるのか調べてみます。