Событие Workbook_Open, ошибочно инициируемое при связывании с книгой xlsm - PullRequest
0 голосов
/ 23 апреля 2019

Я использую базу данных SQL [Edit] только для чтения (от третьего лица!) [/ ​​Edit], xlsm, xls (сохраненную копию xlsm, только без макросов) и mdb (база данных Access).

Они связаны следующим образом:

  • xlsm получает данные из базы данных SQL каждые 5 минут с помощью кода Application.OnTime, запускаемого в Workbook_Open.
  • Затем xlsm сохраняет себя как 2003 xls.
  • Поскольку модули кода еще существуют в тот момент (рабочая книга еще не закрыта), я могу открыть mdb Access и обновить ссылку Excel на таблицу в данных 2003 года, а затем закрыть Access.

  • Затем я снова открываю xlsm, вызывая новый экземпляр Application.Ontime.

  • Я наконец закрыл книгу xls 2003 года.

Эта последовательность запускается в рабочее время и при первом запуске после 17:00 устанавливает таймер для повторного запуска процесса утром.

Моя проблема заключается в том, что всякий раз, когда я открываю файл с подключением или ссылкой на xlsm, событие Workbook_Open, по-видимому, срабатывает, и в итоге я получаю файл 2003 xls, открытый на клиентских компьютерах. Я знаю, что это не просто оставшийся Application.OnTime на моем (ПК, на котором я изначально создавал файлы), потому что теперь он используется, и другие клиенты, которые никогда не открывали xlsm, получают случайный файл 2003, когда они используют Excel.

Если этого недостаточно, чтобы кто-то узнал, что происходит, я с удовольствием отправлю код - но я надеюсь, что кто-то видел это раньше или знает об этой ошибке новичка и может просто дать мне строку, по которой я скучаю.

Большое спасибо за вашу помощь!

Ответы [ 3 ]

2 голосов
/ 23 апреля 2019

Я думаю, причина того, что XLS всплывает на ваших клиентах, заключается в том, что Excel должен открыть связанный XLSM для доступа к данным, и поэтому Workbook_Open запускается.

Несколько альтернативк предложениям, которые у вас есть в комментариях;

  • Проверьте Environ("Username") перед выполнением Application.OnTime, чтобы он работал только в том случае, если файл был открыт определенными пользователями.
  • Используйтефайл запуска для открытия XLSM в «режиме администратора» - вы можете сделать это, используя файл запуска для установки переменной Global -scope, а затем заставить XLSM проверить эту переменную перед запуском Application.OnTime.
  • Сделайте тест XLSM для некоторого фиктивного файла на локальном компьютере - тот, который вы легко можете создать вручную на компьютере, на котором вам нужен регулярный доступ к XLSM.Например, XLSM может искать C:\Data\xlsm-enabler.txt или все, что работает, и запускать соответствующий макрос только в том случае, если файл существует.
  • Как и выше, используйте SaveSetting для установки реестранажмите на машину (-и) "admin" и проверьте это в XLSM.
  • Установите XLSM на , примите параметры и используйте такие параметры, чтобы открыть файл в "режиме администратора"».Этот метод описан в нескольких других местах @ SO, например здесь .
  • Это скорее догадка - вы можете использовать свойство Workbook.ReadOnly вваш XLSM как условный.Это предполагает, что Excel открывает XLSM в режиме только для чтения при доступе к нему через подключения к данным, что я не знаю, так ли это на самом деле.
1 голос
/ 29 апреля 2019

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

SQL > Access > Excel

1 голос
/ 29 апреля 2019

Простым решением было бы использование всех других файлов с ссылкой на файл .xls вместо файла макроса с поддержкой .xlsm. Недостатком этого подхода является то, что вам придется (вручную) обновить все ваши ссылки.

...