Excelマクロのモジュール間の接続パラメータを渡す方法
質問
Excelマクロを使用して1枚のレポートを作成しています。レポートは、データをプルするためにOracle DBに接続します。私はデータを引っ張る接続文字列を持っています、そしてそれはうまく機能します。接続しようとしているのは、接続文字列を関数に移動し、ユーザー入力に基づいてそれぞれのレポートに渡します。これがハイレベルのフローです。 1.ユーザーがメニューボタンをクリックします。バックグラウンドではDBに接続しようとします。 2.接続が成功した場合は、2つのボタン(ユーザーが実行したい)のフォームを開きます。ボタンAとボタンB 3.ボタンをクリックすると、レポートを実行して表示するとします。
私が直面している問題はステップ2にあります。何らかの理由で、私は接続パラメータを関数のボタンに渡すことができません。
下記は、DBに接続しようとしている方法に関するコードのスニペットです。接続パラメータをボタン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
.
レポートジェネレータのフォームには、日付パラメータを関数に渡す
Private Sub Login_Click()
Call ReportGenerator(FromDate.Value, ToDate.Value)
End Sub
.
CallReportGenerator関数に接続パラメータを渡す必要があります。
任意のポインターは役立ちます。
解決
これを行うことができる複数のものがありました:
オプション1:グローバル変数を使用する
モジュールの上部にあるGlobal
として変数を宣言した場合、副/関数の前に、他のモジュールからアクセスできます。
例 - 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
.
フォーム:
Private Sub CreateReport()
dbConnect.Open gStrConnection
...
End Sub
.
オプション2:変数をローカルフォーム変数に渡す
フォームのモジュールでモジュール全体の変数を宣言します(すなわち、フォームの他のコードを配置する場所)。その後、値を割り当てる小さな設定副字を入力します。
例 - 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
.
フォーム:
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
. 他のヒント
標準モジュールの上部にある接続とレコードセットを宣言し、手順の外部で、アクセサをパブリックに設定します。
終了後にリソースをクリーンアップすることを忘れないでください。