如何在Excel宏中通过模块之间的连接参数
题
我正在使用Excel宏在一张纸上创建2个报告。报告连接到Oracle DB以提取数据。我有一个连接字符串,可以拉动数据,它工作正常。我正在尝试做的是将连接字符串移动到一个函数,并根据用户输入将其传递给各个报告。这是一个高水平的流量: 1.用户点击菜单按钮。在后台,它试图连接到DB。 2.如果连接成功,它会打开一个带有2个按钮的表单(向用户报告用户运行)。按钮a和按钮b 3.假设用户单击按钮应执行并显示报告。
我面临的问题在步骤2中。出于某种原因,我无法将连接参数传递给按钮函数。
下面是关于我如何尝试连接到DB的代码的片段。需要帮助如何将连接参数传递到按钮函数。用于连接到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:将变量传递给本地表单变量
在表单的模块中声明一个模块宽变量(即您放置表单的其他代码的位置)。然后提供一个分配值的小型Setter Sub。
示例 - 模块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
. 其他提示
声明标准模块顶部的连接和记录集,在任何过程之外并将其存取器设置为公共。
记得在完成后清理资源。
不隶属于 StackOverflow