• ベストアンサー

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 これを実行したらオーバーフローしてしまい、途中までしか計算できませんでした。 解決方法を教えて頂きたいです。よろしくお願いします。

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

  • ベストアンサー
  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.1

以下のように変更してみてください。 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

kokoichiko
質問者

お礼

EXCEL2007です。説明不足ですいませんでした。 Cells(996, i))はすべて正で、Cells(k, i)はゼロや、負のデータも含まれていましたので、 If Val(Worksheets("1").Cells(k, i)) <> 0 でオーバーフローせず、最後まで計算できました。ありがとうございました。

その他の回答 (2)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

いや、「なぜ」ってNo.1氏の例文コメントにあるとおり「0除算がオーバーフローになる」からなんですが…… #参考:これは.NETの話ですがOffice2007で0除算ではなくオーバーフローが出る理由はおそらく同じ #http://salv.miscnotes.com/2006/10/

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

Cells(k,i)のkは行数、iは列番号数です。 >For k = 1 To 995 と書いているが 2007以前は列数は256列までしか指定できません。 しばらく2007と2003以前の両者並存期間で、質問にバージョンを書かないで質問するのは、配慮が足りない。まずこの点はどうですか。 ーー 2007だとしてオーバーフローすると言うのデータ状況はどういう風ですか。

kokoichiko
質問者

補足

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 を入れるとオーバフローせずに最後まで計算できました。 しかし、なぜこれで可能になったかはよくわからなかったです。

関連するQ&A