[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『データを書きつづけるとスタック領域不足でエラーとなる』(けいぴ)
UserFormでデータを入力して OKボタンを押すと
シート1にデータを追加していくような
マクロをくみました。
この場合 UserFormはずっと立ち上げた状態で
入力してはOK、入力してはOKと繰り返していくのですが、
200件くらい入力すると
スタック領域不足でエラーとなってしまいます。
セルに追記するごとに使用するメモリ領域が増えているようなのです
一度ファイルを閉じて、起動しなおすと大丈夫になりますが、
何か メモリ領域を開放する良い方法があれば
教えていただけないでしょうか
よろしくお願いします
どのようなコードを書かれているかわかりませんが、 Unloadしてみましたか? (seiya)
Private Sub CommandButton1_Click()
Sheet1.Cells(1, 1) = Sheet1.Cells(1, 1) + 1 Sheet2.Cells(Sheet1.Cells(1, 1), 1) = UserForm1.TextBox1
Unload UserForm1
UserForm1.Label1 = Application.MemoryUsed & " バイトです。"
UserForm1.Show
End Sub
コードを確認しましたが、そのとおりですね...
今まで全く気がつきませんでした。 私も、他の方の回答を待ちます。 (seiya)
>200件くらい入力するとスタック領域不足でエラーとなってしまいます。 これは再現しなかったけど
>セルに追記するごとに使用するメモリ領域が増えているようなのです ファイルサイズも大きくなるし、これは当たり前じゃないですかね? (アカギ)
処理内でどうにかセルの領域のメモリを解放したかったのですが
それは不可能でしょうか。
(けいぴ)
確認したいのですが、新規ブックに(けいぴ)さんの書かれたマクロを貼り付けて、 200回ぐらい実行すると「スタック領域不足」と表示される、ということですよね?
>セル領域のメモリを保持しつづけているのが原因のように思うのです。 >処理内でどうにかセルの領域のメモリを解放したかったのですがそれは不可能でしょうか。 これは意味がわからないです。 (アカギ)
対策案(kazu)
Private Sub CommandButton1_Click() Sheet1.Cells(1, 1).Value = Sheet1.Cells(1, 1).Value + 1 Sheet2.Cells(Sheet1.Cells(1, 1).Value, 1).Value = UserForm1.TextBox1.Value Unload UserForm1 UserForm1.Label1 = Application.MemoryUsed & " バイトです。" UserForm1.Show End Sub
新規ブックで問題の再現できる最小限のコードを作ってください。 (アカギ)
Sheet1.Cells(1, 1).Value = Sheet1.Cells(1, 1).Value + 1 Sheet2.Cells(Sheet1.Cells(1, 1).Value, 1) = UserForm1.TextBox1 Sheet2.Cells(Sheet1.Cells(1, 1).Value, 2) = setname(UserForm1.TextBox1) ThisWorkbook.Save Unload UserForm1 UserForm1.Label1 = Application.MemoryUsed & " バイトです。" UserForm1.Show End Sub
'ブックオープン Workbooks.Open (ThisWorkbook.Path + "\Data.xls") With Workbooks("Data.xls").Worksheets("Sheet1").Range("a:a") Set C = .Find(What:=key, LookIn:=xlValues) If Not C Is Nothing Then firstAddress = C.Address Do If Format(C.Value) = key Then setname = Workbooks("Data.xls").Worksheets("Sheet1").Cells(C.Row, 2) findflg = 1 End If Set C = .FindNext(C) Loop While Not C Is Nothing And C.Address <> firstAddress Else End If End With 'マスタを閉じる Workbooks("Data.xls").Close (False) If findflg <> 1 Then setname = "" End If End Function Private Sub UserForm_Activate() UserForm1.TextBox1.SetFocus End Sub
けいぴさんはkazuさんの対策案を確認しましたか?
はやい話が、UserForm1.TextBox1.ValueとするだけでOKみたいです。 キャストがうまくいっていないってことなんでしょうね。
Private Sub CommandButton1_Click() Sheet1.Cells(1, 1) = Sheet1.Cells(1, 1) + 1 Sheet2.Cells(Sheet1.Cells(1, 1), 1) = UserForm1.TextBox1.Value 'Unload UserForm1 UserForm1.Label1 = Application.MemoryUsed & " バイトです。" 'UserForm1.Show End Sub
参考↓によると、スタックを解放するにはセーブするしかないようです?
(ramrun)
2200回以上実行したけど再現しませんでした。疲れた・・・ (アカギ)
でもやはりスタック領域 が不足するエラーがでてしまいました。
ramrunさんに教えていただいたサイトをみると、やはりマクロ内で
スタック領域は解放できないとのことですので、
運用するときに、100件くらいずつ処理したら
一回 ファイルを閉じて開くということで
対応することにしました。
いろいろご協力いただきありがとうございました
(けいぴ)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.