-PR-
解決済み

ExcelVBAでの変数を用いたべき乗の計算

  • 暇なときにでも
  • 質問No.11224
  • 閲覧数506
  • ありがとう数4
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 57% (12/21)

以下のコードを実行すると止まってしまいます。#1も同義です。エラーメッセージは、「実行時エラー'6': オーバーフローしました。」と表示されます。最初は変数prAをIntegerで定義していたので、Longにすれば解決するはずの問題と思ったのですが、解決しません。なぜこれではうまくいかないのか教えて下さい。バグでしょうか?回避して#1の行を#2や#3のようにかくとエラーは出ずに実行できました。よろしくご教示下さい。

Sub problem()

'身長を定義する
Dim prH As Integer

'体重を定義する
Dim prW As Integer

'標準体重を定義する
Dim prA As Integer

'肥満度を定義する
Dim prB As Integer
prH = InputBox("身長[単位:cm]を入力してください。")
'prW = InputBox("体重[単位:kg]を入力してください。")
prA = prH * prH * 2 * 22 / 10000
MsgBox (prA)
End Sub

'#1 'prA = prH * prH * 22 / 10000
'#2 'prA = prH / 100 * prH / 100 * 22
'#3 prA = prH ^ 2 * 22 / 10000
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル3

ベストアンサー率 100% (1/1)

nekomilkさんと内容は同じです。
まず、VBの演算処理ですが、通常の計算式と同じように左から計算して行きます。その時、データ型は演算対象になる変数や数値、演算結果で、通常最も精度の高いデータ型が使用されます。
#1の場合だと、prHも22も整数型ですから、内部処理形式も整数になり、prH*prH*22の演算を行った時点で演算結果が整数範囲を超えればオーバーフローします。
#2、#3の場合だと、除算"/"や、べき乗"^"演算を行うので、その時点で内部処理形式は通常倍精度浮動小数点型になります。なので以後は、普通の演算でオーバーフローすることはないでしょう。
内部処理形式とは、演算結果を一時的に保存している領域のデータ型のことです。
nekomilkさんもおっしゃってる通り、問題なのは代入時ではなくて、計算過程です。計算過程でオーバーフローしてるんです。#2,#3でオーバーフローが起こらないのは、演算過程で整数型ではなくなっているからです。
例えprAをLongと宣言していても、演算には関係ありません。最終的な演算結果が整数の範囲内なら、整数型のままでもOKということですね。
お礼コメント
TFUND

お礼率 57% (12/21)

どうもありがとうございました。
コンピュータ自身に対する勉強などまだまだ足りないよう
です。もっと勉強していきます。

これからもよろしくお願い致します。
投稿日時 - 0000-00-00 00:00:00
関連するQ&A
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル10

ベストアンサー率 24% (20/83)

Integerは、-32,768 ~ 32,767 なので 私の場合、prH*prH*2の結果が55778なので、 その時点で、OverFlowします。 なので、prHをLongにするか CLng()を使うと 計算できるようになります。 /や^で、それが回避されるのは、演算結果の型が Double型になるので、Overしないものと思われます。 結果が、、-32,768 ~ 32,767 の範 ...続きを読む
Integerは、-32,768 ~ 32,767 なので
私の場合、prH*prH*2の結果が55778なので、
その時点で、OverFlowします。
なので、prHをLongにするか CLng()を使うと
計算できるようになります。
/や^で、それが回避されるのは、演算結果の型が
Double型になるので、Overしないものと思われます。
結果が、、-32,768 ~ 32,767 の範囲内であれば
prA自体は、Integerでもいいのではないでしょうか。
ポイントは、代入時ではなく、計算過程でOverflowしているということですね♪
お礼コメント
TFUND

お礼率 57% (12/21)

御回答どうもありがとうございます。

まだ疑問は残ります。

prHは人の身長なので、100~200の値を想定して
います。

私はprHに数値の100を代入してずっと計算して
きたのですが、prAだけをLongとしても駄目で
した。prHもLongと定義するとうまくいきました。
ただ、prHには100しか代入しないのになぜLong型
に定義しないとうまく実行できないのか疑問です。
prA = prH * prH * 22 / 10000
このコードでは、prAをLong型に定義した以上、
Long型しかprAには代入できないのでしょうか?
それならばprHをLong型に定義しないとうまくいか
ないのは納得できます。

それから100をずっと代入しているので、Double型にはなりません。ずっと整数値で計算されています。具体例を書いておきます。問題の行のコードを以下のようにべき乗の└を用いて書くと、prHに100を代入している以上、整数値でOverflowするはずですが、Integerのままでもこの場合はうまく実行できます。疑問は解決していません。
prA = prH ^ 2 * 22 / 10000
投稿日時 - 0000-00-00 00:00:00


このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


新大学生・新社会人のパソコンの悩みを解決!

いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