Como passar parâmetros de conexão entre módulos na macro do Excel
Pergunta
Estou criando 2 relatórios em uma planilha usando macro do Excel.Os relatórios se conectam ao banco de dados Oracle para extrair os dados.Eu tenho a string de conexão que extrai os dados e funciona bem.O que estou tentando fazer é mover a string de conexão para uma função e passá-la para o respectivo relatório com base na entrada do usuário.Aqui está um fluxo de alto nível:1.O usuário clica em um botão de menu.Em segundo plano, ele tenta se conectar ao banco de dados.2.Se a conexão for bem-sucedida ele abre um formulário com 2 botões (que reporta o usuário deseja executar).Botão A e Botão B 3.Suponha que o usuário clique no botão A, o relatório deve ser executado e exibido.
O problema que estou enfrentando está na etapa 2.Por algum motivo não consigo passar os parâmetros de conexão para a função do Botão A.
Abaixo está o trecho do código de como estou tentando me conectar ao dB.preciso de ajuda sobre como passar parâmetros de conexão para a função do botão A.
Código para conectar ao banco de dados
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
No formulário gerador de relatórios passando os parâmetros de data para a função
Private Sub Login_Click()
Call ReportGenerator(FromDate.Value, ToDate.Value)
End Sub
Preciso passar os parâmetros de conexão para a função CallReportGenerator.
Qualquer indicação será útil.
Solução
Existem vários onde você pode fazer isso:
Opção 1:Use uma variável global
Se você declarar uma variável como Global
no topo de um módulo, ou seja,antes de qualquer subs/função, você pode acessá-las de qualquer outro módulo:
Exemplo - Módulo1:
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
Forma:
Private Sub CreateReport()
dbConnect.Open gStrConnection
...
End Sub
Opção 2:Passe a variável para uma variável de formulário local
Declare uma variável que abrange todo o módulo no módulo do Form (ou seja,onde você coloca o outro código do formulário).Em seguida, forneça um pequeno sub setter que atribua o valor.
Exemplo - Módulo1:
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
Forma:
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
Outras dicas
Declare a conexão e o conjunto de registros na parte superior do módulo padrão, fora de qualquer procedimento e defina seus acessadores como públicos.
Lembre-se de limpar os recursos depois de terminar.