- ベストアンサー
vbaでオーバーフローしてしまいました。
Dim i As Long Dim k As Long For i = 1 To 829 For k = 1 To 995 Worksheets("2").Cells(k,i) = Worksheets("1").Cells(k,i) /Worksheets("1").Cells(996,i) Next k Next i これを実行したらオーバーフローしてしまい、途中までしか計算できませんでした。 解決方法を教えて頂きたいです。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
以下のように変更してみてください。 Sub test() Dim i As Long Dim k As Long For i = 1 To 829 '←EXCEL2007 ならOK /EXCEL2007以外の場合は 256まで For k = 1 To 995 If Val(Worksheets("1").Cells(k, i)) > 0 And _ Val(Worksheets("1").Cells(996, i)) > 0 Then '0/0 の場合はオーバーフローになるので '0以外の時のみ計算する Worksheets("2").Cells(k, i) = Worksheets("1").Cells(k, i) / Worksheets("1").Cells(996, i) End If Next Next End Sub
その他の回答 (2)
- D-Matsu
- ベストアンサー率45% (1080/2394)
いや、「なぜ」ってNo.1氏の例文コメントにあるとおり「0除算がオーバーフローになる」からなんですが…… #参考:これは.NETの話ですがOffice2007で0除算ではなくオーバーフローが出る理由はおそらく同じ #http://salv.miscnotes.com/2006/10/
- imogasi
- ベストアンサー率27% (4737/17069)
Cells(k,i)のkは行数、iは列番号数です。 >For k = 1 To 995 と書いているが 2007以前は列数は256列までしか指定できません。 しばらく2007と2003以前の両者並存期間で、質問にバージョンを書かないで質問するのは、配慮が足りない。まずこの点はどうですか。 ーー 2007だとしてオーバーフローすると言うのデータ状況はどういう風ですか。
補足
2007です。説明不測で申し訳ありません。 1のsheetに995行、829列のデータ(ゼロ、正、負いろいろ)がありまして、 996行には各列の総和の値(>0)があります。 その各列の総和でその列のデータを割り算し、2のシートに書こうとしています。 始めに回答してくださったpkh4989様を参考に If Val(Worksheets("1").Cells(k, i)) <> 0 Worksheets("2").Cells(k, i) = Worksheets("1").Cells(k, i) / Worksheets("1").Cells(996, i) End If を入れるとオーバフローせずに最後まで計算できました。 しかし、なぜこれで可能になったかはよくわからなかったです。
お礼
EXCEL2007です。説明不足ですいませんでした。 Cells(996, i))はすべて正で、Cells(k, i)はゼロや、負のデータも含まれていましたので、 If Val(Worksheets("1").Cells(k, i)) <> 0 でオーバーフローせず、最後まで計算できました。ありがとうございました。