これは実際にコード固有の質問ではありませんが、より興味深い(将来の問題を避けるための)何かがあるので、SOはそれを聞くのにふさわしい場所だと思いました。Application.ScreenUpdatingサブルーチン内で呼び出されるサブルーチン
私の質問の基礎はこれです:どのようにVBAはApplication.ScreenUpdating
とサブルーチン内で呼び出されるサブルーチンからの他のそのような呼び出しを扱うのですか?
たとえば、私はBackupData
というメソッドを持っていますが、これは非常に素早くアクティビティシートからデータを取り出し、同じ名前の "隠しシート"にコピーします(これを使用してユーザーにサブルーチンのアクションを元に戻すための通常のメソッドを使用することができないため、「元に戻す」マクロ)。 BackupData
では、ScreenUpdating
をFalseとTrueに切り替えるだけで、アクションはエンドユーザーから完全に隠されます。問題の問題は、ユーザーにマクロの実行に自由にアクセスできるようにするだけでなく、ScreenUpdating
プロパティを切り替える他のマクロから呼び出すことも選択できるという事実から生じます。 BackupData
は、マクロがFalseにScreenUpdating
プロパティを切り替えたこと後マクロ内から呼び出された場合
ので、プロパティをTrueに設定するBackupData
コールは、このようにの残りの部分を残して、「外」のルーチンの呼び出しを上書きします画面を更新して実行するマクロ?
今、明らかに、私はこの問題に対する簡単な解決策がたくさんあることを知っています。私はBackupData
にブール値を格納して、ScreenUpdating
が既に偽であるかどうかをチェックし、それが真であればそれを返さないか、またはBackupData
を実行した後に単にScreenUpdating = False
コールを繰り返すことができます。またはBackupData
それは私がこれらの他のマクロの中から実行する値をトグルしませんが、この問題のポイントはその解決策を見出すことではありません。
これは、VBAがネストされたサブルーチン呼び出しでどのように動作するのかという疑問ですが、ここで誰かがVBAが私のために問題を処理するかどうかについての確定的な回答で私の好奇心を満たすことができます上記の回避策の1つを使用する必要がある場合
TL; DR
は、私はすでに働いているオプションの多くがあるので、回避策ソリューションを捜しているわけではありません。 VBAがこれらの種類のコールをどのように処理するかを知っている人は、興味があります(ScreenUpdating
プロパティだけでなく、他のアプリケーションプロパティも同様です)。
最も一般的な推測はアプリケーション全体を参照する「アプリケーション」という言葉ですか、いいえ?すべてのサブブックや親ルーチンに適用されるアプリケーション全体のメソッドを呼び出しているので、スコープのサブルーチンは問題ありません。 –