Как передать параметры соединения между модулями в макросе Excel
Вопрос
Я создаю 2 отчета на одном листе, используя макрос Excel.Отчеты подключаются к базе данных Oracle для получения данных.У меня есть строка подключения, которая извлекает данные, и она работает нормально.Я пытаюсь переместить строку подключения в функцию и передать ее в соответствующий отчет на основе пользовательского ввода.Вот поток высокого уровня:1.Пользователь нажимает кнопку меню.В фоновом режиме он пытается подключиться к БД.2.Если соединение успешное, открывается форма с двумя кнопками (отчет которых пользователь хочет запустить).Кнопка A и кнопка B 3.Предположим, что пользователь нажимает кнопку А, и отчет должен быть выполнен и отображен.
Проблема, с которой я столкнулся, находится на шаге 2.По какой-то причине я не могу передать параметры соединения функции кнопки А.
Ниже приведен фрагмент кода того, как я пытаюсь подключиться к dB.нужна помощь в том, как передать параметры соединения в функцию кнопки А.
Код для подключения к БД
Dim dbConnect As ADODB.Connection
Dim GetData As ADODB.Recordset
'Declare a set of variables to hold the username and password for the database
Dim strUserName As String
Dim strPassword As String
Dim strDatabase As String
Set GetData = New ADODB.Recordset
'***
On Error Resume Next
Set dbConnect = New ADODB.Connection
dbConnect.Open ( _
"User ID=" & strUserName & "; Password=" & strPassword & "; Data Source=" & strDatabase & "; Provider=msdaora")
'If the username or password is incorrect throw an error message
If (dbConnect.State <> 1) Or (Err <> 0) Then
intResult = MsgBox("Could not connect to the database. Check your user name and password." & vbCrLf & Error(Err), 16, " ")
Else
'.ConnectionString = dbConnect
ReportGenerator.Show ' this opens up another form where
' user can input the dates.
'This is turn calls the actual code...
End If
End Sub
В форме генератора отчетов передача параметров даты в функцию
Private Sub Login_Click()
Call ReportGenerator(FromDate.Value, ToDate.Value)
End Sub
Мне нужно передать параметры соединения в функцию CallReportGenerator.
Любые указатели будут полезны.
Решение
Есть несколько способов сделать это:
Опция 1:Используйте глобальную переменную
Если вы объявите переменную как Global
в верхней части модуля, т.е.перед любыми подпрограммами/функциями вы можете получить к ним доступ из любого другого модуля:
Пример — Модуль1:
Option Explicit
Global gStrConnection As String 'g for Global scope
Sub Connect()
gStrConnection = "User ID=" & strUserName & "; Password=" & strPassword & "; Data Source=" & strDatabase & "; Provider=msdaora")
dbConnect.Open gStrConnection
...
End Sub
Форма:
Private Sub CreateReport()
dbConnect.Open gStrConnection
...
End Sub
Вариант 2:Передайте переменную в локальную переменную формы
Объявите переменную всего модуля в модуле формы (т.е.где вы размещаете другой код формы).Затем предоставьте небольшой подпрограмму установки, которая присваивает значение.
Пример — Модуль1:
Option Explicit
Sub Connect()
Dim strConnection as String
strConnection = "User ID=" & strUserName & "; Password=" & strPassword & "; Data Source=" & strDatabase & "; Provider=msdaora")
dbConnect.Open strConnection
...
ReportGenerator.StoreConnectionString strConnection
ReportGenerator.Show
...
End Sub
Форма:
Private mStrConnection as String 'm for module-wide scope
Public Sub StoreConnectionString(strConnection as String)
mStrConnection = strconnection
End Sub
Private Sub CreateReport()
dbConnect.Open mStrConnection
...
...
End Sub
Другие советы
объявить соединение и записывание в верхней части стандартного модуля, вне любых процедур и установить их доступ к публичном.
Не забывайте очистить ресурсы после того, как вы закончите.