有没有一种简单的方法可以在“ WHERE” SQL语句中使用列号

时间:2019-05-20 09:09:58

标签: sql excel vba

我在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$]的工作:

excel文件如下:Excel file

在使用宏之前,docx如下:

Before Macro

,然后看起来像这样(按例外方式工作)

After Macro

通过推论,我认为WHERE[M] = " & mySQLVariable是问题

事实上,有了WHERE,我得到了: With WHERE Statment

这是我的完整代码:

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

感谢您的时间和考虑。

2 个答案:

答案 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

这将为您提供记录集正在使用的名称(字段编号从零开始)。