我使用excel宏在一张纸上创建了2个报告。报告连接到Oracle DB以提取数据。我有连接字符串来拉取数据,它工作正常。我想要做的是将连接字符串移动到一个函数,并根据用户输入将其传递给相应的报表。这是一个高级别的流程: 1.用户点击菜单按钮。在后台它尝试连接到DB。 2.如果连接成功,它将打开一个带有2个按钮的表单(报告用户想要运行)。按钮A和按钮B. 3.假设用户单击按钮A,应执行并显示报告。
我面临的问题是步骤2.出于某种原因,我无法将连接参数传递给按钮A功能。
以下是关于我如何尝试连接到dB的代码片段。需要有关如何将连接参数传递给Button A函数的帮助。
连接数据库的代码
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
在Report generator表单中将日期参数传递给函数
Private Sub Login_Click()
Call ReportGenerator(FromDate.Value, ToDate.Value)
End Sub
我需要将连接参数传递给CallReportGenerator函数。
任何指针都会有所帮助。
答案 0 :(得分:1)
你可以做多个:
选项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:将变量传递给本地表单变量
在Form的模块中声明一个模块范围的变量(即放置表单的其他代码的位置)。然后提供一个小的setter子,用于指定值。
示例 - 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
答案 1 :(得分:0)
在任何程序之外声明标准模块顶部的连接和记录集,并将其访问者设置为公共。
请记住在完成后清理资源。