Excel (VBA)

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

 
(Windows 10全般 : Excel 2016)
オーバーフロー
投稿日時: 20/01/08 10:45:50
投稿者: vaioyuki

いつもお世話になっております。
前回した質問の解決が出来ぬまま(別件で忙しくて検証する時間が。。。(泣))、
新たな質問をさせて頂きます。
 
ひとつのデータシートから2ファイルに分ける作業をしています。
最初に作業をするAデータは問題なくはき出されるのですが、
Bデータが「実行時エラー:6 オーバーフローしました」となります。
データ内容としてはオーバーフローするような値ではなく、(ほとんどが0です)
データが2レコード以上、2行以上ある場合にこのオーバーフローが出ます。
 

getBundle Var_value, Lng_denwa1, Lng_bundle '調整額を取得

 
上記で呼び出し、
 
Private Sub getBundle(Var_value As Variant, Lng_rows As Long, ByRef Lng_bundle() As Long) '調整額を取得
Dim Lng_for As Long
Dim Lng_nriyoukei As Long
Dim Lng_nmuryoukei As Long
Dim Lng_wriyoukei As Long
Dim Lng_wmuryoukei As Long
Dim Lng_nnokori As Long
Dim Lng_wnokori As Long
Dim Lng_saihaibun As Long

For Lng_for = 1 To Lng_rows 'データの行数だけ繰り返し
  Lng_nriyoukei = Lng_nriyoukei + CLng(Val(Var_value(Lng_for, ENM_OUT.nriyou)))
  Lng_nmuryoukei = Lng_nmuryoukei + CLng(Val(Var_value(Lng_for, ENM_OUT.nmuryou)))
  Lng_wriyoukei = Lng_wriyoukei + CLng(Val(Var_value(Lng_for, ENM_OUT.wriyou)))
  Lng_wmuryoukei = Lng_wmuryoukei + CLng(Val(Var_value(Lng_for, ENM_OUT.wmuryou)))
Next Lng_for
Lng_nnokori = Lng_nmuryoukei
Lng_wnokori = Lng_wmuryoukei

ReDim Lng_bundle(1 To Lng_rows, ENM_OUT.saigoukei To ENM_OUT.chouseize) As Long '調整額の配列を再定義
For Lng_for = 1 To Lng_rows - 1 'データの行数-1まで繰り返し
  Lng_saihaibun = CLng(CLng(Val(Var_value(Lng_for, ENM_OUT.nriyou))) / Lng_nriyoukei * Lng_nmuryoukei) '再配分
  Lng_bundle(Lng_for, ENM_OUT.chouseika) = Lng_saihaibun - CLng(Val(Var_value(Lng_for, ENM_OUT.nmuryou))) '調整額(課税対象)
  Lng_nnokori = Lng_nnokori - Lng_saihaibun '国内無料分残り
  Lng_saihaibun = CLng(CLng(Val(Var_value(Lng_for, ENM_OUT.wriyou))) / Lng_wriyoukei * Lng_wmuryoukei) '再配分
  Lng_bundle(Lng_for, ENM_OUT.chouseihi) = Lng_saihaibun - CLng(Val(Var_value(Lng_for, ENM_OUT.wmuryou))) '調整額(非課税対象)
  Lng_wnokori = Lng_wnokori - Lng_saihaibun '国際無料分残り
  Lng_bundle(Lng_for, ENM_OUT.chouseize) = Fix(Lng_bundle(Lng_for, ENM_OUT.chouseika) * 10 / 110) '調整額(消費税相当) *内税計算
  Lng_bundle(Lng_for, ENM_OUT.saigoukei) = CLng(Val(Var_value(Lng_for, ENM_OUT.goriyoukei))) _
    + Lng_bundle(Lng_for, ENM_OUT.chouseika) + Lng_bundle(Lng_for, ENM_OUT.chouseihi) '再計算後ご利用金額合計
