2017-08-14 12 views
0

私はVBAユーザーフォームを使用して、ユーザーが異なるWord文書を作成するのを支援するプロジェクトに取り組んでいます。要件の1つは、ユーザーがユーザーフォーム間を行き来できることです。VBA - ランタイム28「スタックスペース不足」エラーを回避するためにスタック呼び出しをアンロードできますか?

この最新のドキュメントには以前のものよりも多くのUserFormがありますが、私が見つけたのは、ほとんどのフォームを入力して戻ってランタイムエラー28 "Out of stack space"最初のものに戻って、もう一度進む。

先に進むと、初めてのこととは何も変わっていないので、再帰的なやり方ではなく、呼び出しの数の制限のためにスタックスペースが本当に不足していると思いますMicrosoftのドキュメントはこちらhttps://msdn.microsoft.com/en-us/library/aa264523(v=vs.60).aspx

記録のために、前後に進むときにフォームをアンロードしています。例:

Private Sub cb_back_Click() 'backward navigation 

    Unload Me 
    showPreviousForm 

End Sub 

私の質問は、VBAではスタックからコールをアンロードできますか?

私がやったことをユーザーがやることはほとんどありませんので、私はこのプロジェクトの部分については心配していませんが、プロジェクトの他の部分が限界にはるかに近い場合に知りたいと思います。

ありがとうございます。

答えて

1

スタックフレームを「アンロード」する唯一の方法は、そのスタックフレームから戻すことです。またはすべてを爆破することです。

私はUnload Meとは思っていません。でも、は意図したとおりに動作しますが、あなたのコールスタックを手助けするつもりはありません。 「前のフォームは、」表示されている間、それは閉じられ、実行がEnd Subに実行されるまで、その後、あなたのコールスタックは、までcb_back_Click()内のその位置を追跡し、:

問題がshowPreviousFormを呼び出す代わりに、呼び出し元に戻っていますコールスタックが巻き戻され、それが正しい場所にとどまります。

コールスタックデバッグツールウィンドウを使用してこの現象を観察できます。

VBAの呼び出しスタックにアクセスするプログラム的な方法はありません。エラー報告のためにスタックトレースを報告しようとしたことのある人なら誰でもそれが可能であると願っています。

解決策は、Unload Meではなく、発信者に次に進む必要がある場所を示すフォームインスタンスに状態を保存することです。 End Subがヒットした場合、呼び出し元はその状態値を調べて何をすべきかを判断できます。

+0

ありがとうございます。 私はコールスタックを助けてくれません。 (私は「ユーザーフォームをアンロードする」のような回答を避けようとしていました。)しかし、あなたは私がこれを将来的に受け入れることができる方向に私を指摘しました。私は、ユーザーフォームを閉じる方法と、すべてのサブを完了させる方法を理解する必要があります。私はすでに州を決定するのに十分な店を持っているので、あまりにも難しくはありません。 –

+1

@brett_x Documentation.SOはまだ起動していますが、[this](https://stackoverflow.com/documentation/vba/5351/user-forms#t=201708141749324381879);-) –

関連する問題