エクセルVBAでオーバーフローが発生する理由とは?

このQ&Aのポイント
  • エクセルVBAでオーバーフローが発生する理由について解説します。具体的なコードとともに、オーバーフローが起こる条件とその対処法について説明します。
  • エクセルVBAで使用するCurrency型の範囲や特徴について解説します。Currency型の最大値や最小値、およびデータ型の変換方法について詳しく説明します。
  • エクセルVBAでオーバーフローが発生する具体的な例を紹介します。特定の操作や計算によってオーバーフローが発生することを示し、解決策を提案します。
回答を見る
  • ベストアンサー

単純【エクセルVBA】なぜオーバーフローになる?

環境 Excel2003 Win7 64bit -------------- Const C as Currency = 50000000 Sub Test()   Dim A as Currency   Dim B as Currency   B = 6823695200   A = B \ C '←ここでオーバーフロー End Sub --------------- 「A = B \ C」 ↑この式はオーバーフロー時、ウォッチ式上では、 型: Integer と表示されますが、これも不思議。 また、「A = B \ C」を、 A = CCur(B) \ CCur(C) としても、オーバーフロー。 それと、 「Const C as Currency = 50000000」を、 「Const C = 50000000」 としても、同様にオーバーフロー。 Currency型は、 -922,337,203,685,477.5808~922,337,203,685,477.5807 のはず。 このオーバーフローは、一体なぜ?

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

  • ベストアンサー
  • uruz
  • ベストアンサー率49% (417/840)
回答No.3

>どのようにして行えば良いのでしょうね。 No2です。 先のの回答に書いたんですけどねぇ。 A = Int(B / C) 通常の余算演算子 / を使用します。 小数点以下を切り捨てる場合は Int() 関数で切り捨てます。

aw-dlay
質問者

お礼

度々、ありがとうございます。 >先のの回答に書いたんですけどねぇ。 >A = Int(B / C) 気付かず、すみませんでした。 追加でお聞きしたいのですが、 ------- Dim D as Long D = B Mod C '←オーバーフロー ------- こちらについては、どう考えればよろしいでしょうか。 また宜しければ、教えて下さい。

aw-dlay
質問者

補足

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1082307450 こちらに方法がありました。 こちらで解決するか、とりあえずやってみたいと思います。 ダメそうなら、また戻ってきます(笑)

その他の回答 (4)

  • uruz
  • ベストアンサー率49% (417/840)
回答No.5

>それより上(つまり、Long以上)であった場合にも、 このコードは使えますでしょうか。 \、Modはやや特殊な演算子なので整数型という制限があります。 他には論理演算子も整数型を対象とした演算子です。 その他の演算子(+,-,*,/ など)は全ての型で使用できます。

aw-dlay
質問者

お礼

大変よく分かりました。助かります。 この度は何度も回答して頂き、ありがとうございました。

  • uruz
  • ベストアンサー率49% (417/840)
回答No.4

>D = B Mod C '←オーバーフロー >こちらについては、どう考えればよろしいでしょうか。 Mod演算子も\演算子と同様に除数と被除数はどちらも整数型であることが必要です。 BとCの型と数値が最初の質問の通りなら整数型に自動変換されるタイミングでオーバーフローが発生します。 \演算子とMod演算子は整数型専用の演算子と思ってください。 A = Int(B / C) D = B - (C * A)

aw-dlay
質問者

お礼

またしても、ありがとうございます。 >A = Int(B / C) 初歩的な質問なのですが、 B/C の計算結果(つまり、その値)が、Integer型(整数型)ではなく、 それより上(つまり、Long以上)であった場合にも、 このコードは使えますでしょうか。 使えない場合には、使えるものを教えて頂けると非常に有り難いです。 何度もすみません。宜しくお願い致します。

  • uruz
  • ベストアンサー率49% (417/840)
回答No.2

\ 演算子 この演算子の場合、除数と被除数はどちらも整数型であることが必要です。 他のデータ型で使用した場合は内部処理で整数型に自動変換されて実行されます。 今回の場合は Currency型→整数型 の内部処理でオーバーフローが発生した。 A = Int(B / C)

aw-dlay
質問者

お礼

なるほど。 では、Currency型(というか、大きな数値)の割り算は、 どのようにして行えば良いのでしょうね。 もし、お分かりでしたら教えて下さい。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

¥演算子の精度が、通貨型よりも低いから?

aw-dlay
質問者

お礼

早速の回答をどうもありがとうございます。 「精度」という言葉に、そんなものがあるのかと面食らいました。 では、このような場合、どうしたら良いでしょう? もし、お分かりでしたら教えて下さい。

