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;
我在 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;