Периодическая ошибка при попытке управлять другой базой данных в VBA

StackOverflow https://stackoverflow.com/questions/70417

  •  09-06-2019
  •  | 
  •  

Вопрос

У меня есть следующий код:

Dim obj As New Access.Application
obj.OpenCurrentDatabase (CurrentProject.Path & "\Working.mdb")
obj.Run "Routine"
obj.CloseCurrentDatabase
Set obj = Nothing

Проблема, с которой я экспериментирую, - это всплывающее окно, в котором сообщается, что Access не может установить фокус на другую базу данных.Как видно из кода, я хочу запустить подпрограмму в другом mdb.Любой другой способ добиться этого будет оценен по достоинству.

Я работаю с MS Access 2003.

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

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

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

Возможно, это из-за первой строки кода «Подпрограммы»:Если vbno = msgbox («Вы хотите обновить?», Vbyesno, «Обновление»), то выходите к концу, если

Я сделаю еще одну подпрограмму без MsgBox.

Мне удалось воспроизвести это поведение.Это происходит, когда фокус должен сместиться на вызываемую базу данных, но пользователь устанавливает фокус ([ALT]+[TAB]) на первую базу данных.«Решение» заключалось в обучении пользователя.


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

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

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

Возможно, это из-за первой строки кода «Подпрограммы»:Если vbno = msgbox («Вы хотите обновить?», Vbyesno, «Обновление»), то выходите к концу, если

Я сделаю еще одну подпрограмму без MsgBox.


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

Это было полезно?

Решение 3

Мне удалось воспроизвести ошибку в «разработке».

«Это действие невозможно выполнить, поскольку другое приложение занято.Выберите «Переключиться на», чтобы активировать…».

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

Филипп, ваш ответ, конечно, правильный.Я бы выбрал этот путь, если бы заранее не разработал «рутину».

«Мне удалось воспроизвести такое поведение.Это происходит, когда фокус должен сместиться на вызываемую базу данных, но пользователь устанавливает фокус ([ALT]+[TAB]) на первую базу данных.«Решением» было обучить пользователя». Поскольку невозможно запретить пользователю переключать приложения в Windows, я хотел бы закрыть тему.

Другие советы

Я предполагаю, что это сообщение об ошибке связано с состоянием одной из ваших баз данных.Вы используете здесь соединения Jet и объекты Access, и вы не сможете по нескольким причинам (многопользовательская среда, невозможность удалить файл блокировки LDB и т. д.) правильно закрыть активную базу данных и открыть другую.Итак, по моему мнению, решение состоит в том, чтобы забыть о движке Jet и использовать другое соединение для обновления данных в «другой» базе данных.

Когда вы говорите: «Поток данных состоит в том, чтобы обновлять все «проекты» один раз в месяц в одной базе данных, а затем делать эту информацию доступной в другой базе данных», я предполагаю, что роль вашей «Подпрограммы» заключается в обновлении некоторых данных либо через SQL инструкции или эквивалентные обновления набора записей.

Почему бы вам не попытаться внести соответствующие обновления, открыв соединение с другой базой данных и (1) отправив соответствующие инструкции SQL или (2) открыв набор записей и выполнив запрошенные обновления?

Одной из идей может быть, например:

Dim cn as ADODB.connexion, 
    qr as string, 
    rs as ADODB.recordset

'qr can be "Update Table_Blablabla Set ... Where ...
'rs can be "SELECT * From Table_Blablabla INNER JOIN Table_Blobloblo  

set cn = New ADODB.connexion
cn.open

You can here send any SQL instruction (with command object and execute method) 
or open and update any recordset linked to your other database, then

cn.close

Это также можно сделать через соединение ODBC (и DAO.recordsets), чтобы вы могли выбирать свои любимые объекты.

Если вам нужен другой способ запуска функции, попробуйте следующее:

Dim obj As New Access.Application
obj.OpenCurrentDatabase (CurrentProject.Path & "\Working.mdb")

obj.DoCmd.RunMacro "MyMacro"
obj.CloseCurrentDatabase
Set obj = Nothing

Где 'МойМакрос'имеет действие'RunCode' с именем функции, которую вы предпочитаете выполнить в Work.mdb

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top