
Excel 2019 Windows
У меня есть рабочая книга из 4 страниц, и на каждой странице есть модуль VBA, который выполняет различные задачи с данными из предыдущего рабочего листа, поэтому их нужно запускать одну за другой, но ТОЛЬКО после завершения предыдущей и в этот момент они запускаются вручную.
Я хотел бы иметь один модуль/макрос, ради аргументации, под названием «RunAll», который при щелчке/вызове выполняет ту же задачу.
Модуль 1. Импортирует и очищает данные из файла txt с разделителями на листе 1 — данные состоят из 2000–110 000 строк.
Модуль 2. Просматривает Лист 1, выбирает определенные данные и форматирует их на Листе 2.
Модуль 3. Просматривает Лист 2, выбирает определенные данные и форматирует их на Листе 3.
Модуль 4. Просматривает Лист 3, выбирает определенные данные и форматирует их на Листе 4.
Каждый модуль закодирован таким образом, что он знает, на какой лист смотреть и куда вставлять свои данные.
Это очень упрощенная версия, так что вам не придется читать длинный пост, но при ручном запуске один за другим они все работают отлично.
Но если я просто попробую макрос, который гласит:
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 попал в точку. Если вы вызываете макрос "module 1" вручную с выбранным sheet1, но что произойдет, если вы выполните его вручную, скажем, с выбранным sheet2 или 3? Вам в основном нужно жестко закодировать ссылки на sheet#.