Функция запуска в Excel, когда внешний CSV-файл обновлен или пакетный файл завершен - PullRequest
0 голосов
/ 28 октября 2019

У меня есть книга Excel, в которой используется горячая клавиша, которая запускает командный файл, который запускает Node-скрипт, который обновляет CSV-файл. Технические подробности см. Ниже.

Рабочая книга использует файл CSV в качестве источника данных. Я могу вручную обновить рабочую книгу данными из файла CSV, перейдя на Data > Refresh All > Refresh All.

Есть ли способ запустить обновление в рабочей книге, если в CSV-файле появились новые данные, или когда пакетный файл заканчивается? Концептуально я спрашиваю, как внешнее событие может вызвать что-то в Excel.

Вот мелкие детали процесса:

Flochart

При нажатии горячей клавиши в книге Excel она запускает консоль MS («cmd.exe») и передает местоположение запускаемого пакетного файла и значение выбранной ячейки. Причина, по которой пакетный файл запускается таким образом, вероятно, не относится к этому вопросу, но я знаю, что он будет задан, поэтому я объясню: пакетный файл должен находиться в том же каталоге, что и рабочая книга, а это не так. жестко закодированное местоположение. Проблема в том, что при запуске batch-файла / cmd.exe по умолчанию будет работать рабочий каталог C: \ users \ name \ documents. Таким образом, чтобы запустить пакетный файл в том же каталоге, что и рабочая книга, путь к рабочей книге передается в cmd.exe следующим образом: CD [path], который затем объединяется в линию с другой командой для запуска пакетного файла со значениемвыбрана ячейка в качестве аргумента, например, так: CD [path] & batch.bat cellValue
Все еще со мной?

Затем пакетный файл запускает скрипт Node, снова с выбранным значением ячейки в качестве аргумента.

Сценарий Node извлекает данные из Интернета и выгружает их в файл CSV.

На данный момент рабочая книга все еще содержит устаревшие данные и нуждается в обновлении. Как это может быть автоматическим?

Я мог бы просто запустить статический таймер в VBA после запуска пакетного файла, который затем запускается ActiveWorkbook.RefreshAll, но если пакетный файл занимает слишком много времени, возникнут проблемы.

1 Ответ

0 голосов
/ 30 октября 2019

Я нашел решение, хотя это может быть не самый эффективный способ.

Прямо сейчас, после того, как Excel запустил пакетный файл, я установил его на цикл и многократно проверял дату изменения файла CSV с помощью FileDateTime("filename.csv")

Сначала этот цикл был проблемойпотому что я беспокоился о том, что Excel чрезмерно проверяет дату изменения CSV. Я думал, что это может вызвать проблемы с ресурсами, в то время как он проверяет, сколько сотен или тысяч раз в секунду. Я мог бы добавить 1-секундную задержку с функциями сна или ожидания, но они приводят к зависанию Excel. Он будет заморожен до тех пор, пока не будут обновлены файлы CSV, , если вообще . Пользователь должен будет использовать CTRL + BREAK в чрезвычайной ситуации.

Я смог использовать решение, которое просто зацикливается и выполняет DoEvents при проверке, пока не пройдет определенное время. Таким образом, Excel все еще функционирует во время ожидания. Подробнее об этом здесь: https://www.myonlinetraininghub.com/pausing-or-delaying-vba-using-wait-sleep-or-a-loop

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...