Next Lng_for
Lng_bundle(Lng_for, ENM_OUT.chouseika) = Lng_nnokori - CLng(Val(Var_value(Lng_for, ENM_OUT.nmuryou))) '調整額(課税対象)
Lng_bundle(Lng_for, ENM_OUT.chouseihi) = Lng_wnokori - CLng(Val(Var_value(Lng_for, ENM_OUT.wmuryou))) '調整額(非課税対象)
Lng_bundle(Lng_for, ENM_OUT.chouseize) = Fix(Lng_bundle(Lng_for, ENM_OUT.chouseika) * 10 / 110) '調整額(消費税相当) *内税計算
Lng_bundle(Lng_for, ENM_OUT.saigoukei) = CLng(Val(Var_value(Lng_for, ENM_OUT.goriyoukei))) _
  + Lng_bundle(Lng_for, ENM_OUT.chouseika) + Lng_bundle(Lng_for, ENM_OUT.chouseihi) '再計算後ご利用金額合計
End Sub

 
  Lng_saihaibun = CLng(CLng(Val(Var_value(Lng_for, ENM_OUT.nriyou))) / Lng_nriyoukei * Lng_nmuryoukei) '再配分

 
こちらでオーバフローになります。
1レコードしかない場合はそのまま何事もなく動きます。
 
Aデータでは問題なく動くので同じ変数を使っているのがダメなのかなと思い、同じものを2バージョン作成して動かしましたが同じところでエラーになります。
オーバーフローで色々調べてみましたが、CLngも使用しているし、計算結果としても大きい数値ではないのでさっぱりわかりません。
 
よろしくお願いします。

回答
投稿日時: 20/01/08 11:10:07
投稿者: WinArrow
投稿者のウェブサイトに移動

コードをよく見ていませんが、
ステップ実行して、変数の「値」を確認してみては?
 

投稿日時: 20/01/08 12:00:58
投稿者: vaioyuki

ありがとうございます。
 
エラーが起きるまでの変数の値はLng_rowsは2、その他は全て0です。
行数も2行で数値も0で間違いありません。
気になった点は、Lng_forが1でした。
正常に動くAデータは行数は247でLng_Forが248でひとつ多い?

回答
投稿日時: 20/01/08 13:34:37
投稿者: WinArrow
投稿者のウェブサイトに移動

>エラーが起きるまでの変数の値は
 
エラーが起きるまで
ではなくて
エラーが起きたときの変数の値が問題だと思いますが・・・
 
問題のコード

引用:
Lng_saihaibun = CLng(CLng(Val(Var_value(Lng_for, ENM_OUT.nriyou))) / Lng_nriyoukei * Lng_nmuryoukei) '再配分

割り算と掛け算の組み合わせですが、
割り算の結果に掛け算していますが、これで間違いないですか?
 

投稿日時: 20/01/08 14:00:24
投稿者: vaioyuki

ありがとうございます。
 
エラーが起きた時の値は以下になります。
 
Lng_rows = 2
Lng_for = 1
その他は全て0
 
計算式は間違いありません。
Aデータはそれで計算されます。
やはりデータが2行以上あるとオーバーフローになります。

回答
投稿日時: 20/01/08 14:48:31
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
Lng_rows = 2
Lng_for = 1
その他は全て0

↑の「その他」って何ですか?
 
⇓の変数も確認しましょう
 
