Есть ли способ определить, не удалось ли установить соединение для передачи данных с помощью vba, прежде чем появятся окна с предупреждающими сообщениями?

Меня беспокоит, что в файле, к которому я хочу подключиться, есть блокировка чтения-записи, потому что он используется приложением, как показано: Заблокированный файл MS Access

Когда я пытаюсь обновить подключение к данным в MS Excel, эти ошибки / уведомления возникают из-за невозможности подключения к используемому файлу MS Access:

1st

2nd

3rd

4th

Мне интересно, есть ли способ для VBA определить, не удалось ли установить соединение для передачи данных. Я понятия не имею, как подойти к нему, и код VBA для обновления запроса показан ниже:

With ActiveWorkbook.Connections("Query - MS Access File")
    .OLEDBConnection.BackgroundQuery = False
    .Refresh
End With

Строка подключения моего подключения данных Excel к файлу Access показана ниже:

Provider=Microsoft.ACE.OLEDB.12.0;
User ID=Admin;
Data Source=C:\Users\ACER\Desktop\Test.MDB;
Mode=Share Deny Write;
Extended Properties="";
Jet OLEDB:System database="";
Jet OLEDB:Registry Path="";
Jet OLEDB:Engine Type=5;
Jet OLEDB:Database Locking Mode=0;
Jet OLEDB:Global Partial Bulk Ops=2;
Jet OLEDB:Global Bulk Transactions=1;
Jet OLEDB:New Database Password="";
Jet OLEDB:Create System Database=False;
Jet OLEDB:Encrypt Database=False;
Jet OLEDB:Don't Copy Locale on Compact=False;
Jet OLEDB:Compact Without Replica Repair=False;
Jet OLEDB:SFP=False;
Jet OLEDB:Support Complex Data=False
2
0
1 247
2

Ответы 2

Вы должны попробовать использовать метод state для проверки вашего соединения:

if ActiveWorkbook.Connections("Query - MS Access File").OLEDBConnection.State <> 1 then
   ' Your connection is not ready
end if

Спасибо @Vityala Я взял код с C# и забыл преобразовать в VB

kiks73 10.09.2018 11:46

@ kiks73 - пожалуйста. Однако ConnectionState.Open также является опцией .net. В VBA константа просто 1 - stackoverflow.com/a/17611807/5448626

Vityata 10.09.2018 11:49

@ kiks73 Спасибо за ответ, хотя я получаю ошибку Run-time error 438: Object doesn't support this property or method. Я использую этот код: If (ActiveWorkbook.Connections("Query - Test").OLEDBConnection.State <> ConnectionState.Open) Then MsgBox "Failed to connect" End If

Pherdindy 10.09.2018 11:51

@Pherdindy - см. Ответ из комментария выше, он довольно хорошо написан.

Vityata 10.09.2018 11:52

@ kiks73 Ошибка должна быть где-то в .OLEDBConnection.State. Я все еще получаю ту же ошибку. Есть ли какой-нибудь класс или модуль, который я должен получить? В классе OLEDBConnection в Object Browser нет элемента с именем State

Pherdindy 10.09.2018 12:02

В VBA .IsConnected - это логическое свойство, которое работает следующим образом:

If ActiveWorkbook.Connections("Query - MS Access File").OLEDBConnection.IsConnected Then

Это помогает взглянуть на встроенные библиотеки VBA, нажав Ctrl + Space и ища что-нибудь значимое:

enter image description here

Свойство OLEDBConnection.IsConnected (Excel)

Спасибо, я никогда не знал о ярлыке для встроенных библиотек, кроме F2. Хотя меня беспокоит следующее: у меня есть код обновления в методе Workbook.Open(), который предназначен для обновления всех подключений к данным. По умолчанию все не подключено, когда я его открываю, и мне интересно, возможно ли для VBA действительно поймать, если установление соединения не удалось, прежде чем появятся все окна с предупреждениями, как показано в основном сообщении. Так что я могу сделать что-то вроде: If connection has failed, then use this alternative method to connect. У меня есть альтернатива VBA для обхода сбоя, но она намного медленнее

Pherdindy 10.09.2018 12:14

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