Excel VBA 从 MS Access 2003 执行存储的 UNION 查询
Excel VBA to Execute Stored UNION Query from MS Access 2003
我正在 Excel VBA 中编写一个函数来对使用 MS Access 2003 创建的数据库执行存储的查询。当存储的查询是一个简单的查询时,该代码有效,但不是如果查询是 UNION
。例如,我使用以下代码来执行存储的查询:
Public Function QueryDB()
Dim cn As Object
Dim strConnection As String
Set cn = CreateObject("ADODB.Connection")
' Hard code database location and name
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\server1\myDatabase.mdb"
' Open the db connection
cn.Open strConnection
' Create call to stored procedure on access DB
Dim cmd As Object
Set cmd = CreateObject("ADODB.Command")
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "testQuery"
cmd.ActiveConnection = cn
' Execute stored query
Dim rs As ADODB.Recordset
Set rs = cmd.Execute()
MsgBox rs.Fields(0) ' prints as expected
QueryDB2 = rs.Fields(0)
' close connections
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Function
如果 testQuery
是一个简单的查询(例如,不使用 UNION
),则按预期返回数据。但是,如果 testQuery
包含 UNION
,则 Excel VBA 代码会失败(并且不会返回任何特定错误)。我该如何解决这个问题?我想避免在 VBA.
中编写 SQL 语句
考虑使用 ADO 的 Open Recordset method. Usually, Execute 用于操作命令(append/update/delete、存储过程等)。此外,如果执行 returns 一个记录集,它只是一个只进(即没有游标的快照)、只读记录集,没有 MoveNext
、RecordCount
、[=13 的功能=].
Dim cn As Object
Dim rst As Object
Dim strConnection As String
Set cn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
' Hard code database location and name
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\server1\myDatabase.mdb"
' Open the db connection
cn.Open strConnection
' Open the recordset
rst.Open "testQuery", cn
Sheets(1).Range("A2").CopyFromRecordset rst
' Close recordset and db connection
rst.Close
cn.Close
你还在为这个烦恼吗?尝试使用 ODBC 查询。按照此处列出的步骤进行操作。
确保您的 Union 中没有空值,如果有,您必须使用 NZ 函数将空值转换为零。
我正在 Excel VBA 中编写一个函数来对使用 MS Access 2003 创建的数据库执行存储的查询。当存储的查询是一个简单的查询时,该代码有效,但不是如果查询是 UNION
。例如,我使用以下代码来执行存储的查询:
Public Function QueryDB()
Dim cn As Object
Dim strConnection As String
Set cn = CreateObject("ADODB.Connection")
' Hard code database location and name
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\server1\myDatabase.mdb"
' Open the db connection
cn.Open strConnection
' Create call to stored procedure on access DB
Dim cmd As Object
Set cmd = CreateObject("ADODB.Command")
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "testQuery"
cmd.ActiveConnection = cn
' Execute stored query
Dim rs As ADODB.Recordset
Set rs = cmd.Execute()
MsgBox rs.Fields(0) ' prints as expected
QueryDB2 = rs.Fields(0)
' close connections
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Function
如果 testQuery
是一个简单的查询(例如,不使用 UNION
),则按预期返回数据。但是,如果 testQuery
包含 UNION
,则 Excel VBA 代码会失败(并且不会返回任何特定错误)。我该如何解决这个问题?我想避免在 VBA.
考虑使用 ADO 的 Open Recordset method. Usually, Execute 用于操作命令(append/update/delete、存储过程等)。此外,如果执行 returns 一个记录集,它只是一个只进(即没有游标的快照)、只读记录集,没有 MoveNext
、RecordCount
、[=13 的功能=].
Dim cn As Object
Dim rst As Object
Dim strConnection As String
Set cn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
' Hard code database location and name
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\server1\myDatabase.mdb"
' Open the db connection
cn.Open strConnection
' Open the recordset
rst.Open "testQuery", cn
Sheets(1).Range("A2").CopyFromRecordset rst
' Close recordset and db connection
rst.Close
cn.Close
你还在为这个烦恼吗?尝试使用 ODBC 查询。按照此处列出的步骤进行操作。
确保您的 Union 中没有空值,如果有,您必须使用 NZ 函数将空值转换为零。