• ベストアンサー

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 上記☆のところでオーバーフローで止まったりします。。。

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

  • ベストアンサー
回答No.4

NO.2です。 >ただやはり、Integerでもうまくいくときがあるのが??? 19列(S列)の全ての値が 32,767未満だったらエラーにならないはずですが ヘルプより 整数型 (Integer) の変数は、16 ビット (2 バイト) の変数で、 -32,768 ~ 32,767 の範囲の値をとります。

koro_koro_koro
質問者

お礼

ありがとうございました。 意図していない箇所で32767を越えた値が入っておりました。 大変お騒がせしてごめんなさい!! 何度も本当にInteger宣言していて、32767以上が入っていない かを確認することを気付かせてくれて本当にありがとうござい ました。

その他の回答 (3)

noname#187541
noname#187541
回答No.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 このようになります。どうでしょうか。

koro_koro_koro
質問者

お礼

ありがとうございました。 なるほど、こっちの書き方のほうがスマートっぽいですね。

回答No.2

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 と宣言します。

koro_koro_koro
質問者

お礼

ありがとうございました。 ただやはり、Integerでもうまくいくときがあるのが??? になっています。

  • fly_moon
  • ベストアンサー率20% (213/1046)
回答No.1

ぱっと見て思っただけですが、 Dim RES_CAM1(1 To 4000, 1 To 10) As Long Dim RES_CAM2(1 To 4000, 1 To 10) As Long でもダメですか?Integerで扱える範囲を超えているものがあるだけのように感じましたが…

koro_koro_koro
質問者

お礼

ありがとうございました。 2の方もおっしゃられていたようにLongですか。 配列に入れるデータの中身が-32767~32768までだったので Integer宣言したのがまずかったのかな。

