Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


11480 / 13646 ツリー ←次へ | 前へ→

【15875】オーバーフローについて ○○さん 04/7/9(金) 22:57 質問[未読]
【15877】Re:オーバーフローについて ちゃっぴ 04/7/9(金) 23:17 回答[未読]
【15878】Re:オーバーフローについて Asaki 04/7/9(金) 23:27 回答[未読]

【15875】オーバーフローについて
質問  ○○さん  - 04/7/9(金) 22:57 -

引用なし
パスワード
   あるlong型の変数(配列)に、計算式を代入(足しこみ)しています。


↓こんな風に
For i = 0 to 2
  longResult(i) = lngResult(i) + ((intA) * (intB) * (1.005) * (intC))
Next

ここで、
・intA = 1050
・intB = 350
・intC = 6
である場合、このロジックを通ると、
「オーバーフローしました」
と、エラーになってしまいます。
大して大きな値ではないと思うのですが…
おまけに、「longResult(i)」をDouble型にしても同じでした。。。
どう対処すれば良いかお教え下さい。
お願い致します。

ちなみに使用しているのはoffice2003のExcelです。

【15877】Re:オーバーフローについて
回答  ちゃっぴ  - 04/7/9(金) 23:17 -

引用なし
パスワード
   Decimal型を利用してみてはいかがでしょう?

Dim vntResult As Varinat 'Variantで宣言

vntResult(i) = vntResult(i) + CDec((intA) * (intB) * (1.005) * (intC))

CDecで明示的にDecimal型に変換し、Variant変数に代入してます。
ヘルプでDecimal型をお調べください。

【15878】Re:オーバーフローについて
回答  Asaki  - 04/7/9(金) 23:27 -

引用なし
パスワード
   こんばんは。

たぶん問題は lngResult() のデータ型ではなく
(intA) * (intB)
この部分です。(因みに、なんでカッコが付いてるのでしょう?)

名前からして、Integer型の変数ではと推測しますが、
Integer型 同士の演算は結果もInteger型ですから、
演算結果がInteger型で扱える範囲を超えるとオーバーフローします。
intA * intB = 367500 >> 32,767 :Integer型の最大値

御提示の例ではLong型で間に合いそうですので、データ型を変えるか、型変換します。
lngResult(i) = lngResult(i) + (CLng(intA) * CLng(intB) * (1.005) * (intC))

11480 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free