我在VBA中第一次使用SQL语句,如何在SQL语句中使用Excel工作表的列号?
下面是我想做的一个例子:
"SELECT * FROM [Sheet1$] WHERE 'ColumnNumber4 =" & mySQLVariable
您看到的唯一错误是“ ColumnNumber4”
我已经尝试过:
"SELECT * FROM [Sheet1$] WHERE [M] =" & mySQLVariable
其中M是我为第4列设置的名称,但不能正常运行:我的.docx要求我选择一个表,但必须使用
选择该表"SELECT * FROM[Sheet1$] WHERE[M] = " & mySQLVariable
NB:SELECT * FROM[Sheet1$]
的工作:
在使用宏之前,docx如下:
,然后看起来像这样(按例外方式工作)
通过推论,我认为WHERE[M] = " & mySQLVariable
是问题
这是我的完整代码:
Sub Publipostage()
'Nécessite d'activer la référence "Microsoft Word xx.x Object Library"
Dim docWord As Word.Document
Dim appWord As Word.Application
Dim NomBase As String
Dim i As Long
Dim rs As Recordset
i = 3
mySQLVariable = "MyString"
NomBase = "M:\User\Folder\FolderItem.xlsm"
Application.ScreenUpdating = False
Set appWord = New Word.Application
appWord.Visible = True
'Ouverture du document principal Word
Set docWord = appWord.Documents.Open("M:\User\Folder\FolderItem.docx")
MsgBox ActiveCell.Column
Set rs = "SELECT * FROM [Interface-Test$]"
Debug.Print rs(3).Name
'fonctionnalité de publipostage pour le document spécifié
With docWord.MailMerge
'Ouvre la base de données
.OpenDataSource Name:=NomBase, _ Connection:="Driver={Microsoft Excel Driver (*.xlsm)};" & _
"DBQ=" & NomBase & "; ReadOnly=True; ", _
SQLStatement:="SELECT * FROM [Interface-Test$] WHERE [F4] = " & mySQLVariable
'Spécifie la fusion vers l'imprimante
.Destination = wdSendToNewDocument
.suppressBlankLines = True
'Prend en compte l'ensemble des enregistrements
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
'Exécute l'opération de publipostage
.Execute Pause:=False
End With
' Activation du doucment principal de Publipostage et fermeture
docWord.Activate
docWord.Close savechanges:=False
' Affichage l'application Word
appWord.Visible = True
Set docWord = Nothing
Set appWord = Nothing
'Fermeture du document Word
'docWord.Close False
'appWord.Quit
End Sub
感谢您的时间和考虑。
答案 0 :(得分:1)
如OP最终所示,Excel的数据范围从A2
开始,列标题在第2行,数据从第3行开始。在Excel ODBC连接中,当指定SheetName$
时,默认情况下假设数据以命名列从A1
开始。
由于此默认设置不适用,因此FROM
子句必须进行相应更改以指定开始和结束单元格。为避免此特定范围要求,请将电子表格调整为不将第1行用于非数据项。
SQLStatement:="SELECT * FROM [Interface-Test$A2:P1000] WHERE [MAIL ADDRESS] = " & mySQLVariable
答案 1 :(得分:0)
您的问题有点含糊,但是...
如果要使用列号,则可以使用[F4]作为标识符。这就是默认设置。
如果要使用列名,则必须确保在连接字符串中设置HDR = YES。
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES";
如果您只想弄清楚第四列的名称是什么...
set rs="SELECT * FROM [Sheet1$]"
Debug.Print rs(3).name
这将为您提供记录集正在使用的名称(字段编号从零开始)。