Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10962 / 13646 ツリー ←次へ | 前へ→

【18887】スタックが一杯になったエラー ポリフェノール 04/10/15(金) 16:20 質問[未読]
【18888】Re:スタックが一杯になったエラー IROC 04/10/15(金) 16:27 回答[未読]
【18929】Re:スタックが一杯になったエラー ポリフェノール 04/10/16(土) 22:47 お礼[未読]
【18894】Re:スタックが一杯になったエラー ichinose 04/10/15(金) 17:00 発言[未読]

【18887】スタックが一杯になったエラー
質問  ポリフェノール  - 04/10/15(金) 16:20 -

引用なし
パスワード
   フォーム上のテキストボックスに入力されたデータを
読込み、シートに書込んでいくプログラムを書いています。

フォーム1でデータを入力し、フォーム1をアンロードし、
フォーム2でデータを入力し、フォーム2をアンロードし、
データをシートに書込んだ後、
再びフォーム1を表示するという手順を繰り返します。

80回くらい繰り返していると、スタックが溢れたという意味の
エラーメッセージが表示され、プログラムが停止してしまいます。

10回に一度くらい、
ThisWorkbook.Save
を入れましたが、変わりありませんでした。

解決策をご存知の方、ご助言ください。

【18888】Re:スタックが一杯になったエラー
回答  IROC  - 04/10/15(金) 16:27 -

引用なし
パスワード
   オブジェクト変数などを解放していない等はありませんか?

エラーメッセージの詳細は分かりませんか?

アンロードせずに、Hide して値をクリアしては如何でしょうか?

【18894】Re:スタックが一杯になったエラー
発言  ichinose  - 04/10/15(金) 17:00 -

引用なし
パスワード
   ポリフェノール さん、IROCさん
こんにちは。

>フォーム上のテキストボックスに入力されたデータを
>読込み、シートに書込んでいくプログラムを書いています。
>
>フォーム1でデータを入力し、フォーム1をアンロードし、
>フォーム2でデータを入力し、フォーム2をアンロードし、
>データをシートに書込んだ後、
>再びフォーム1を表示するという手順を繰り返します。
>
>80回くらい繰り返していると、スタックが溢れたという意味の
>エラーメッセージが表示され、プログラムが停止してしまいます。
>
>10回に一度くらい、
>ThisWorkbook.Save
>を入れましたが、変わりありませんでした。
>
>解決策をご存知の方、ご助言ください。

コードを見ないと何ともいえないのですが・・・。
例えば、以下のコード
'===============================
Sub test()
Dim a As Long
Call test2(a)
End Sub
'
Sub test2(aaa As Long)
Call test3(aaa)
End Sub
'
Sub test3(bbb As Long)
Call test2(bbb)
End Sub

testを実行すればすぐに「スタック領域が不足しています」というエラーが
発生します。

VBAのインタープリタの詳細は知りませんが、

プロシジャーが呼び出された時点でスタックと呼ばれるメモリ構造をもった領域が確保され
そこには、戻り番地やパラメータ情報が格納されます。
呼び出し元に戻るタイミングで領域が解放される仕組みになっているはずなんですが。

どこかに上記の仕組みから違反しているようなコードの記述がないかも
確認してみて下さい。

【18929】Re:スタックが一杯になったエラー
お礼  ポリフェノール  - 04/10/16(土) 22:47 -

引用なし
パスワード
   フォームをshowしてunloadして、また、
showしてunloadするという繰り返しで、
unloadの代わりにhideにしてみました。

今のところ、改善されたよう思いますが、
また、異常が出たら質問させていただきます。

有難うございました。

10962 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free