- ベストアンサー
VBAでの演算。オーバーフローしてしまいます
- VBAでの演算でオーバーフローが発生しています。全ての変数をVariant型にしても問題が解消されません。
- 整数同士の割り算で小数が出る場合、小数点第2位まで丸めたいです。
- 上記のVBAコードを使用して、割り算の結果を丸めた値と元の値を指定のセルに出力する処理を行っています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> ColumnI = ColumnI + wSt.Range("E" & iTmp) 中略 > If wSt.Range("K" & iTmp) = "未包装" Then ColumnF = ColumnF + 1 この部分でそれぞれ値が代入されていますが(数値を代入とは実際に数値を入れなくても、このような形でよろしいです) ColumnI = ColumnI + wSt.Range("E" & iTmp) ここでColumnIにもともとデータが入っていなくて wSt.Range("E" & iTmp)にもデータが無い場合 ColumnI はデータが入っていない状態になります。 If wSt.Range("K" & iTmp) = "未包装" Then ColumnF = ColumnF + 1 wSt.Range("K" & iTmp) = "未包装"でない場合、ColumnFにはデータが代入されませんから、もともとColumnFにデータが入っていなければ、こちらもデータが入っていない状態になります。 データの無い変数などで除算を行った場合、オーバーフローのエラーが出ます。 とりあえず ColumnB = ColumnI / ColumnF の前でColumnI ColumnFにデータが入っているか確認してみてください。 除算の前に Debug.Print "ColumnI="; ColumnI; "ColumnF="; ColumnF と書いておくとイミディエイトウインドウで確認できます。 > curRow = 3 > curRow = curRow + 1 は0以上の値が代入されてますので大丈夫ですが、データのある行数が Integer で間に合う行数かどうかは確認しておいてください。 あと、他の方の補足に書かれているコードですが > COVER.Range("B" & curRow) = wSt.Range("I" & curRow / wSt.("F" & curRow) wSt.Range("I" & curRow / curRowの後に)がありません。 COVER.に関しては他の方が書いてるように間違いなのか、setでCOVERにWorksheetオブジェクトをセットしてるのか不明なのでここではふれません。
その他の回答 (4)
- tsubuyuki
- ベストアンサー率45% (699/1545)
余計なお世話を横から。 > どうしてもオーバーフローしてしまいます。 とのことですが、どこでエラーメッセージが出ます? それがわかれば解決策も(たぶん)あっという間に出ますよ。 質問文中から読み取れる可能性としては、 「Long型(長整数型)は、-2,147,483,648~2,147,483,647の範囲」 ということで、ColumnFあるいはColumnIのどちらかが この範囲からはみだしているんじゃないかなぁ、と ぼんやりと想像できるくらいです。 「0で割った」で止まるとしたら、オーバーフローではなく 「0で除算しました」の警告が出ますからね。 で、おまけですが > ColumnB = 3 > ColumnB = ColumnB + 1 結局、ColumnB = 4 ですよね。 1行無駄と言えますね。 もう一つ。 > COVER.Range("B" & curRow) = wSt.Range("I" & curRow / wSt.("F" & curRow) 一連の流れから察するに、「COVER」はワークシートの名前でしょうか? だとしたら、これは間違った書き方と言えます Worksheets("COVER").Range( 以下省略 などと書いてやるのが一般的かもしれません。
お礼
tsubuyuki 様 アドバイスを頂きありがとうございました。 無事問題を解決することができました。
補足
tsubuyuki様 ご回答頂きありがとうございます。 計算が終わるときにエラーが表示されます。 しかし、計算自体は上手くできておりデバックを終了すると数値はちゃんと記入されています。 COVER.Range("B" & curRow) = wSt.Range("I" & curRow) / wSt.Range("F" & curRow) このように記入すると、0で除算しましたとエラーが出ます。 ご説明不足ですみません。 COVERとはシートの名前で、セット宣言とセットをしています。 Dim bTmp As Byte, stCnt As Byte Dim COVER As Worksheet: Set COVER = ThisWorkbook.Worksheets("COVER")
- kmetu
- ベストアンサー率41% (562/1346)
No2の追加です ColumnFに0を代入すると「0で除算しました」というエラーになりますから0を代入しないようにしてください。またcurRowには1以上を代入しないとエラーになります。シート表示で実行すると「400」というエラー、VBEから実行すると「アプリケーション定義またはオブジェクト定義のエラー」がでます。
補足
kmetu様 ご回答頂きありがとうございます。 申し訳ございません。 根本の目的をご説明していませんでした。 他の追加されたシートからCOVERシートに数値をもっていきます。その後、COVERシート上で除算を行いました。 ColumnI = ColumnI + wSt.Range("E" & iTmp) If wSt.Range("K" & iTmp) = "包装中" Then ColumnC = ColumnC + wSt.Range("Y" & iTmp) If wSt.Range("K" & iTmp) = "未包装" Then ColumnD = ColumnD + wSt.Range("Y" & iTmp) If wSt.Range("K" & iTmp) = "未包装" Then ColumnF = ColumnF + 1 ColumnE = ColumnE + wSt.Range("Y" & iTmp) If wSt.Range("T" & iTmp) = "DELIVERY VALVE" Or _ wSt.Range("T" & iTmp) = "DELIVERY-VALVE ASSEMBLY" Or _ wSt.Range("T" & iTmp) = "PLUNGER ASSY" Or _ wSt.Range("T" & iTmp) = "PLUNGER" Then ColumnG = ColumnG + wSt.Range("E" & iTmp) ColumnH = ColumnH + wSt.Range("Y" & iTmp) End If curRowにはこのような式を代入しています。 curRow As Integer curRow = 3 curRow = curRow + 1 何か数値を代入するというとこのような形でしょうか? ColumnB = 3 ColumnB = ColumnB + 1 ColumnI = 3 ColumnI = ColumnI + 1 ColumnF = 3 ColumnF = ColumnF + 1 ColumnB = ColumnI / ColumnF よろしくお願い致します。
- kmetu
- ベストアンサー率41% (562/1346)
> ColumnB = ColumnI / ColumnF ColumnI ColumnF それぞれ値が代入されていませんが、何か数値を代入してから計算してください。
- keithin
- ベストアンサー率66% (5278/7941)
>オーバーフローしてしまいます。 ご相談に掲示されてる「そのマクロで実行した」のでしたら,単純にColumnFがゼロで「ゼロ割」になってるだけです。 それぞれの変数(定義されていない「curRow」を含めて)に適切に数値を与えてから,計算するようにしてください。
お礼
keithin 様 ご回答頂きありがとうございました。 無事問題解決できました。
補足
keithin様 curRowにはこのような式を代入しました。 curRow As Integer curRow = 3 curRow = curRow + 1 Columnに何か数値を代入するというとこのような形でしょうか? ColumnB = 3 ColumnB = ColumnB + 1 ColumnI = 3 ColumnI = ColumnI + 1 ColumnF = 3 ColumnF = ColumnF + 1 ColumnB = ColumnI / ColumnF 最初に COVER.Range("B" & curRow) = wSt.Range("I" & curRow / wSt.("F" & curRow) と入力しましたが、エラーになってしまいました。 このような形では数値は出ないのでしょうか。 よろしくお願い致します。
お礼
kmetu 様 ご教授頂き誠にありがとうございます。 おかげさまで問題を解決することができました。 また何かございましたらよろしくお願い致します。
補足
kmetu様 再度のアドバイスを頂き、誠にありがとうございます。 記入漏れ申し訳ございません。 COVERについてはSetをしています。 Dim bTmp As Byte, stCnt As Byte Dim COVER As Worksheet: Set COVER = ThisWorkbook.Worksheets("COVER") イミディエイトウインドウを開き、 ご指示を頂いた文字を入力した結果です。 イミディエイトウインドウにはこのように表示されました。 ColumnI= 9349 ColumnF= 2794 ColumnI= 9190 ColumnF= 2585 ColumnI= 8711 ColumnF= 2581 ColumnI= 9349 ColumnF= 2794 よろしくお願い致します。