如何在excel宏中的模块之间传递连接参数

时间:2014-02-27 21:33:38

标签: excel vba excel-vba

我使用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函数。

任何指针都会有所帮助。

2 个答案:

答案 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)

在任何程序之外声明标准模块顶部的连接和记录集,并将其访问者设置为公共。

请记住在完成后清理资源。