[[20060307154723]] 『データを書きつづけるとスタック領域不足でエラー』(けいぴ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『データを書きつづけるとスタック領域不足でエラーとなる』(けいぴ)

UserFormでデータを入力して OKボタンを押すと
シート1にデータを追加していくような
マクロをくみました。

この場合 UserFormはずっと立ち上げた状態で
入力してはOK、入力してはOKと繰り返していくのですが、
200件くらい入力すると
スタック領域不足でエラーとなってしまいます。

セルに追記するごとに使用するメモリ領域が増えているようなのです
一度ファイルを閉じて、起動しなおすと大丈夫になりますが、
何か メモリ領域を開放する良い方法があれば
教えていただけないでしょうか

よろしくお願いします


 どのようなコードを書かれているかわかりませんが、
 Unloadしてみましたか? (seiya)


はい。Unloadしています
イメージ的には以下のような感じです

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件くらい入力するとスタック領域不足でエラーとなってしまいます。
 これは再現しなかったけど

 >セルに追記するごとに使用するメモリ領域が増えているようなのです
 ファイルサイズも大きくなるし、これは当たり前じゃないですかね? (アカギ)


ファイルサイズは大きくなってもよいのですが、
ファイル自体を一度保存して閉じて、開くと
再び 書きつづけられるので、
ファイルサイズが大きくなって困ると言うよりは、
セル領域のメモリを保持しつづけているのが原因のように
思うのです。

処理内でどうにかセルの領域のメモリを解放したかったのですが
それは不可能でしょうか。
(けいぴ)


ファイル自体を一度保存して、開くと再び 書き込み可能になるので、
OKボタンを押した後に、
ファイルを最初に開いた状態と同じメモリ状態にもっていければ
解決できないかと考えています。
このような解決方法何かご存知の方いらっしゃいますでしょうか。
申し訳ありませんが、よろしくお願い致します(けいぴ)


 確認したいのですが、新規ブックに(けいぴ)さんの書かれたマクロを貼り付けて、
 200回ぐらい実行すると「スタック領域不足」と表示される、ということですよね?

 >セル領域のメモリを保持しつづけているのが原因のように思うのです。 
 >処理内でどうにかセルの領域のメモリを解放したかったのですがそれは不可能でしょうか。
 これは意味がわからないです。 (アカギ)


ここに記載した処理は 簡略化したものですので、
実際は もっと一行のセルが多いです。
メモリ領域が解放されないのはセル領域ではなく、
UserFormが立ち上がっている間、マクロの処理が終了して無いと
判断されるため、ローカルに宣言した変数等が
メモリをつかんだままになっているのが
原因のようです。
なんとか OKボタンを押したら
メモリをつかんだままの状態ではなく、
保存して 閉じて開いた状態にしたいのですが、、
(けいぴ)


 対策案(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


 新規ブックで問題の再現できる最小限のコードを作ってください。 (アカギ)

下記にUserForm1内に記載した最小限のコードを記載します
これだと 400-500件目くらいでスタック領域が不足しました
このファイル以外に 同じフォルダに Data.xlsというファイルを作り
Sheet1に A列にコード、B列に名称がはいったデータを作成しています
Private Sub CommandButton1_Click()
     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


(続きです)
Function setname(key)
   'ブックオープン
    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

 参考↓によると、スタックを解放するにはセーブするしかないようです?

Excelファンクラブ
http://www.keep-on.com/excelyou/2000lng1/200001/00010025.txt

 (ramrun)

 2200回以上実行したけど再現しませんでした。疲れた・・・ (アカギ)


kazuさんの対策もやってみました。
(2回目に書いたコードでは肝心のUserForm1.TextBox1のほうに.Valueがぬけていましたが こちらもつけてやってみました)

でもやはりスタック領域 が不足するエラーがでてしまいました。

ramrunさんに教えていただいたサイトをみると、やはりマクロ内で
スタック領域は解放できないとのことですので、

運用するときに、100件くらいずつ処理したら
一回 ファイルを閉じて開くということで
対応することにしました。

いろいろご協力いただきありがとうございました
(けいぴ)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.