So übergeben Sie Verbindungsparameter zwischen Modulen in einem Excel-Makro
Frage
Ich erstelle zwei Berichte in einem Blatt mit einem Excel-Makro.Die Berichte stellen eine Verbindung zu Oracle DB her, um die Daten abzurufen.Ich habe die Verbindungszeichenfolge, die die Daten abruft, und sie funktioniert einwandfrei.Ich versuche, die Verbindungszeichenfolge in eine Funktion zu verschieben und sie basierend auf Benutzereingaben an den entsprechenden Bericht zu übergeben.Hier ist ein High-Level-Flow:1.Der Benutzer klickt auf eine Menüschaltfläche.Im Hintergrund wird versucht, eine Verbindung zur DB herzustellen.2.Wenn die Verbindung erfolgreich ist, wird ein Formular mit zwei Schaltflächen geöffnet (welche Berichte der Benutzer ausführen möchte).Taste A und Taste B 3.Angenommen, der Benutzer klickt auf die Schaltfläche A, dann soll der Bericht ausgeführt und angezeigt werden.
Das Problem, mit dem ich konfrontiert bin, ist in Schritt 2.Aus irgendeinem Grund kann ich die Verbindungsparameter nicht an die Funktion „Button A“ übergeben.
Unten ist der Ausschnitt des Codes, der zeigt, wie ich versuche, eine Verbindung zum dB herzustellen.Ich benötige Hilfe bei der Übergabe von Verbindungsparametern an die Funktion „Button A“.
Code für die Verbindung zur 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
Im Berichtsgeneratorformular werden die Datumsparameter an die Funktion übergeben
Private Sub Login_Click()
Call ReportGenerator(FromDate.Value, ToDate.Value)
End Sub
Ich muss die Verbindungsparameter an die CallReportGenerator-Funktion übergeben.
Alle Hinweise werden hilfreich sein.
Lösung
Es gibt mehrere Möglichkeiten, wie Sie dies tun können:
Option 1:Verwenden Sie eine globale Variable
Wenn Sie eine Variable als deklarieren Global
auf der Oberseite eines Moduls, d.h.vor allen Unter-/Funktionen können Sie von jedem anderen Modul aus darauf zugreifen:
Beispiel – Modul1:
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
Bilden:
Private Sub CreateReport()
dbConnect.Open gStrConnection
...
End Sub
Option 2:Übergeben Sie die Variable an eine lokale Formularvariable
Deklarieren Sie eine modulweite Variable im Modul des Formulars (d. h.wo Sie den anderen Code des Formulars platzieren).Stellen Sie dann einen kleinen Setter-Sub bereit, der den Wert zuweist.
Beispiel – Modul1:
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
Bilden:
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
Andere Tipps
Deklarieren Sie die Verbindung und das Recordset an der Oberseite des Standardmoduls außerhalb aller Prozeduren und stellen Sie ihre Accessors in die Öffentlichkeit ein.
Denken Sie daran, Ressourcen zu bereinigen, nachdem Sie fertig sind.