CLng(CLng(Val(Var_value(Lng_for, ENM_OUT.nriyou)))
Lng_nriyoukei
Lng_nmuryoukei
 
 
因みに
Dim A As Long, B as Long, C As Long

Debug.Print A / B * C
 
でも同じエラーになりますが・・・・

投稿日時: 20/01/08 15:08:41
投稿者: vaioyuki

失礼しました。
 
Lng_row = 2
Lng_for = 1
Lng_nriyoukei = 0
Lng_nmuryoukei = 0
Lng_wriyoukei = 0
Lng_wmuryoukei = 0
Lng_nnokori = 0
Lng_wnokori = 0
Lng_saihaibun = 0
 
上記になります。
データとしても計算結果は0です。
 
 

引用:
因みに
Dim A As Long, B as Long, C As Long

Debug.Print A / B * C
  
でも同じエラーになりますが・・・・

 
Aデータや1レコードしかないBデータだとエラー無く作動します。
なんなんでしょう。。。。。。(泣)

投稿日時: 20/01/08 15:19:00
投稿者: vaioyuki

今、Bデータのレコードを1レコードにして作動したら問題なく終わりました。
やはり2レコード以上あるとオーバフローになるようですが原因がさっぱりわかりません。。。

回答
投稿日時: 20/01/08 15:26:45
投稿者: WinArrow
投稿者のウェブサイトに移動

>CLng(CLng(Val(Var_value(Lng_for, ENM_OUT.nriyou)))
 
の値は確認しないんかしら?
 
私の、
>因みに
は、参考にならないのかな?
 
ゼロデバイド
ってご存知ですよね?
 

回答
投稿日時: 20/01/08 15:27:07
投稿者: MMYS

ローカルウィンドウを表示させて
エラーで停止時にローカルウィンドウで変数の値を確認して下さい。
 
https://www.relief.jp/docs/vbe-local-window-easier-than-watch-immediate.html
 
先入観にとらわれず、変数値を疑い確認です。

回答
投稿日時: 20/01/08 15:54:10
投稿者: WinArrow
投稿者のウェブサイトに移動

私の
因みに
のレスは、
 
VBAの式でゼロで割る式が「オーバーフロー」のエラーになります
 
これは、工夫して回避する必要があります。

ということを理解してもらうためのアドバイスでしたが、
理解されていない様子・・・・・残念
 

投稿日時: 20/01/08 17:21:23
投稿者: vaioyuki

物分かりが悪く申し訳ありません。
 
なるほど!!
確かにここで記されている、[ENM_OUT.nriyou]は 0 です。
 
Lng_nriyoukei = 0
Lng_nmuryoukei = 0
ENM_OUT.nriyou = 0
 
この3つ全てが0なのでオーバーフローということですか?
 
0に0をかけても割っても0は0だからかな?
でも他も[ENM_OUT.nriyou]は 0 のは大丈夫なのにな?と思ってました。
 Lng_nriyoukei * Lng_nmuryoukei ここも0だからエラーになるのですね。
ローカルウィンドウでも確認しました。
[ENM_OUT.nriyou]の数値ばかり気にしていました。
少しスッキリしました。
 
回避するにはIF関数?
[Lng_nriyoukei]や[Lng_nmuryoukei]が0になることは滅多にないのですが、
こちらが0の場合は何もしない、何も計算しないというIF関数になりますか?
 
よろしくお願いします。
[/code]

投稿日時: 20/01/08 17:50:12
投稿者: vaioyuki

If Lng_nriyoukei <> 0 And Lng_nmuryoukei <> 0 Then

ReDim Lng_bundle(1 To Lng_rows, ENM_OUT.saigoukei To ENM_OUT.chouseize) As Long '調整額の配列を再定義
For Lng_for = 1 To Lng_rows - 1 'データの行数-1まで繰り返し
  Lng_saihaibun = CLng(CLng(Val(Var_value(Lng_for, ENM_OUT.nriyou))) / Lng_nriyoukei * Lng_nmuryoukei) '再配分
  Lng_bundle(Lng_for, ENM_OUT.chouseika) = Lng_saihaibun - CLng(Val(Var_value(Lng_for, ENM_OUT.nmuryou))) '調整額(課税対象)
  Lng_nnokori = Lng_nnokori - Lng_saihaibun '国内無料分残り
  Lng_saihaibun = CLng(CLng(Val(Var_value(Lng_for, ENM_OUT.wriyou))) / Lng_wriyoukei * Lng_wmuryoukei) '再配分
  Lng_bundle(Lng_for, ENM_OUT.chouseihi) = Lng_saihaibun - CLng(Val(Var_value(Lng_for, ENM_OUT.wmuryou))) '調整額(非課税対象)
  Lng_wnokori = Lng_wnokori - Lng_saihaibun '国際無料分残り
  Lng_bundle(Lng_for, ENM_OUT.chouseize) = Fix(Lng_bundle(Lng_for, ENM_OUT.chouseika) * 10 / 110) '調整額(消費税相当) *内税計算
  Lng_bundle(Lng_for, ENM_OUT.saigoukei) = CLng(Val(Var_value(Lng_for, ENM_OUT.goriyoukei))) _
    + Lng_bundle(Lng_for, ENM_OUT.chouseika) + Lng_bundle(Lng_for, ENM_OUT.chouseihi) '再計算後ご利用金額合計
Next Lng_for
Lng_bundle(Lng_for, ENM_OUT.chouseika) = Lng_nnokori - CLng(Val(Var_value(Lng_for, ENM_OUT.nmuryou))) '調整額(課税対象)
Lng_bundle(Lng_for, ENM_OUT.chouseihi) = Lng_wnokori - CLng(Val(Var_value(Lng_for, ENM_OUT.wmuryou))) '調整額(非課税対象)
Lng_bundle(Lng_for, ENM_OUT.chouseize) = Fix(Lng_bundle(Lng_for, ENM_OUT.chouseika) * 10 / 110) '調整額(消費税相当) *内税計算
Lng_bundle(Lng_for, ENM_OUT.saigoukei) = CLng(Val(Var_value(Lng_for, ENM_OUT.goriyoukei))) _
  + Lng_bundle(Lng_for, ENM_OUT.chouseika) + Lng_bundle(Lng_for, ENM_OUT.chouseihi) '再計算後ご利用金額合計

Else
    Lng_bundle = 0
    
    Stop
End If


 
こちらで動かしてみたら[Lng_bundole]が配列だったのでエラーになりました。
もう少し検索してやってみます。
 
また報告します。

回答
投稿日時: 20/01/08 17:50:42
投稿者: WinArrow
投稿者のウェブサイトに移動

>0に0をかけても割っても0は0だからかな?
0で割ったら0になる
↑これは認識違いです。
 
分子がどのような値だろうと「0」で割るとエラーになります。
「0」をかけてもエラーにはなりません。
 

投稿日時: 20/01/08 18:42:50
投稿者: vaioyuki

ありがとうございます。
私なりに作成しました。
不細工かもしれませんがw、こちらで無事に作成はできました。
 
これでもまだエラーになることはありますか?
 

ReDim Lng_bundle(1 To Lng_rows, ENM_OUT.saigoukei To ENM_OUT.chouseize) As Long '調整額の配列を再定義

If Lng_nriyoukei <> 0 And Lng_nmuryoukei <> 0 Then

For Lng_for = 1 To Lng_rows - 1 'データの行数-1まで繰り返し

  Lng_saihaibun = CLng(CLng(Val(Var_value(Lng_for, ENM_OUT.nriyou))) / Lng_nriyoukei * Lng_nmuryoukei) '再配分
  Lng_bundle(Lng_for, ENM_OUT.chouseika) = Lng_saihaibun - CLng(Val(Var_value(Lng_for, ENM_OUT.nmuryou))) '調整額(課税対象)
  Lng_nnokori = Lng_nnokori - Lng_saihaibun '国内無料分残り
  Lng_saihaibun = CLng(CLng(Val(Var_value(Lng_for, ENM_OUT.wriyou))) / Lng_wriyoukei * Lng_wmuryoukei) '再配分
  Lng_bundle(Lng_for, ENM_OUT.chouseihi) = Lng_saihaibun - CLng(Val(Var_value(Lng_for, ENM_OUT.wmuryou))) '調整額(非課税対象)
  Lng_wnokori = Lng_wnokori - Lng_saihaibun '国際無料分残り
  Lng_bundle(Lng_for, ENM_OUT.chouseize) = Fix(Lng_bundle(Lng_for, ENM_OUT.chouseika) * 10 / 110) '調整額(消費税相当) *内税計算
  Lng_bundle(Lng_for, ENM_OUT.saigoukei) = CLng(Val(Var_value(Lng_for, ENM_OUT.goriyoukei))) _
    + Lng_bundle(Lng_for, ENM_OUT.chouseika) + Lng_bundle(Lng_for, ENM_OUT.chouseihi) '再計算後ご利用金額合計
Next Lng_for

Else

For Lng_for = 1 To Lng_rows - 1 'データの行数-1まで繰り返し

  Lng_saihaibun = 0 '再配分
  Lng_bundle(Lng_for, ENM_OUT.chouseika) = Lng_saihaibun - CLng(Val(Var_value(Lng_for, ENM_OUT.nmuryou))) '調整額(課税対象)
  Lng_nnokori = Lng_nnokori - Lng_saihaibun '国内無料分残り
  Lng_saihaibun = 0 '再配分
  Lng_bundle(Lng_for, ENM_OUT.chouseihi) = Lng_saihaibun - CLng(Val(Var_value(Lng_for, ENM_OUT.wmuryou))) '調整額(非課税対象)
  Lng_wnokori = Lng_wnokori - Lng_saihaibun '国際無料分残り
  Lng_bundle(Lng_for, ENM_OUT.chouseize) = Fix(Lng_bundle(Lng_for, ENM_OUT.chouseika) * 10 / 110) '調整額(消費税相当) *内税計算
  Lng_bundle(Lng_for, ENM_OUT.saigoukei) = CLng(Val(Var_value(Lng_for, ENM_OUT.goriyoukei))) _
    + Lng_bundle(Lng_for, ENM_OUT.chouseika) + Lng_bundle(Lng_for, ENM_OUT.chouseihi) '再計算後ご利用金額合計
Next Lng_for

End If

 
 
 
引用:
分子がどのような値だろうと「0」で割るとエラーになります。
「0」をかけてもエラーにはなりません。

 
これは勉強になりました。
ありがとうございます!!

投稿日時: 20/01/08 19:35:43
投稿者: vaioyuki

If Lng_nriyoukei <> 0 And Lng_nmuryoukei <> 0 Then

 
これしか表記してなかったので、
 
[Lng_wriyoukei][Lng_wmuryoukei]を忘れていてまた同じことをしてしまいました。。。(´;ω;`)ウゥゥ
 
 
再度考えてみます。

回答
投稿日時: 20/01/08 19:45:22
投稿者: WinArrow
投稿者のウェブサイトに移動

>これでもまだエラーになることはありますか?
 
この質問は、却下します。(回答者にデバッグを依頼してはいけません)
自分で納得するまで、デバッグしましょう。
 

投稿日時: 20/01/08 19:58:49
投稿者: vaioyuki

図々しいこと言ってすいません。
下記でなんとか出来ました。
もっときれいなコードが書けるようにがんばります!!
 

If Lng_nriyoukei <> 0 And Lng_wriyoukei <> 0 Then
    For Lng_for = 1 To Lng_rows - 1 'データの行数-1まで繰り返し
        Lng_saihaibun = CLng(CLng(Val(Var_value(Lng_for, ENM_OUT.nriyou))) / Lng_nriyoukei * Lng_nmuryoukei) '再配分
        Lng_bundle(Lng_for, ENM_OUT.chouseika) = Lng_saihaibun - CLng(Val(Var_value(Lng_for, ENM_OUT.nmuryou))) '調整額(課税対象)
        Lng_nnokori = Lng_nnokori - Lng_saihaibun '国内無料分残り
        Lng_saihaibun = CLng(CLng(Val(Var_value(Lng_for, ENM_OUT.wriyou))) / Lng_wriyoukei * Lng_wmuryoukei) '再配分
        Lng_bundle(Lng_for, ENM_OUT.chouseihi) = Lng_saihaibun - CLng(Val(Var_value(Lng_for, ENM_OUT.wmuryou))) '調整額(非課税対象)
        Lng_wnokori = Lng_wnokori - Lng_saihaibun '国際無料分残り
        Lng_bundle(Lng_for, ENM_OUT.chouseize) = Fix(Lng_bundle(Lng_for, ENM_OUT.chouseika) * 10 / 110) '調整額(消費税相当) *内税計算
        Lng_bundle(Lng_for, ENM_OUT.saigoukei) = CLng(Val(Var_value(Lng_for, ENM_OUT.goriyoukei))) _
        + Lng_bundle(Lng_for, ENM_OUT.chouseika) + Lng_bundle(Lng_for, ENM_OUT.chouseihi) '再計算後ご利用金額合計
    Next Lng_for
    ElseIf Lng_nriyoukei <> 0 And Lng_wriyoukei = 0 Then
        For Lng_for = 1 To Lng_rows - 1 'データの行数-1まで繰り返し
            Lng_saihaibun = CLng(CLng(Val(Var_value(Lng_for, ENM_OUT.nriyou))) / Lng_nriyoukei * Lng_nmuryoukei) '再配分
            Lng_bundle(Lng_for, ENM_OUT.chouseika) = Lng_saihaibun - CLng(Val(Var_value(Lng_for, ENM_OUT.nmuryou))) '調整額(課税対象)
            Lng_nnokori = Lng_nnokori - Lng_saihaibun '国内無料分残り
            Lng_saihaibun = 0 '再配分
            Lng_bundle(Lng_for, ENM_OUT.chouseihi) = Lng_saihaibun - CLng(Val(Var_value(Lng_for, ENM_OUT.wmuryou))) '調整額(非課税対象)
            Lng_wnokori = Lng_wnokori - Lng_saihaibun '国際無料分残り
            Lng_bundle(Lng_for, ENM_OUT.chouseize) = Fix(Lng_bundle(Lng_for, ENM_OUT.chouseika) * 10 / 110) '調整額(消費税相当) *内税計算
            Lng_bundle(Lng_for, ENM_OUT.saigoukei) = CLng(Val(Var_value(Lng_for, ENM_OUT.goriyoukei))) _
            + Lng_bundle(Lng_for, ENM_OUT.chouseika) + Lng_bundle(Lng_for, ENM_OUT.chouseihi) '再計算後ご利用金額合計
        Next Lng_for
        ElseIf Lng_nriyoukei = 0 And Lng_wriyoukei <> 0 Then
            For Lng_for = 1 To Lng_rows - 1 'データの行数-1まで繰り返し
                Lng_saihaibun = 0 '再配分
                Lng_bundle(Lng_for, ENM_OUT.chouseika) = Lng_saihaibun - CLng(Val(Var_value(Lng_for, ENM_OUT.nmuryou))) '調整額(課税対象)
                Lng_nnokori = Lng_nnokori - Lng_saihaibun '国内無料分残り
                Lng_saihaibun = 0 '再配分
                Lng_bundle(Lng_for, ENM_OUT.chouseihi) = Lng_saihaibun - CLng(Val(Var_value(Lng_for, ENM_OUT.wmuryou))) '調整額(非課税対象)
                Lng_wnokori = Lng_wnokori - Lng_saihaibun '国際無料分残り
                Lng_bundle(Lng_for, ENM_OUT.chouseize) = Fix(Lng_bundle(Lng_for, ENM_OUT.chouseika) * 10 / 110) '調整額(消費税相当) *内税計算
                Lng_bundle(Lng_for, ENM_OUT.saigoukei) = CLng(Val(Var_value(Lng_for, ENM_OUT.goriyoukei))) _
                + Lng_bundle(Lng_for, ENM_OUT.chouseika) + Lng_bundle(Lng_for, ENM_OUT.chouseihi) '再計算後ご利用金額合計
            Next Lng_for
            Else
                For Lng_for = 1 To Lng_rows - 1 'データの行数-1まで繰り返し
                    Lng_saihaibun = 0 '再配分
                    Lng_bundle(Lng_for, ENM_OUT.chouseika) = Lng_saihaibun - CLng(Val(Var_value(Lng_for, ENM_OUT.nmuryou))) '調整額(課税対象)
                    Lng_nnokori = Lng_nnokori - Lng_saihaibun '国内無料分残り
                    Lng_saihaibun = 0 '再配分
                    Lng_bundle(Lng_for, ENM_OUT.chouseihi) = Lng_saihaibun - CLng(Val(Var_value(Lng_for, ENM_OUT.wmuryou))) '調整額(非課税対象)
                    Lng_wnokori = Lng_wnokori - Lng_saihaibun '国際無料分残り
                    Lng_bundle(Lng_for, ENM_OUT.chouseize) = Fix(Lng_bundle(Lng_for, ENM_OUT.chouseika) * 10 / 110) '調整額(消費税相当) *内税計算
                    Lng_bundle(Lng_for, ENM_OUT.saigoukei) = CLng(Val(Var_value(Lng_for, ENM_OUT.goriyoukei))) _
                    + Lng_bundle(Lng_for, ENM_OUT.chouseika) + Lng_bundle(Lng_for, ENM_OUT.chouseihi) '再計算後ご利用金額合計
                Next Lng_for
End If

 
 
ありがとうございました。(^−^)