MS Excel VBA
August 13, 2022

Запуск хранимых процедур из VBA.

Для домашнего учёта раньше часто приходилось запускать хранимый sql код из MS Excel. В примере ниже идёт обращение к MS SQL Server, но, в принципе, это может быть любая РСУБД, в которой есть хранимые процедуры и до которой можно достучаться при помощи ODBC, например.

Вызываемая хранимая процедура не возвращает набор данных в MS Excel, а делает некоторые манипуляции внутри БД.

Сигнатура хп:

ALTER PROCEDURE [dbo].[p_MakeSource]
(@d1 datetime='20140101' , @d2 datetime='20300101', @N smallint=1 )

Собственно, далее в коде всё понятно, старый добрый Visual Basic - привет нулевые.

Sub a_ProcExecute()
Dim MyCommand As ADODB.Command
Call ini_param 'Инициализация параметров N_param, d1_param, d2_param
Call OpenConnection
Set GetSourceCommand = New ADODB.Command
dd1 = Now
With GetSourceCommand
    .ActiveConnection = Connection
    .CommandText = "dbo.p_MakeSource"
    .CommandType = adCmdStoredProc
    .NamedParameters = True
    .Parameters.Append .CreateParameter("@N", adInteger, adParamInput, , N_param)
    .Parameters.Append .CreateParameter("@d1", adDBDate, adParamInput, , d1_param)
    .Parameters.Append .CreateParameter("@d2", adDBDate, adParamInput, , d2_param)
    .Execute
End With
dd2 = Now
MsgBox "Расчеты произведены " & dd2, vbExclamation, dd1 & " Слава, слава великому Алексею Геннадьевичу!!! "
On Error GoTo KillAdo
Set GetSourceCommand = Nothing
CloseConnection
Exit Sub
KillAdo:
MsgBox "Ой, ошибка вышла. " & Err.Description, vbCritical
Set GetSourceCommand = Nothing
Set Connection = Nothing
Application.ScreenUpdating = True
End Sub

Единственное, что навскидку сразу не понять, строка с передачей параметров из кода VBA в хранимую процедуру, типа

.Parameters.Append .CreateParameter("@d2", adDBDate, adParamInput, , d2_param)

Поможет гугление "ado DataTypeEnum".

PS Если на лист Экселя из хранимой процедуры нужно вернуть какой-то Select, код немножко изменится.