SQL 查询在 Excel 中不起作用,但在 Access 中起作用

jmw*_*ree 3 sql excel ms-access vba

对于下面列出的代码,除了第一个 SQL 查询之外,它运行良好。我从工作簿中提取地址和状态信息,并对这些信息运行查询以查找该地址在表中出现的次数。如果我运行代码并在查询发送到 Access 之前停止它,我可以从“立即”窗口中提取查询命令,转到 Access,然后运行查询,没有问题。但是,如果我只是运行 VBA 程序并让它将查询发送到 Access,则结果始终为 0。长话短说,查询将在 Access 中运行并提供正确的结果,但是当 Excel VBA 将查询发送到 Access 时,结果始终为零(并且没有错误消息)。任何帮助将不胜感激。

Dim DatabaseFileName As String, connectionstring As String   

connectionstring = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & DatabaseFileName & "; Persist Security Info=False;"

Dim conn As New ADODB.Connection
conn.Open connectionstring

Dim rs As New ADODB.Recordset, SQL As String
Dim ExecSQL As New ADODB.Command

With ThisWorkbook.Sheets(1)
    For I = 2 To 1235
        SQL = ""
        If .Cells(I, 7) <> "" Then
            SQL = "SELECT Count(VRSC_CUSTOMER_SITES.SITE_ID)  AS GCOUNT into [GVRCount1] "
            SQL = SQL & "FROM (VRSC_CUSTOMER_SITES) "
            SQL = SQL & "WHERE ((VRSC_CUSTOMER_SITES.SITE_STREET Like " & Chr(34) & .Cells(I, 7) & Chr(34) & ") AND ((VRSC_CUSTOMER_SITES.SITE_ST)="
            SQL = SQL & Chr(34) & .Cells(I, 5) & Chr(34) & ") AND ((VRSC_CUSTOMER_SITES.SITE_PHONE) Not Like ""999*""));"
            
            rs.Open SQL, conn
            
            SQL = "SELECT * FROM [GVRCount1]"
            rs.Open SQL
            
            .Cells(I, 8).CopyFromRecordset rs
            
        End If
    Next
End With
With ThisWorkbook.Sheets(2)

    .Range("A1").CopyFromRecordset rs
    
End With

conn.Close
End Sub
Run Code Online (Sandbox Code Playgroud)

Par*_*ait 8

本质上,问题是由LIKE运营商造成的。每当您通过 ODBC/OLEDB 连接运行 Access 查询时,要使用的通配符是当前 ANSI 版本%。但是,在 Access GUI 中,通配符使用旧版本*. 请参阅讨论此通配符用​​法的MSDN 文档

为了在 Excel 和 Access(VBA 或 GUI)之间兼容,请考虑ALIKE仅使用未记录的运算符%。此外,使用 ADO 命令使用 ADO 参数化,并避免将值连接到 SQL 语句。下面将第一个替换LIKE=,因为没有使用通配符,并且使用的 make-table 操作INTO已被删除。此外,New从任何行中删除Dim

Dim DatabaseFileName As String, connectionstring As String, SQL As String
Dim conn As ADODB.Connection, rs As ADODB.Recordset, ExecSQL As ADODB.Command
Dim I As Long

connectionstring = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" _
                    & DatabaseFileName & "; Persist Security Info=False;"

Set conn = New ADODB.Connection
conn.Open connectionstring

' PREPARED STATEMENT WITH ? PLACEHOLDERS
SQL = "SELECT COUNT(v.SITE_ID) AS GCOUNT " _
    & "FROM VRSC_CUSTOMER_SITES v " _
    & "WHERE v.SITE_STREET = ? " _
    & "  AND v.SITE_ST = ? " _
    & "  AND v.SITE_PHONE NOT ALIKE '999%';" _

For I = 2 To 1235
    If ThisWorkbook.Sheets(1).Cells(I, 7) <> "" Then
        Set ExecSQL = New ADODB.Command
        With ExecSQL
            .ActiveConnection = conn
            .CommandText = SQL
            .CommandType = adCmdText

            '  BIND PARAMETERS
            .Parameters.Append .CreateParameter("street_param", adVarchar, adParamInput, 255, ThisWorkbook.Sheets(1).Cells(I, 7))
            .Parameters.Append .CreateParameter("st_param", adVarchar, adParamInput, 255, ThisWorkbook.Sheets(1).Cells(I, 5))

            '  EXECUTE QUERY AND BIND INTO RECORDSET
            Set rs = .Execute
        End With
            
        ThisWorkbook.Sheets(1).Cells(I, 8).CopyFromRecordset rs
    End If
Next I

With ThisWorkbook.Sheets(2)
    .Range("A1").CopyFromRecordset rs
End With
Run Code Online (Sandbox Code Playgroud)