スタック領域が不足しています (エラー 28)Out of stack space (Error 28)

スタックとは、実行中のプログラムの需要に応じて動的に増減されるメモリの作業領域です。The stack is a working area of memory that grows and shrinks dynamically with the demands of your executing program. このエラーの原因と解決策を以下に示します。This error has the following causes and solutions:

  • FunctionSubProperty のいずれかのプロシージャのアクティブな呼び出しの数が多すぎる。You have too many active Function, Sub, or Property procedure calls. プロシージャの入れ子が深すぎないかどうかを確認します。Check that procedures aren't nested too deeply. この問題は、再帰プロシージャ (自身を呼び出すプロシージャ) でよく発生します。This is especially true with recursive procedures, that is, procedures that call themselves. 再帰プロシージャが正しく終了していることを確認してください。Make sure recursive procedures terminate properly. [ 呼び出し ] ダイアログ ボックスを使用して、(スタックの) アクティブなプロシージャを確認します。Use the Calls dialog box to view which procedures are active (on the stack).

  • ローカル変数に必要なローカル変数領域が使用可能な領域を超えている。Your local variables require more local variable space than is available.

    いくつかの変数をモジュール レベルで宣言してみます。Try declaring some variables at the module level instead. PropertySub、または Function の各キーワードの前に Static を挿入して、プロシージャのすべての変数を静的変数として宣言することもできます。You can also declare all variables in the procedure static by preceding the Property, Sub, or Function keyword with Static. Static ステートメントを使用して、プロシージャ内で個別に Static 変数を宣言することもできます。Or you can use the Static statement to declare individual Static variables within procedures.

  • 固定長の文字列が多すぎます。You have too many fixed-length strings. プロシージャ内の固定長文字列は、より迅速にアクセスできますが、文字列データそのものがスタックに配置されるため、可変長文字列よりも多くのスタックスペースを使用します。Fixed-length strings in a procedure are more quickly accessed, but use more stack space than variable-length strings, because the string data itself is placed on the stack. 固定長の文字列の一部を可変長文字列として再定義してください。Try redefining some of your fixed-length strings as variable-length strings. プロシージャで可変長文字列を宣言すると、スタックには (データそのものではなく) 文字列記述子のみが配置されます。When you declare variable-length strings in a procedure, only the string descriptor (not the data itself) is placed on the stack. また、スタック領域を必要としないモジュールレベルで文字列を定義することもできます。You can also define the string at module level where it requires no stack space. モジュールレベルで宣言された変数は既定でPublicになるので、この文字列はモジュール内のすべてのプロシージャに表示されます。Variables declared at module level are Public by default, so the string is visible to all procedures in the module.

  • 入れ子になった DoEvents 関数呼び出しの数が多すぎる。You have too many nested DoEvents function calls. [ 呼び出し ] ダイアログ ボックスを使用して、スタックのアクティブなプロシージャを確認します。Use the Calls dialog box to view which procedures are active on the stack.

  • コードでイベントの連鎖がトリガーされている。Your code triggered an event cascade. イベントの連鎖は、既にスタックにあるイベント プロシージャを呼び出すイベントがトリガーされると発生します。An event cascade is caused by triggering an event that calls an event procedure that's already on the stack. 終了していない再帰プロシージャ呼び出しに似ていますが、コードで明示的に呼び出されるのではなく Visual Basic によって呼び出されるため、よりわかりにくくなります。An event cascade is similar to an unterminated recursive procedure call, but it's less obvious, since the call is made by Visual Basic rather than by an explicit call in your code. [呼び出し] ダイアログ ボックスを使用して、(スタックの) アクティブなプロシージャを確認します。Use the Calls dialog box to view which procedures are active (on the stack).

[呼び出し] ダイアログボックスを表示するには、[デバッグ] ウィンドウの [プロシージャ] ボックスの右にある [呼び出し] ボタンをクリックするか、[呼び出し] コマンドをクリックします。To display the Calls dialog box, select the Calls button to the right of the Procedure box in the Debug window or choose the Calls command. 詳細については、該当する項目を選択し、F1 キー (Windows の場合) または HELP (Macintosh の場合) を押してください。For additional information, select the item in question and press F1 (in Windows) or HELP (on the Macintosh).

サポートとフィードバックSupport and feedback

Office VBA またはこの説明書に関するご質問やフィードバックがありますか?Have questions or feedback about Office VBA or this documentation? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.