Как передать параметры соединения между модулями в макросе Excel

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

  •  24-12-2019
  •  | 
  •  

Вопрос

Я создаю 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

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

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

Не забывайте очистить ресурсы после того, как вы закончите.

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