Cómo pasar los parámetros de conexión entre los módulos en Excel Macro
Pregunta
Estoy creando 2 informes en una hoja usando Excel Macro. Los informes se conectan a Oracle DB para sacar los datos. Tengo la cadena de conexión que tire de los datos y funciona bien. Lo que estoy tratando de hacer es mover la cadena de conexión a una función y pasarla al informe correspondiente según la entrada del usuario. Aquí hay un flujo de alto nivel: 1. El usuario hace clic en un botón de menú. En el fondo, intenta conectarse a DB. 2. Si la conexión es exitosa, abre un formulario con 2 botones (que informan que el usuario quiere ejecutar). Botón A y Botón B 3. Supongamos que el botón de clics de usuario se debe ejecutar y mostrar el informe.
El problema que estoy enfrentando está en el paso 2. Por alguna razón, no puedo pasar los parámetros de conexión a la función de botón.
A continuación se muestra el fragmento del código sobre cómo estoy tratando de conectarme con el DB. Necesita ayuda sobre cómo pasar los parámetros de conexión al botón una función.
Código para conectar a 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
en el formulario del generador de informes que pasan los parámetros de fecha a la función
Private Sub Login_Click()
Call ReportGenerator(FromDate.Value, ToDate.Value)
End Sub
Necesito pasar los parámetros de conexión a la función CallReportGenerator.
cualquier puntero será útil.
Solución
Hay múltiples fue que puede hacer esto:
Opción 1: Use una variable global
Si declara una variable como Global
en la parte superior de un módulo, es decir, antes de cualquier subs / funciones, puede acceder a ellos desde cualquier otro módulo:
Ejemplo - Module1:
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
Opción 2: Pase la variable a una variable de forma local
Declare una variable de módulo amplia en el módulo del formulario (es decir, donde coloque el otro código del formulario).Luego, proporcione un pequeño submerador que asigne el valor.
Ejemplo - Module1:
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
Otros consejos
Declarar la conexión y el conjunto de registros en la parte superior del módulo estándar, fuera de cualquier procedimiento y configure a sus accesores al público.
Recuerde limpiar los recursos después de haber terminado.