Закрыть и перезапустить Excel в произвольный момент при запуске макроса?

423
a.t.

Предположим, в файле example_codeExcel 2016 есть маркер : example_excel.xlsmв нем много кода, но не создаются внешние файлы (все вычисления выполняются в example_excel.xlsm.

Мне было любопытно, есть ли способ:

  1. Прервать / приостановить выполнение кода в любой момент.
  2. Вручную добавьте следующую строку в коде: Запускает / вызывает функцию / подпрограмму, которая:
  3. Сохраняет полное example_excel.xlsmсостояние (включая активированный и выбранный лист и ячейку, а также переменную / среду выполнения кода),
  4. Закройте его в любой произвольной точке кода и
  5. Снова откройте Excel
  6. Продолжайте выполнять код example_codeс того места, где вы остановились,
  7. После удаления вставленной строки, которая сохраняет состояние Excel,
  8. либо мгновенно
  9. или после нажатия 1 кнопки / запуска 1 макроса?

Поскольку у меня есть сложный код, который выполняется в течение 2 часов при выполнении нескольких запрограммированных установок «решателя» и при устранении неполадок в определенном состоянии решателя, я жду час, прежде чем это состояние возникает / срабатывает.

Теперь простым решением будет поиск всех параметров, состояний листа и ячеек, которые присутствуют в этом состоянии, сохранение их на отдельном листе и их повторная инициализация. Но это не допускает гибкости при устранении неполадок, если необходимо оценить другое состояние, и это не удобно при использовании объекта .ie, в котором есть бесконечный цикл, например, у parent есть дочерний элемент, у которого есть элемент, являющийся родительским. снова (я думал, что это существовало, хотя я не уверен).

Сложный ответ: переписать / реорганизовать ваш код, чтобы он стал менее сложным и более проницательным. Это, безусловно, нужно сделать, но даже когда это будет сделано, универсальный инструмент для сохранения состояний во время работы, по крайней мере, для меня, желателен.

Пока что предпринимаются попытки: [в редактировании-разработаем.] Моя главная трудность в том, что я не знаю, как пройти через все параметры / переменные, если список параметров неизвестен.

До сих пор, поскольку исходная задача состояла из нескольких прогонов по 2 часа, я написал код, который автоматически копирует все листы, а также все модули и формы из текущего Excel в другой Excel. Это позволяет сохранять все, кроме переменных внутри кода, а также активацию листа и ячейки.

Поскольку этот код специально не применяется к произвольному времени во время выполнения кода и не копирует переменные, используемые Excel, я считаю этот код не по теме, если не требуется иное.

Мне кажется, что я ищу очень суженный подход к решению, поэтому приветствуются предложения по изучению различных / более широких вариантов решения проблемы!

0
Нет, для этого нет встроенного способа. VBA не может хранить какую-либо информацию между запусками. Ваши единственные варианты - записать ваш макрос таким образом, чтобы он записывал всю релевантную информацию на лист и считывал ее обратно, когда вам нужно возобновить выполнение. Máté Juhász 5 лет назад 0
Спасибо @ MátéJuhász, я полагаю, я не знаю достаточно о правильном программировании этикета, чтобы понять, почему этот вариант не очень эффективен, чтобы иметь в Excel, но, возможно, есть другая причина. Возможно, будут предложены некоторые творческие решения. a.t. 5 лет назад 0
«Возможно, будут предложены некоторые варианты творчества» - что именно вы ожидаете? VBA - это в основном язык сценариев, включенный в Excel для автоматизации задач и не предназначенный для чего-то большего. Это имеет свои ограничения в отношении производительности и функциональности, конечно, вы можете обойти их, но это требует много кода. Máté Juhász 5 лет назад 0
Я ожидаю, что я не единственный, кто пытался решить эту проблему вместо того, чтобы обойти ее. Я ожидаю, что есть вероятность, что кто-то решил эту проблему для менее сложного сценария (можно, например, без решателя написать код, который действительно автоматически сохраняет состояние.) Я ожидаю, что если этот человек / некоторые из этих людей поделятся этим информация, есть вероятность, что эта другая точка зрения позволяет мне решить мою проблему. Я опубликую свое решение более сложной / другой проблемы, если найду такую. Я ожидаю, что это может / могло бы принести пользу кому-то другому после меня. a.t. 5 лет назад 0
Я еще не сделал ничего подобного, надеюсь, кто-то еще поделится этим. В любом случае, он должен следовать этому подходу: записывать в электронную таблицу ВСЕ переменные либо регулярно, либо каждый раз, когда они меняются, затем при возобновлении читать их обратно и продолжать макрос. Я уверен, что это сильно усложнит код. Máté Juhász 5 лет назад 0
@ MátéJuhász Спасибо за предложение, оно заставило меня осознать, что проблема слишком ограниченная: хранение переменных регулярно или каждый раз, когда они меняются, делает код намного медленнее и сложнее. Принимая во внимание, что возможность вручную запустить 1 строку перед закрытием должна быть эффективной по времени. (Это позволило бы хранить только это состояние, а не непрерывные состояния). Поэтому я добавлю эту опцию. a.t. 5 лет назад 0

0 ответов на вопрос

Похожие вопросы