• ベストアンサー
  • 暇なときにでも

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

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数611
  • ありがとう数4

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

  • ベストアンサー
  • 回答No.2

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • 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 変数を使ってセルの番地を表す

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

  • 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 ============================== やりたい事は、選択されているセルの行から数行(行数は数値指定)下までを選択して、 それを削除したいだけです。

その他の回答 (1)

  • 回答No.1

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 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のプロシージャーと変数って同じ名前を使うとだめなのですか?教えてください。

  • ExcelVBA  For・・・Next

    今年に入ってからExcelVBAを勉強し始めました For・・・Nextについて疑問があります 例えば下記のような Sub aa() Dim i As Integer For i = 1 To 10 Next ActiveCell.Value = i End Sub 上記を実行するとアクティブセルは[11]になります 普通に考えると[10]だと思うのですが? なぜでしょうか? お願いします

  • VBAで縦一列に数字を入力したい

    Private Sub CommandButton1_Click() Dim n As Integer Dim i As Integer Dim x As Integer For i = 1 To n x = i + 3 n = InputBox("層数の値を入力してください") Cells(3, 1).Value = ("基板") Cells(x, 1).Value = i x = x + 1 Next End Sub 上記のようなマクロを組んだのですが、4行目に1が入ってとまってしまいました。 これを完成させるにはどうしたらいいでしょうか?

  • ExcelVBAで実行時エラーが出ます

    このようなマクロを作りました。 Sub WriteCsv() Dim myTxtFile As String, myFNo As Integer Dim myLastRow As Long, i As Long Dim j As Long Dim aaa As Worksheet Set aaa = ActiveSheet Application.ScreenUpdating = False j = 0 myTxtFile = ActiveWorkbook.Path & "\Adress List.txt" Worksheets("List").Activate myLastRow = Range("A4").End(xlDown).Row myFNo = FreeFile Open myTxtFile For Output As #myFNo -----※ For i = 4 To myLastRow If Cells(i, 3) = 1 Then Write #myFNo, Cells(i, 5) j = j + 1 End If Next Close #myFNo   ・・・・   ・・・・ このExcelをフォルダーから実行するとすると、※で[ランタイムエラー52]が発生しますが、デスクトップから実行すると出ません。 どのように修正すればいいんでしょうか? よろしくお願いします。

  • vba ワークシートを変数を用いて開くには

    初歩的な質問ですが、 ワークシートの書式が新しくなったことで、書き換えをすることになりました。 現在のエクセルファイルから、新しいエクセルファイルへ、セルの値を参照しながら VBAにて作業をしたいのですが、 Sub changesheet() Dim iname As String Dim wbname As String iname = InputBox("ブック名を入力", "対象ブックを入力") wbname = "シート2012(" & iname & ").xls" ActiveSheet.Range("P4").Value = Workbooks(wbname).Worksheets("Sheet1").Range("P4").Value End Sub この記載で実行すると、インデックスが有効範囲にありません とエラーになってしまいます。 変数(inputbox)を用いたセルの参照はどのように記述すればよろしいでしょうか? よろしくお願いします。

  • WORD VBA

    マウスがある位置の色の情報を表示するソフトを利用して、 RGB情報を得ています。(例 RGB(204, 035, 035) 。 次のWORDマクロ動かし、RGB情報を手入力して欲しい結果を得ています。しかし、せっかくクリップボードに”RGB(204, 035, 035)”が入っていますので、それを自動的に以下のマクロに取り入れたいと考えております。どのようにすれば良いかアドバイスお願いできないでしょうか? なお, OSはWindows7を使用しています。Wordは2007です。 Sub ColorPaste() ' Dim Red As Integer Dim Green As Integer Dim Blue As Integer Red = InputBox("赤の数字を入れてください。") Green = InputBox("緑の数字を入れてください。") Blue = InputBox("青の数字を入れてください。") Selection.InlineShapes(1).Fill.BackColor = RGB(Red, Green, Blue) End Sub

  • ExcelVBA どこが間違えていますか?

    ExcelVBA 初心者です。 下記のようなプロシージャを人様の作ったのをコピーして作ったのですが意図したとおりになりません。どこが間違っているのか教えてください。 私の意図は選択したフォルダの中の全ファイル(Book)名をアクティブシートのA列に順番に表示したい、です。今は実行すると全部セルA1に表示されてしまって、最後の1つのファイル名しか分かりません。ファイルごとに別のセルに表示したいのです。よろしくお願いします。 Sub ファイル一覧() Dim foldername As String Dim filename As String Dim i As Integer Dim dlg_folder As FileDialog Set dlg_folder = Application.FileDialog(msoFileDialogFolderPicker) Folder_Dialog: dlg_folder.Show If dlg_folder.SelectedItems.Count <> 1 Then Exit Sub Else foldername = dlg_folder.SelectedItems.Item(1) MsgBox "選択したフォルダは " & foldername & " です。" filename = Dir(foldername & "\*.xls", vbNormal) If filename = "" Then MsgBox "Excelファイルがありません。" GoTo Folder_Dialog End If End If Set dlg_folder = Nothing Do While filename <> "" For i = 1 To Workbooks.Count Cells(i, 1).Value = filename i = i + 1 Next i filename = Dir() Loop MsgBox "フォルダ " & foldername & " の中のファイルはすべて表示されました。" End Sub あれ、なぜかインデントが無効になっています。

  • マクロの変数のことで

    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"がゼロになるとエラーになってしまうのでしょうか?  指定したセルを基点にして貼り付けられるようにするには、どうすればいいでしょうか?

  • VBA

    ExcelのVBAについて質問です。 1000以下の任意の整数nを画面入力から読み込んで、1+2+3+4+・・・+nの合計値をセルA1に表示させたいのですが、1とnの和が足されてしまいます。 どこがおかしいのでしょうか? 指摘お願いします。 以下テキストです。 スペースなどは気にせずテキストの部分でご指摘お願いします Sub ()   Dim i As Integer Dim n As Integer n = Application.InputBox(Prompt:="1000以下の整数を入力してください", Type:=1) If n <= 1000 Then For i = 1 To n iResult = i + 1 Cells(1, 1) = iResult Next i End Sub よろしくおねがいします。

  • VBAに関して

    VBA超初心者の者ですが、ある一つのシートにいくつかの別のファイルを開いて順にコピーして貼り付けていくというプログラムを作成したいと思っています。 Sub naka() Dim k As Integer Dim r As String k = InputBox("ファイル数を記入してください") r = InputBox("範囲を指定してください") Call s1(k, r) End Sub Sub s1(i As Integer, rangearea As String) Dim v As Integer Dim x As String For v = 1 To i Dim OpenFileName As String With OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls") ThisWorkbook.Sheets(1).Range("rangearea").Copy ActiveSheet.Range("1+(rangearea.rows.count*(v-1)),1").PasteSpecial End With Next v End Sub こんな感じでかいてみたものの全く異なったものをかいているようです。同じフォルダ内にコピーするファイルが存在しているものと仮定していますが、マイ ドキュメント内のファイルとしたいです。コピーすべきシートは1としています。大変分かりづらい文章ですが、おかしい部分の指摘、見本等示していただけたらありがたいです。

専門家に質問してみよう