VBA はモジュール 1 を実行し、完了するまで待ってからモジュール 2 を実行し、完了するまで待ってからモジュール 3 を実行し、完了するまで待ってからモジュール 4 を実行します。

VBA はモジュール 1 を実行し、完了するまで待ってからモジュール 2 を実行し、完了するまで待ってからモジュール 3 を実行し、完了するまで待ってからモジュール 4 を実行します。

Excel 2019 Windows

4 ページのワークブックがあり、各ページには前のワークシートのデータに対してさまざまなタスクを実行する VBA モジュールがあるため、前のワークシートが終了した場合にのみ、これらのタスクを次々に実行する必要があります。現時点では、これらのタスクは手動で実行されています。

議論のために「RunAll」という単一のモジュール/マクロを用意し、クリック/呼び出されたときに同じタスクを実行したいと思います。

モジュール 1。区切り文字付き txt ファイルからシート 1 にデータをインポートしてクリーンアップします。データは 2,000 行から 110,000 行の範囲で構成されます。

モジュール 2。シート 1 を参照して特定のデータを選択し、シート 2 にフォーマットします。

モジュール 3。シート 2 を参照して特定のデータを選択し、シート 3 にフォーマットします。

モジュール 4。シート 3 を参照して特定のデータを選択し、シート 4 にフォーマットします。

各モジュールは、どのシートを参照し、どこにデータを挿入するかを認識できるようにコーディングされています。

これは非常に簡略化されたバージョンなので、長い投稿を読む必要はありませんが、手動で次々に実行すると、すべて完璧に機能します。

しかし、単に次のように記述した maco を試してみると、

Call module1
Call module2
Call module3
Call module4

一部のシートのデータが混乱しているため、一部のモジュールの実行に他のモジュール (モジュール 1 とモジュール 2) よりも時間がかかるため、すべてのデータが正しくインポートされフォーマットされる前に、先行するモジュールがタスクを完了する前に、他のモジュールが実行されているのではないかと考えています。

そこで私がやろうとしているのは...

Call Module1 (and only when it has finished then)

Call Module2 (and only when it has finished then)

Call Module3  (and only when it has finished then)

Call Module4

ここに投稿する前に、考えられる答えを求めてオンラインで徹底的に検索しましたが、私のニーズに合うものは何も見つからず、私が見つけた答えのかなりの部分は、私にはまったく理解できませんでした。

答え1

VBA はシングル スレッドです。したがって、異なる呼び出しは同時に実行されません。

@Mathieu はまさにその通りです。sheet1 を選択した状態で「モジュール 1」マクロを手動で呼び出した場合、sheet2 または sheet3 を選択した状態で手動で実行するとどうなるでしょうか。sheet# への参照をハードコードする必要があります。

関連情報