SQL 在 Excel 点赞 vba

SQL LIKE in Excel vba

我在 VBA 中使用 SQL 还很陌生,我的查询似乎无法正常工作。我在论坛上四处搜索并尝试了很多不同的解决方案,但无济于事。

这是我的代码:

Sub RequeteClasseurFerme_Excel2007()
Dim Cn As ADODB.Connection
Dim Fichier As String
Dim NomFeuille As String, texte_SQL As String
Dim Rst As ADODB.Recordset
Dim CoPo As String

'Définit le classeur fermé servant de base de données
Fichier = ThisWorkbook.Worksheets("Menu").Range("B7").Value
'Nom de la feuille dans le classeur fermé
NomFeuille = "Data"
CoPo = ActiveWorkbook.Worksheets("Menu").Range("B3").Value

Set Cn = New ADODB.Connection

'--- Connexion ---
With Cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
        & Fichier & ";Extended Properties=""Excel 12.0;HDR=NO;"""
    .Open
End With
'-----------------

'Request
request_SQL = "SELECT * FROM [" & NomFeuille & "$] WHERE [" & NomFeuille & "$].[CodePostal] LIKE '" & CoPo & "%'"

Set Rst = New ADODB.Recordset
Set Rst = Cn.Execute(request_SQL)

Worksheets("Data2").Range("A1").CopyFromRecordset Rst
'
'... la requête ...
'

'rst.Find
'--- Fermeture connexion ---
Cn.Close
Set Cn = Nothing

我很确定它是这样的,因为当我删除它时,它确实 return 我所有的结果。

您应该始终使用参数:

Sub RequeteClasseurFerme_Excel2007()

Dim Cn As ADODB.Connection
Dim Fichier As String
Dim NomFeuille As String, texte_SQL As String
Dim cmd As ADODB.Command
Dim Rst As ADODB.Recordset
Dim CoPo As String

'Définit le classeur fermé servant de base de données
Fichier = ThisWorkbook.Worksheets("Menu").Range("B7").Value

'Nom de la feuille dans le classeur fermé
NomFeuille = "Data"
CoPo = ActiveWorkbook.Worksheets("Menu").Range("B3").Value

Set Cn = New ADODB.Connection

'--- Connexion ---
With Cn
    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
        & Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
    .Open
End With
'-----------------

'Request
request_SQL = "SELECT * FROM [" & NomFeuille & "$] WHERE [" & NomFeuille & "$].[CodePostal] LIKE ?"


Set cmd = New ADODB.Command
cmd.ActiveConnection = Cn
cmd.CommandText = request_SQL
cmd.Parameters.Append cmd.CreateParameter("@postalCode", adVarChar, adParamInput, 50)

cmd.Parameters("@postalCode").Value = CoPo + "%"

Set Rst = cmd.Execute

Worksheets("Data2").Range("A1").CopyFromRecordset Rst
'
'... la requête ...
'

'rst.Find
'--- Fermeture connexion ---
Cn.Close
Set Cn = Nothing
End Sub

当您在连接字符串中指定 HDR=NO; 时,您告诉 driver Excel sheet 不包含 Header 行。在这种情况下,您不能通过名称访问列(仅仅是因为它们没有名称)。在那种情况下,RecordSet 包含像 F1, F2... 这样的伪字段名,您甚至可以在查询中使用它们,例如 where [F1] = 'A'"。但是当然像 CodePostal 这样的列是未知的,访问它会抛出你在评论中提到的错误。

不过,我假设您的数据有 header 行,在这种情况下,只需将参数更改为 HDR=YES;