首先让我说这个网站以及VBA都是新手,所以请耐心等待。预先感谢您的帮助。
我有一个VBA函数,它运行Access的现有查询。正在查询的某些表存储在需要用户特定密码访问的Oracle数据库中。现在,我编写的用于自动化报告的子函数调用此函数7次,并且每次调用函数时都要求用户输入他们的Oracle密码(如果他们输入密码错误,它也会停止sub并给出错误消息如果他们需要做7次,我认为这是一个可能的事件。代码有效,但我想找到一种方法让代码一次性输入密码并完成它。我发现的所有解决方案都涉及直接连接和查询Oracle,这需要非常复杂的SQL编码,我无法编写。
我也遇到了一个问题,其中列以不同的顺序显示在excel表中,而不是在Access中为某些查询执行。这似乎是一致的,所以它不是一个大问题,但我想知道如何防止这种情况,以防止任何未来的问题。
以下是我目前使用的功能的代码。任何见解将不胜感激!
Option Explicit
'Single Argument "qryName" as string. Runs access qry and copys recordset to active sheet.
Function AccessQueryPull(qryName As String)
'Declare variables
Dim rs As ADODB.Recordset
Dim cn As ADODB.Connection
'open the connection to the access database
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=filePath.accdb;"
'format the command to run the query
Dim cmd As New ADODB.Command
cmd.CommandType = adCmdStoredProc
cmd.CommandText = qryName
cmd.ActiveConnection = cn
'execute the query
Set rs = New ADODB.Recordset
Set rs = cmd.Execute()
'copy data to excel sheet
ActiveSheet.Cells(2, 1).CopyFromRecordset rs
'Cleanup
rs.Close
Set rs = Nothing
答案 0 :(得分:0)
每次提示您获取Oracle凭据时,每次调用该函数时都会创建一个全新的MS Access连接。
只需在调用函数的Sub中连接一次并将连接对象作为参数传递,即可保持MS Access连接。这样,父例程中捕获了任何连接错误。至于列顺序,只需在SQL语句中按所需顺序声明列。
Sub RunQueries()
Dim rs As ADODB.Recordset
Dim cn As ADODB.Connection
'open the connection to the Access database
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=filePath.accdb;"
Call AccessQueryPull(cn, "SELECT Col1, Col2, Col3 FROM Qry1") ' AND OTHER 6 CALLS
cn.Close
Set cn = Nothing
End Sub
Function AccessQueryPull(accConn As ADODB.Connection, qryName As String)
'format the command to run the query
Dim cmd As New ADODB.Command
cmd.CommandType = adCmdStoredProc
cmd.CommandText = qryName
cmd.ActiveConnection = accConn
'execute the query
Set rs = New ADODB.Recordset
Set rs = cmd.Execute()
'copy data to excel sheet
ActiveSheet.Cells(2, 1).CopyFromRecordset rs
'Cleanup
rs.Close
Set rs = Nothing: Set cmd = Nothing
End Function