- ベストアンサー
VBAでのマクロ実行中のオーバーフローについて
以下のマクロ実行時にたまにオーバーフローが出てしまい マクロが止まってしまうときがあります。 毎回出るのであれば、原因を突き止めやすいのすが、 出なくなると全く出なくなりとても困っています。 もしわかる方がいらっしゃいましたら、御教授して頂けると 幸いです。 内容:データが元々10個単位であり、Sheet1に500×10、 Sheet2に500×10のデータを2次元配列に格納する。 Dim RES_CAM1(1 To 4000, 1 To 10) As Integer Dim RES_CAM2(1 To 4000, 1 To 10) As Integer Sub Macro10() ' ' Dim i, j As Integer .................................................... .................................................... Sheets("Sheet1").Select For i = 1 To 500 For j = 1 To 10 RES_CAM1(i, j) = Cells((i - 1) * 10 + j, 19) ← ☆ Next j Next i Sheets("Sheet2").Select For i = 1 To 500 For j = 1 To 10 RES_CAM2(i, j) = Cells((i - 1) * 10 + j, 19) ← ☆ Next j Next i .................................................... .................................................... End Sub 上記☆のところでオーバーフローで止まったりします。。。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
NO.2です。 >ただやはり、Integerでもうまくいくときがあるのが??? 19列(S列)の全ての値が 32,767未満だったらエラーにならないはずですが ヘルプより 整数型 (Integer) の変数は、16 ビット (2 バイト) の変数で、 -32,768 ~ 32,767 の範囲の値をとります。
その他の回答 (3)
こんにちは。 質問の回答ではないですが。 Sheet1とSheet2に対して、同じ処理をしていますね。しかもシートを開く必要がない処理です。 たいていの処理はSelectやActineをしないで出来ます。あと、プロパティは省略しない方がいいです。 2つをまとめると For i = 1 To 500 For j = 1 To 10 RES_CAM1(i, j) = Worksheets("Sheet1").Cells((i - 1) * 10 + j, 19).Value RES_CAM2(i, j) = Worksheets("Sheet2").Cells((i - 1) * 10 + j, 19).Value Next j Next i このようになります。どうでしょうか。
お礼
ありがとうございました。 なるほど、こっちの書き方のほうがスマートっぽいですね。
- chibita_papa
- ベストアンサー率60% (127/209)
19列(S列)の値が32,767を越えた時エラーになります。 RES_CAM1,RES_CAM2 は、LONGで宣言すべきです。 質問とは直接関係ありませんが、 Dim i, j As Integerと宣言すると i はバリアント型になります。 Dim i As Integer, j As Integer 又は、 Dim i As Integer Dim j As Integer と宣言します。
お礼
ありがとうございました。 ただやはり、Integerでもうまくいくときがあるのが??? になっています。
- fly_moon
- ベストアンサー率20% (213/1046)
ぱっと見て思っただけですが、 Dim RES_CAM1(1 To 4000, 1 To 10) As Long Dim RES_CAM2(1 To 4000, 1 To 10) As Long でもダメですか?Integerで扱える範囲を超えているものがあるだけのように感じましたが…
お礼
ありがとうございました。 2の方もおっしゃられていたようにLongですか。 配列に入れるデータの中身が-32767~32768までだったので Integer宣言したのがまずかったのかな。
お礼
ありがとうございました。 意図していない箇所で32767を越えた値が入っておりました。 大変お騒がせしてごめんなさい!! 何度も本当にInteger宣言していて、32767以上が入っていない かを確認することを気付かせてくれて本当にありがとうござい ました。