从excel运行访问查询并将参数传递给查询

时间:2011-02-25 21:00:26

标签: excel ms-access vba access-vba

如何在Excel VBA代码或宏的ms访问数据库中执行查询。 MS-Access查询接受一些需要从Excel传递的参数。 感谢

2 个答案:

答案 0 :(得分:4)

这是一种可能性:

Dim cn As Object
Dim strFile As String
Dim strCon As String
Dim strSQL As String

strFile = "C:\docs\Test.mdb"

strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile

''Late binding, so no reference is needed
Set cn = CreateObject("ADODB.Connection")

cn.Open strCon

strSQL = "INSERT INTO ATable (AField) " _
& "VALUES (" & Sheet1.[A1] & ")"

cn.Execute strSQL

cn.Close
Set cn = Nothing

您还可以在SQL中内联参考Excel中的数据集。

编辑重新评论

使用命令:

strSQL = "SELECT * FROM ATable " _
& "WHERE AField = @AField"

With cmd
    Set .ActiveConnection = cn
    .CommandText = strSQL
    .CommandType = 1 'adCmdText

    ''ADO Datatypes are often very particular
    ''adSmallInt = 2 ; adParamInput = 1
    .Parameters.Append .CreateParameter("@AField", 2, 1, , Sheet1.[A1])

End With
Set rs = cmd.Execute 

另请参阅:http://support.microsoft.com/kb/181782

答案 1 :(得分:1)

这使用ADODB。

Set m_Connection = New Connection

If Application.Version = "12.0" Then
    m_Connection.Provider = "Microsoft.ACE.OLEDB.12.0"
Else
    m_Connection.Provider = "Microsoft.Jet.OLEDB.4.0"
End If

m_Connection.Open <full path to Access DB>
If m_Connection.State > 0 Then

    Dim rsSource As New Recordset
    rsSource.Open strQuery, m_Connection, adOpenForwardOnly, adLockReadOnly

    Dim result As Long
    Dim rngTarget As Range
    rngTarget = ThisWorkbook.Worksheets(m_SheetName).Range("A1")

    If Not rsSource.BOF Then
        result = rngTarget.CopyFromRecordset(rsSource)
    End If

    If rsSource.State Then rsSource.Close
    Set rsSource = Nothing

End If

因此它运行查询并将其放在您喜欢的位置。 strQuery是db或SQL字符串中查询的名称。