関連するQ&A

  • エクセルVBAの次のコードの意味教えて下さい。

    Sub macro1() Dim a As Integer, b As Integer a = 1 b = 5 macro2 a, b MsgBox a + b End Sub Sub macro2(c As Integer, d As Integer) c = c * 10 d = d * 5 End Sub 答えは35と出ます。 よろしくお願いします。

  • VBAでオーバーフローが出て困っています(エクセル2000です)

    自動売買ロボット作成マニュアルという本のなかに株価をダウンロードするためのプログラムとしてソースが書かれているのですが、オーバーフローとなってしまい、実行できません。lastrow = (Range("B4").End(xlDown).Row + 1)のところでオーバーフローを起こします。この文章だけでは対処できないと思いますのでプログラムを写します。 恐れ入りますが、お助けください。 Sub Calc() Dim code As String Dim data_length As Integer, date_temp As Date Dim day_s As Integer, month_s As Integer, year_s As Integer Dim day_e As Integer, month_e As Integer, year_e As Integer Dim row_length As Integer code = input_temp(2) data_length = -100 date_temp = DateAdd("d", data_length, Now) day_e = Day(Now) month_e = Month(Now) year_e = Year(Now) day_s = Day(date_temp) month_s = Month(date_temp) year_s = Year(date_temp) Range("B4:R65000").ClearContents For i = 0 To Abs(data_length) * 0.65 Step 50 If i = 0 Then lastrow = "4" For wtbl = 19 To 25 url = "URL;http://table.yahoo.co.jp/t?s=" & code & "&a=" & month_s & "&b=" & day_s & "&c=" & year_s & "&d=" & month_e & "&e=" & day_e & "&f=" & year_e & "&g=d&q=t&y=" & i & "&z=" & code & "&x=.csv" Call Get_Data If Range("B4") = "日付" Then Exit For Else Range("B4:H54").ClearContents End If Next Else url = "URL;http://table.yahoo.co.jp/t?s=" & code & "&a=" & month_s & "&b=" & day_s & "&c=" & year_s & "&d=" & month_e & "&e=" & day_e & "&f=" & year_e & "&g=d&q=t&y=" & i & "&z=" & code & "&x=.csv" lastrow = (Range("B4").End(xlDown).Row + 1) Call Get_Data Range("B" & lastrow, "H" & lastrow).Delete row_length = (Range("B4").End(xlDown).Row) If row_length - lastrow < 49 Then Exit For End If End If Next Range("B5:H65000").Sort Key1:=Range("B5") lastrow = Range("B4").End(xlDown).Row Range("B5", "B" & lastrow).NumberFormatLocal = "yyyy/mm/dd" Range("C5", "H" & lastrow).NumberFormatLocal = "0" Range("A1").Select End Sub Sub Get_Data() With ActiveSheet.QueryTables.Add(Connection:=url, Destination:=Cells(lastrow, 2)) .Name = "Yahoo" .FieldNames = False .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = False .RefreshPeriod = 0 .WebSelectionType = xlSpecifiedTables .WebFormatting = xlWebFormattingNone .WebTables = wtbl .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = False .Refresh BackgroundQuery:=False End With End Sub

  • エクセル VBA

    A1,A2,A3→RAND()*99+1 B1→MAX(A1:A3) Sub test() Worksheets("sheet1").Calculate Dim x As Integer x = Range("B1") Range("C1").Value = x End Sub このように記述すると、B2とC2で結果が変わってしまうのですが、どうしてでしょうか?結果を同じにするにはどうすればいいですか?

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

  • エクセルVBA・完全一致の情報

    既に出ているかもしれませんが… 文字列の完全一致で、セルの座標を取得が上手くいきません。 現在は完全一致した場所を塗りつぶしています。 A B C 1 2 AAA 3 Sub Find_moji() Dim a As Integer Dim b As Integer Dim c As Object For Each c In Worksheets("特産品素材").Range("a1:a3") If c.Value Like "AAA" Then c.Interior.ColorIndex = 3 '赤 End If Next c End Sub 求めたい結果としては、AAAが入っているA2を塗りつぶして、AAAの座標(X座標1、Y座標)の情報を取得したいのです。 お願い致します。

  • 擬似マインスイーパー

    任意の地雷を設置するというプログラムです。 この中で地雷を*に、安全地帯を空白にしたいのですがやり方がわからないので、わかる方お願いします。 Sub mine() Dim minefield(11, 13) As Integer Dim i As Integer, a As Integer, b As Integer Dim c As Integer c = InputBox("地雷の数を決めます") Randomize For i = 1 To c a = Int(Rnd * 10) + 1 b = Int(Rnd * 12) + 1 If minefield(a, b) = 9 Then i = i - 1 minefield(a, b) = 9 Next i countMine minefield, 10, 12 showInt minefield, 10, 12 ' show minefield, 10, 12 End Sub Sub countMine(f() As Integer, h As Integer, w As Integer) Dim i As Integer, j As Integer Dim a As Integer, b As Integer Dim x As Integer For a = 1 To 10 For b = 1 To 12 If f(a, b) < 9 Then x = 0 If f(a, b - 1) = 9 Then x = x + 1 '左に地雷があるか If f(a, b + 1) = 9 Then x = x + 1 '右に地雷があるか ' ... この部分に追加したいのだが ... f(a, b) = x End If Next b Next a End Sub Sub showInt(f() As Integer, h As Integer, w As Integer) Dim i As Integer Const a As Integer = 7 Const b As Integer = 3 Do While h > 0 For i = 1 To w Cells(a + h, b + i) = f(h, i) Next i h = h - 1 Loop End Sub

  • オーバーフローします

    sub X() dim a a=1000*33 end sub たったこれだけですが「オーバーフロー」というエラーになります。なぜでしょうか vb5、access97のVBAでも同じです。

  • Excel VBAライフゲーム

    ExcelのVBAでライフゲームを作りたいのですが、次のプログラムの途中以降がわかりません。 もしよろしければ、このつづきの簡単な実行できるVBAライフゲームを教えてください。 続きのプログラムを教えていただけたら幸いです。 Option Explicit Const ALIVE As Integer = 1 Const DEAD As Integer = 0 Const SIZE As Integer = 19 Const Tmax As Integer = 100 Dim C(SIZE, SIZE) As Integer Sub LifeGame() Dim InitRate As Single Dim T As Integer Dim N As Integer Dim Cnext(SIZE, SIZE) As Integer Dim I As Integer, J As Integer InitRate = -1 Do While InitRate < 0 Or 1 < InitRate Loop For I = 0 To SIZE For J = 0 To SIZE If Rnd() < InitRate Then C(I, J) = ALIVE Else C(I, J) = DEAD End If Next J Next I For T = 1 To Tmax For I = 0 To SIZE For J = 0 To SIZE If C(I, J) = ALIVE Then Cells(I + 1, J + 1).Value = "■" Else Cells(I + 1, J + 1).Vallue = "" End If Next J Next I For I = 0 To SIZE For J = 0 To SIZE N = Count(I, J) Next J Next I For I = 0 To SIZE For J = 0 To SIZE C(I, J) = Cnext(I, J) Next J Next I Next T End Sub Function Count(I As Integer, J As Integer) As Integer End Function

  • エクセル2010のvbaについて

    Sheet1に挿入したイメージ(ActiveX)をクリックすると数字が上がって 実行中にもう一度同じイメージをクリックすると止まるようにしたいのですが 数字が上がったまま止まりません(上限はあるのでオーバーフローはしません) Worksheet_SelectionChangeで(ActiveXのイメージがもう一回押されて) 選択セルが変わったら停止としたかったのですが反応しません イメージをクリック(実行)してもう一回押すとクリックしている間は止まりますが離すと再開されます コードにクリックされた回数がわかるようにしましたが増えません 説明が分かりにくかったら追記します 回答お願いします クラスモジュールのコード(イメージの名前によって少し処理を変えるためです) Private Sub myImg_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Dim i As Integer, a, b, C As POINTAPI, obj As OLEObject i = myImg.Index - 1 Call GetCursorPos(C) Set obj = ActiveWindow.RangeFromPoint(C.X, C.Y) b = Range("A1") Range("A1") = obj.Name Range("A2") = Range("A2") + 1    'クリックされた回数が分かるようにするため追加 If Range("A2") = 2 Then Range("C1").Select End If Range("A3") = "B1" If obj.Name = 2 Then Range("A3") = "B3" Range(Range("A3")).Select End Sub Sheet1のコード Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Target.Address <> Range(Range("A3")).Address Then Exit Sub Do While ActiveCell < Range("A4") * 100 If ActiveCell.Address <> Range(Range("A3")).Address Then Exit Do End If DoEvents ActiveCell = ActiveCell + 1 Loop End Sub

  • VBAのデータ型に関する質問です。 以下のような宣言と処理をしました。

    VBAのデータ型に関する質問です。 以下のような宣言と処理をしました。 Dim 数値1 As Integer Dim 数値2 As Integer Dim 数値3 As Long 数値1=Range("b5").Value 数値2=Range("c5").Value 数値3=数値1*数値2 この式では、数値3がLongの型ではなくIntegerになってしまいオーバーフローのエラーになってしまいます。(10000×5の場合等)Long型のまま代入する方法がありましたら教えてください。よろしくお願いいたします。

専門家に質問してみよう