Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
オーバーフローエラーについて
投稿日時: 19/04/22 16:58:14
投稿者: TATSUYA.ich

対象となるセルに、Roundで計算した結果を格納する際にオーバーフローエラーが発生しますが、理由が不明です。
また、その後、計算した結果をオートフィルしようと思っておりますが、可能でしょうか。
色々と調べておりましたが、良い方法が思い浮かばないため、ご教示くださいませんでしょうか。
 
以上、何卒宜しくお願い申し上げます。
 
 
sub hantei()
 
Dim r As Long
Dim c As Long
Dim LastRow As Long
Dim LastColumn As long
Dim H As Variant
Dim Fold As Variant
 
LastRow = Cells(1, 1).End(xlDown).Row
LastColumn = Cells(1, 1).End(xlToRight).Column
Fold = ThisWorkbook.Path & "\target\rename\"
 
Workbooks.Open FileName:=Fold & "●●.xlsx"
 
Application.DisplayAlerts = False
 
 For c = 2 To LastColumn
  H = Split(Cells(1, c), "_")
  If Right(Cells(1, c), Len("××")) = "××" Then
    Columns(c + 1).Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Cells(1, Selection.Column).Value = H(0) & "_△△"
    Cells(2, Selection.Column).Value = WorksheetFunction.Round(Cells(2, Selection.Column - 2) _
     / Cells(2, Selection.Column - 1), 3) →ここでオーバーフロー
    Cells(2, Selection.Column).AutoFill Destination:=Range(Cells(2,selection.column), Cells(lastrow, selection.column))
  End If
 Next c
  
'ActiveWorkbook.Close
Application.DisplayAlerts = True
 
End Sub

回答
投稿日時: 19/04/22 17:37:30
投稿者: WinArrow
投稿者のウェブサイトに移動

いくつか問題個所がありますが、
まず、問題個所にブレークポイントを設定して
セルの値をイミディエイトウィンドウに表示して「値」を確認してみましょう。
 
オーバーフローの原因がわかると思います。
 
オーバーフロー以外の大きな問題点
列を挿入しているところです。
常套手段としては、列の左端から右に向かってループするのではなく、
右端から左に向かってループするようにしましょう。

回答
投稿日時: 19/04/22 17:47:37
投稿者: sk

引用:
対象となるセルに、Roundで計算した結果を格納する際に
オーバーフローエラーが発生しますが、理由が不明です。

引用:
Cells(2, Selection.Column - 2) _
/ Cells(2, Selection.Column - 1)

0 を 0 で割っているからでは。

回答
投稿日時: 19/04/22 20:02:07
投稿者: WinArrow
投稿者のウェブサイトに移動

「オーバーフロー」になるパターンは?
↓のコードを参考にしてみましょう
Sub test()
    On Error Resume Next
    Range("A1:B1").ClearContents
    Debug.Print Range("A1").Value / Range("B1").Value
    Debug.Print "No.1 " & Err & " " & Err.Description
    Range("B1").Value = 0
    Debug.Print Range("A1").Value / Range("B1").Value
    Debug.Print "No.2 " & Err & " " & Err.Description
    Range("A1:B1").ClearContents
    Range("A1").Value = 0
    Debug.Print Range("A1").Value / Range("B1").Value
    Debug.Print "No.3 " & Err & " " & Err.Description
    Range("A1:B1").ClearContents
    Range("A1").Value = 0: Range("B1").Value = 0
    Debug.Print Range("A1").Value / Range("B1").Value
    Debug.Print "No.4 " & Err & " " & Err.Description
    On Error GoTo 0
End Sub

回答
投稿日時: 19/04/22 21:35:08
投稿者: よろずや

No.1 6 オーバーフローしました。
No.2 6 オーバーフローしました。
No.3 11 0 で除算しました。
No.4 6 オーバーフローしました。
 
これまた理解不能な結果ですね。
どう解釈すればいいのか?

回答
投稿日時: 19/04/23 08:06:19
投稿者: WinArrow
投稿者のウェブサイトに移動

投稿日時: 19/04/22 20:02:07
で掲示したものと同じ意味の数式をC列に入力したところ
VBAと結果が違うことがわかりました。
 
Sub test()
Dim rx As Long
 
    Range("A1:C4").ClearContents
    Range("B2").Value = 0
    Range("A3").Value = 0
    Range("A4").Value = 0
    Range("B4").Value = 0
    Range("C1:C4").Formula = "=A1/B1"
    For rx = 1 To 4
        Debug.Print Cells(rx, "C").Address & ":" & Cells(rx, "C").Text
    Next
 