関連するQ&A

  • マクロの処理速度が遅くなってしまいました

     今までエクセル2000を使用していたのですが、エクセル2003にバージョンアップして、以下の処理速度を検証したところ、処理が遅くなってしまいました。内容はsheet2にあるデータを変数に格納して簡単な計算をした後にsheet1に入力するということを5回繰り返し、それぞれの処理にかかる時間をsheet3に表示するというものです。 Sub タイム計測()   Dim myStart As Single, myGoal As Single   Dim j As Integer   Application.ScreenUpdating = False   Sheets(1).Select   Cells.Clear     For j = 1 To 5       myStart = Timer         Call サンプル       myGoal = Timer - myStart       Sheets(3).Select       Cells(j, 1) = myGoal       Sheets(1).Select     Next     Sheets(3).Select   Application.ScreenUpdating = True End Sub Sub サンプル()   Dim i As Integer, j As Integer   Dim Data As Variant, KeKKa(1 To 2000, 1 To 199) As Variant   Data = Range(Sheets(2).Cells(1, 1), Sheets(2).Cells(2000, 199))   For i = 1 To 2000     For j = 1 To 199       KeKKa(i, j) = Data(i, j) + Data(i, j)     Next   Next   Range(Cells(1, 1), Cells(2000, 199)) = KeKKa End Sub エクセル2000のときは1回当り平均して概ね0.7秒位で処理していたのですが、エクセル2003にすると1.4秒位かかってしまいます。処理速度が遅くなってしまうとバージョンアップした意味がないのですが、原因や改善策があればどなたか教えていただけないでしょうか?よろしくお願いします。

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

  • マクロが実行しない

     二行三列を一枡として月の勤務割表を作成しています。マクロで同じ事を しているのにMacro1の方が実行しません。お教え願えませんでしょうか。 (尚、図形を枠線上にコピペしています。) Sub Macro1()実行しません。 Dim i As Integer Dim j As Integer For i = 10 To 43 Step 2 For j = 10 To 103 Step 3 Select Case Cells(i, j).Value Case 1: ActiveSheet.Shapes("四角形1").Select Selection.Copy Cells(i + 1, j + 1).Select ActiveSheet.Paste End Select Next Next End Sub Sub Macro2()実行します。 ActiveSheet.Shapes.Range(Array("四角形1")).Select Selection.Copy Range("J11:K11").Select ActiveSheet.Paste End Sub

  • VBA超初心者です

    皆さんのお知恵を拝借させてください。 Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2007/12/1 ユーザー名 : 101 ' Dim pearend As Integer Dim code As Integer Dim codeend As Integer Dim sheet_name As String Dim dayend As Date Sheets("商品名").Select Range("A4").Select Selection.End(xlDown).Select pearend = Selection.Row() For l = 4 To pearend Step 2 For r = 2 To 3 Cells(l, r).Select code = Cells(l, r).Value Select Case code Case 1000 To 1999 sheet_name = "1000" Case 2000 To 2999 sheet_name = "2000" Case 3000 To 3999 ssheet_name = "3000" Case 4000 To 4999 sheet_name = "4000" Case 5000 To 5999 sheet_name = "5000" End Select Sheets(sheet_name).Select Range("B4").Select Selection.End(xlToRight).Select codeend = Selection.Column() Range("A5").Select Selection.End(xlDown).Select dayend = Selection.Row() For i = 2 To codeend If code = Cells(4, i).Value Then Range(Cells(dayend, i), Cells(5, i)).Select Selection.Copy Sheets("商品名").Select Range("K3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End If Next Next Next End Sub というマクロをつくってみたのですが、何順目かあたりから For r = 2 To 3 のrがなぜか4になっています。正直知識がないのでさっぱりわかりません。どこに問題があるか詳しい方教えてください。

  • マクロのプロシージャーの修正

    シートの加工場設定マスタの列が最初は、B列の4行目からD列の30行まで あったのですが、B列が不要になったのでB列を削除しました。 下記のようなマクロを記述していますが何処を修正すればよいか 教えてください。 Private bmas(20,3) Sub Kmas_call() Dim i As Integer, j As Integer, k As Integer Windows("加工品.xls").Activate Sheets("加工場設定マスタ").Select For i = 1 To 20 For j = 1 To 3 Bmas(i, j) = Cells(i + 4, j + 1) Next j Next i End Sub

  • VBAを使った九九、及び合計、平均の表の作り方

    Visual Basic初心者です。 Excel 2003を使って、九九表を表示させるプロジェクトを作りたいのですが、どうしても途中で詰まってしまい、九九だけどころか、合計と平均すら表示させることができない状態です。 私の途中まで組んだタグは以下の通りです。どなたかよろしくお願いします。 Private Sub CommandButton1_Click() Call Kuku End Sub Option Explicit Dim Sum(20) As Double Sub Kuku() Dim i As Double, j As Double, num As Integer num = InputBox("numの値を入力しなさい") Sheets("Date").Cells.Clear For i = 1 To num Sheets("Date").Cells(1, i + 1) = i Sheets("Date").Cells(1 + i, 1) = i Sum(i) = 0# For j = 1 To num Sheets("Date").Cells(i + 1, j + 1).Value = Sum(i) Sum(i) = i * j Next j Next i Call Heikin Call Hyoudai MsgBox ("処理が終了しました") Sheets("Date").Select End Sub Sub Heikin() Dim i As Double, num As Integer, n As Integer For i = 9 To num Sheets("Date").Cells(i + 1, n + 2).Value = Sum(i) Sheets("Date").Cells(i + 2, n + 1).Value = Sum(i) Next i End Sub Sub Hyoudai() Sheets("Date").Cells(1, 1) = "九九" Sheets("Date").Cells(1, 11) = "合計" Sheets("Date").Cells(1, 12) = "平均" End Sub

  • EXCEL VBA作成方法

    職場で頭の痛いことがありまして・・・ 月合計をEXCELで1つのシートに出すことは出来ますが、それを日付ごとに(1日~31日)複数シートにする方法がわかりません。 内容は自分で工夫をして見ましたがうまくできません。ご教授をいただけますでしょうか? Sub 月別シート分割() Dim 元シート As Worksheet Dim 列幅() As Variant Dim 条件列 As Integer Dim 月 As Long Dim 条件1 As String, 条件2 As String Dim i As Integer, j As Long Set 元シート = ActiveSheet ActiveCell.CurrentRegion.Select ReDim 列幅(Selection.Columns.Count) For i = 1 To Selection.Columns.Count 列幅(i) = Selection.Cells(, i).ColumnWidth Next 条件列 = 1 月 = Month(ActiveCell.Offset(1, 条件列 - 1)) If Selection.AutoFilter Then Selection _ .AutoFilter For i = 1 To 31 Sheets.Add Before:=Sheets(i) ActiveSheet.Name = i & "" 条件1 = ">=" & DateSerial(月, i, 1) 条件2 = "<" & DateSerial(月, i + 1, 1) 元シート.Activate ActiveCell.CurrentRegion.Select Selection.AutoFilter Field:=条件列 _ , Criteria1:=条件1 _ , Operator:=xlAnd _ , Criteria2:=条件2 Selection.SpecialCells( _ xlCellTypeVisible).Copy Sheets(i).Range("A1").PasteSpecial For j = 1 To Selection.Columns.Count Sheets(i).Cells(, j).ColumnWidth _ = 列幅(j) Next j Next i Selection.AutoFilter Sheets(1).Activate End Sub

  • VBAで実行時エラー'13': がでます

    初歩の初歩ですいません。 VBAで Dim A As Integer Dim B As Integer Dim C As Integer Dim gokei As Integer For i = 8 To 70 A = Cells(i, 4).Value B = Cells(i, 5).Value C = Cells(i, 6).Value goukei = A + B + C Cells(i, 7) = goukei Next i としていますが A = Cells(i, 4).Value のところで今使っているシートだと止まってしまいます。 新規でワークシートを使って仮に数字を代入すると普通に動きます。 今使っているシートもセル内には =100 と入力して 100 と表示され セルの書式設定も数値になってるんですがどうしてでしょうか?

  • VBAtest

    VBAおn以下の Sheets("OP").Select Dim atai As String atai = Cells(2, 2).Value Dim datedata(40) As String For j = 0 To 40 If Cells(j + 3, 2).Value = "" Then Else datedata(j) = Cells(j + 3, 2).Value End If Next Dim shihyou As String For i = 1 To 2 shihyou = Cells(2, i + 2).Cells.Value Sheets(shihyou).Select Dim tmp_c As Integer For r = 1 To 10 tmp_c = 0 For c = 1 To 10 If tmp_c = 0 Then If Sheets(shihyou).Cells(r, c).Value = atai Then tmp_c = c End If Else Dim vals(40) As String For k = 0 To 40 For l = 1 To r + 41 For m = 1 To tmp_c - 1 If Sheets(shihyou).Cells(l, m).Value = datedata(k) Then vals(k) = Sheets(shihyou).Cells(l, tmp_c).Value End If Next Next Next End If Next Next Sheets("OP").Select For k = 3 To 43 Cells(k, i + 2).Value = vals(k - 3) Next Next End Sub

  • VBAでの質問

    お世話になります。 下記の記述で、「←」の矢印の記述で、 Cells.(5,2)がブランクでなければ、 「→」から進めたいのですが、 どの様に記述すれば宜しいでしょうか ご教示お願いします。 Sub 表記入() Dim Data As Range Dim i As Integer Dim j As Integer Dim k As Integer Set Data = Sheets("集計").Range("A2").CurrentRegion j = 16 k = 0 With Sheets("表") For i = 3 To Data.Rows.Count If Data.Cells(i, 51) <> "" Then .Cells(5, 2) = Data.Cells(i, 3)  ← .Cells(5, 7) = Data.Cells(i, 4) → .Cells(j, 2) = Data.Cells(i, 10) .Cells(j, 6) = Data.Cells(i, 11) & Data.Cells(i, 12) .Cells(j, 14) = Data.Cells(i, 51) Else End If k = k + 1 If k = 10 Then j = j + 18 k = 0 Else j = j + 1 End If End If Next i End With End Sub

専門家に質問してみよう