• ベストアンサー

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

以下のコードを実行すると止まってしまいます。#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

  • TFUND
  • お礼率57% (12/21)

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

  • ベストアンサー
  • akira-chi
  • ベストアンサー率100% (1/1)
回答No.2

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

TFUND
質問者

お礼

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

その他の回答 (1)

  • nekomilk
  • ベストアンサー率24% (20/83)
回答No.1

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

TFUND
質問者

お礼

御回答どうもありがとうございます。 まだ疑問は残ります。 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

関連するQ&A

  • ExcelVBA 変数を使ってセルの番地を表す

    Exce2000のlVBAで Sub Macro11() Dim LastColumn As Integer Dim LastRow As Integer LastColumn=5 LastRow=1 Range(("LastColumn"), ("LastRow")).Select End Sub と打ち込むとエラーが出ます. 変数を使ってセルの番地を指定して セルを選択できないでしょうか?

  • Excel2000のVBAでわからないことがあります。

    こんなものを作ってみました。 Sub 理想体重() Dim Sin As Long Dim Tai As Long Sin = InputBox("あなたの体重は?", "体重") Tai = InputBox("あなたの身長は?", "身長") If Tai >= Sin * Sin * 21 / 10000 + 3 Then MsgBox "太りすぎです" ElseIf Tai <= Sin * Sin * 21 / 10000 - 3 Then MsgBox ("痩せすぎです") Else MsgBox ("標準です") End If End Sub 結果はきちんと出てくるのですが、最初の変数宣言のところがわかりません。 最初は、Longではなく、Integerにしたのですが、オーバーフローのエラーが出たので、Longに変更したところ、きちんと出てくるようになりました。 しかし、なぜ、Integerではだめなのかがわかりません。私としては、Integerは32,767までの数字が入るのだから、身長や体重を入れたぐらいだと、オーバーフローにはならないのではないかと考えています。 きっと、根本的なものがわかっていないんだとは思うのですが、違いを教えていただければうれしいです。 よろしくお願いいたします。 (VBAを勉強したばかりです。)

  • ExcelVBA 行削除

    ExcelVBA 行削除 行削除マクロを組んでみようと、以下のソースを書きましたが エラーが出てしまいます。理由分かりますか?? ==ソース========================= Sub DeleteRows() Dim Va1 As Integer, Va2 As Integer, Va3 As Integer Worksheets("Sheet1").Activate Va1 = Selection.Row Va2 = Application.InputBox(Prompt:="何行消しますか??", Type:=1) Va3 = (Va1 + Va2) - 1 Rows("Va1:Va3").Delete End Sub ============================== やりたい事は、選択されているセルの行から数行(行数は数値指定)下までを選択して、 それを削除したいだけです。

  • 変数が勝手に変わります

    Dim i As Integer:Dim i2 As Integer:Dim card(5) As Integer:Dim expectPoint0card(1) As Integer '0枚のカードを交換する場合のすべての選択肢の期待値 Dim expectPoint1card(5) As Integer Sub porkerGame() card(1) = 1: card(2) = 2: card(3) = 3: card(4) = 4: card(5) = 5 getExpectPoint1card expectPoint1card End Sub Sub getExpectPoint1card(expectPoint1card() As Integer) Dim tesu1 As Integer:Dim sum1 As Integer For i = 1 To 5 getTesuSum1 i, tesu1, sum1 expectPoint1card(i) = sum1 / tesu1 Next i End Sub Sub getTesuSum1(rowNumber As Integer, tesu1 As Integer, sum1 As Integer) Dim card2(5) As Integer:tesu1 = 0:sum1 = 0 MsgBox rowNumber copy card, card2, 5 MsgBox rowNumber For i = 4 To 55 MsgBox rowNumber card2(rowNumber) = i addTesuSum card2, tesu1, sum1 Next i End Sub Sub copy(row() As Integer, row2() As Integer, i2 As Integer) For i = 1 To i2 row2(i) = row(i) Next i End Sub 上記のプログラムで、ウィンドウに1,6,4,5,6と表示され、その次には、エラーが表示します。僕は、ウィンドウに表示される変数RowNumberの値がしばらくの間は1のままであるようにプログラムを書いたつもりなのですが、変数rowNumberの値が変わるのは、どうしてでしょうか?教えてください。お願いします。

  • マクロの変数のことで

    Sub test() Dim x As Range, y As Range Dim i As Integer i = 0 Set y = Application.InputBox("", "Paste", Type:=8)  For Each x In Selection   x.Cut y.Offset(i, 0)   i = i + 1  Next x End Sub 上記マクロは、選択されているセルを切り取って、指定したセルを基点として下方向に貼り付けるものです。 "i"の初期値を"1"にすると成功しますが、"0"だとエラーになります。"-3"などにすると、値がゼロになった時点でエラーになります。なぜ"i"がゼロになるとエラーになってしまうのでしょうか?  指定したセルを基点にして貼り付けられるようにするには、どうすればいいでしょうか?

  • 階乗のマクロ

    階乗のマクロを作りたいのですが、全然できません。どこを変えたらいいのか教えて下さい。ちなみに今こうなっています。 ------------------------------------------------ Sub exam5() Dim intA As Integer Dim intB As Integer Dim intC As Integer intA = Application.InputBox("数値を入力してください。") intB = (intA - 1) intC = (intA) * (intB) MsgBox (intC) End Sub Function kaijou(intA As Integer, intB As Integer) As Integer kaijou = intA * intB End Function ------------------------------------------------ どうかお願いします。

  • VBAのプロシージャーと変数の名前の区別について

    VBAの初心者です。教えてください。 Sub ex() Dim a As Integer Dim b As Integer a = 2 a a, b MsgBox b End Sub Sub a(a As Integer, b As Integer) b = a End Sub 上記のプログラムを実行するとうまくいきません。VBAのプロシージャーと変数って同じ名前を使うとだめなのですか?教えてください。

  • InputBox  String型・Variant

    VBAです。 InputBox  String型・Variant型がエラーにならない理由がわかりません。 Sub 日付型() Dim 日 As Date 日 = InputBox("値をいれてください") End Sub Sub 数値型() Dim i As Long i = InputBox("値をいれてください") End Sub Sub 通貨型() Dim 円 As Currency 円 = InputBox("値をいれてください") End Sub Sub String型() Dim a As String a = InputBox("値をいれてください") End Sub Sub Variant型() Dim v As Variant v = InputBox("値をいれてください") End Sub String型・Variant型以外は、 「実行時エラー '13'; 型が一致しません。」になります。 String型・Variant型はならない理由を教えてください。ご回答よろしくお願いします。

  • ExcelのAutoFilter への変数の使用がうまく行きません!

    ExcelのAutoFilter への変数の使用がうまく行きません! Windows XP Home Edition SP3 Office XP Personal 2002 Excel 2002 下記の NNN に 「 InputBox に 入力した整数 」 を変数で使用したいのですが、 どのようにすればよろしいでしょうか? 何卒、ご教示のほどをお願い致します。 Sub TEST1() Dim NNN As Integer Dim msg As String Dim i As Integer Application.ScreenUpdating = False   msg = "【整数】 を入力してください。"   NNN = InputBox(msg)   If ActiveSheet.AutoFilterMode Then    With ActiveSheet.AutoFilter    For i = 88 To 90    .Range.Rows(1).Cells(i).AutoFilter Field:=i, Criteria1:="<=NNN" '←この NNN です    Next i   End With   End If Application.ScreenUpdating = True End Sub

  • 変数を引き継ぐには...

    Public Sub CommandButton1_Click() Dim m As Integer m = 1 run "macro8()" End Sub Sub Macro8() range("a1")=m end sub run を実行したときに,変数mを引き継ぐ方法を教えてください。