End Sub
 
こっちの方が納得できると思います。
 

回答
投稿日時: 19/04/23 10:12:36
投稿者: WinArrow
投稿者のウェブサイトに移動

オーバーフローの原因は、分子となる側にあるようです。
分子=Empty もしくは、「0」の時
内部で、レジスタに値を持っていくとき、範囲外の数値と認識しているらしい。
 
割算の演算子を変更すると・・・
 
Range("A1:B1").ClearContents
結果 = Range("A1").value \ Range("B1").value
 
ゼロデバイドエラーになる
 
「/」は、戻り値が浮動小数点、
「\」は、戻り値が整数、
という違いはあるが、「\」の方が期待通りのエラーになる・・・
 

投稿日時: 19/04/23 11:16:06
投稿者: TATSUYA.ich

WinArrow さんの引用:
いくつか問題個所がありますが、
まず、問題個所にブレークポイントを設定して
セルの値をイミディエイトウィンドウに表示して「値」を確認してみましょう。
 
オーバーフローの原因がわかると思います。
 
オーバーフロー以外の大きな問題点
列を挿入しているところです。
常套手段としては、列の左端から右に向かってループするのではなく、
右端から左に向かってループするようにしましょう。

 
ご返信ありがとうございます。
内容確認してみます。ありがとうございました。
 
お礼が遅れ、申し訳ございません。

投稿日時: 19/04/23 11:23:07
投稿者: TATSUYA.ich

sk さんの引用:
引用:
対象となるセルに、Roundで計算した結果を格納する際に
オーバーフローエラーが発生しますが、理由が不明です。

引用:
Cells(2, Selection.Column - 2) _
/ Cells(2, Selection.Column - 1)

0 を 0 で割っているからでは。

 
ご返信ありがとうございました。
確認させて頂きます。
 
まだ不慣れでおかしな記述をしてしまうことも多く
お恥ずかしいですが、今後もよろしくお願い致します。

投稿日時: 19/04/23 11:25:28
投稿者: TATSUYA.ich

WinArrow さんの引用:
「オーバーフロー」になるパターンは?
↓のコードを参考にしてみましょう
Sub test()
    On Error Resume Next
    Range("A1:B1").ClearContents
    Debug.Print Range("A1").Value / Range("B1").Value
    Debug.Print "No.1 " & Err & " " & Err.Description
    Range("B1").Value = 0
    Debug.Print Range("A1").Value / Range("B1").Value
    Debug.Print "No.2 " & Err & " " & Err.Description
    Range("A1:B1").ClearContents
    Range("A1").Value = 0
    Debug.Print Range("A1").Value / Range("B1").Value
    Debug.Print "No.3 " & Err & " " & Err.Description
    Range("A1:B1").ClearContents
    Range("A1").Value = 0: Range("B1").Value = 0
    Debug.Print Range("A1").Value / Range("B1").Value
    Debug.Print "No.4 " & Err & " " & Err.Description
    On Error GoTo 0
End Sub

 
わかりやすい例示をご教示頂き、有難うございました。
内容を確認させて頂きます。
 
また、今後ともよろしくお願いいたします。
 
 

投稿日時: 19/04/23 11:26:19
投稿者: TATSUYA.ich

よろずや さんの引用:
No.1 6 オーバーフローしました。
No.2 6 オーバーフローしました。
No.3 11 0 で除算しました。
No.4 6 オーバーフローしました。
 
これまた理解不能な結果ですね。
どう解釈すればいいのか?

 
ご連絡ありがとうございます。
 
すいません、初心者なものでご迷惑をおかけしております。

投稿日時: 19/04/23 11:30:57
投稿者: TATSUYA.ich

WinArrow さんの引用:
オーバーフローの原因は、分子となる側にあるようです。
分子=Empty もしくは、「0」の時
内部で、レジスタに値を持っていくとき、範囲外の数値と認識しているらしい。
 
割算の演算子を変更すると・・・
 
Range("A1:B1").ClearContents
結果 = Range("A1").value \ Range("B1").value
 
ゼロデバイドエラーになる
 
「/」は、戻り値が浮動小数点、
「\」は、戻り値が整数、
という違いはあるが、「\」の方が期待通りのエラーになる・・・
 

 
ご連絡ありがとうございました。
 
いまだご連絡下さった内容の詳細を確認できておりませんが、頂いた内容をすべて確認させて頂きます。
親身にご回答頂き有難うございました。
 
また、今後も稚拙な質問をしてしまうかもしれませんが、どうぞよろしくお願い致します、