учти
при закрытии формы подключение будет закрыто и выполнение команды прервется.
если кнопку нажать несколько раз,то команда попадет в очередь
и будет последовательно выполнятся в контексте конекта.(т.е. сначала закончится выполнение перво потом запустится вторая)
Что можно сделать на основе формы чтобы получить асинхронного исполнителя...
создавать экземпляры формы чтобы выполнять сразу несколько команд
форма может держать сама себя ("Мюнхаузен")
и сама контролировать свое закрытие при завершении команды
В модуле формы
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any _
) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim frm As Form 'ссылка на саму себя "Мюнхаузен"
Private WithEvents cnn As ADODB.Connection
Private Sub Form_Open(Cancel As Integer)
'подвешиваем Мюнхаузена
Set frm = Me
End Sub
Private Sub Form_Close()
cnn.Close
Set cnn = Nothing
'Топим "Мюнхаузена"
Set frm = Nothing
End Sub
Private Sub Form_Unload(Cancel As Integer)
'Упс нашу форму выгружают закрывая акс надо чето делать
'ато команда прервется недовыполнившись
'например сештаки подождать но это черевато если команда к примеру в дедлоке
'ну вылетит по таймауту...
Do Until cnn.State = 1
Sleep 333 ' цикл с дуевентом без передышки вешает проц ну вот и передышка :)
DoEvents
Loop
End Sub
'публичное свойство для передачи команды в форму
Public Property Let RunStr(RStr As String)
'здесь запускаем нашу команду
Set cnn = New ADODB.Connection
cnn.Open CurrentProject.AccessConnection
cnn.CommandTimeout = 900
cnn.Execute RStr, , adAsyncExecute
End Property
Private Sub cnn_ExecuteComplete(ByVal RecordsAffected As Long _
, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum _
, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset _
, ByVal pConnection As ADODB.Connection)
'Мавр сделал свое дело мавр может уходить...
'заставляем наш экземпляр формы закрытся
SendMessage Me.hwnd, WM_CLOSE, 0&, 0&
End Sub
Фукция обертка в модуле
Public Sub SpRun(Str As String)
Dim frm As Form
Set frm = New Form_AsyncExecfrm
frm.RunStr=Str
'уничтожаем ссылку но форма уже сама себя держит
Set frm = Nothing
End Sub
PS Вместо формы можно сделать абычный класс но это немного сложнее