Есть ли простой способ использовать номер столбца в операторе SQL "ГДЕ" - PullRequest
0 голосов
/ 20 мая 2019

Я впервые использую оператор SQL в VBA. Как я могу использовать номер столбца моего листа Excel в операторе SQL?

Ниже приведен пример того, что я хочу сделать:

"SELECT * FROM [Sheet1$] WHERE 'ColumnNumber4 =" & mySQLVariable

Как видите, единственное, что неправильно, это 'ColumnNumber4'

Я уже пробовал это:

"SELECT * FROM [Sheet1$] WHERE  [M] =" & mySQLVariable

Где M - это имя, которое я задал для столбца № 4, но это не работает так, как указано: мой .docx просит меня выбрать таблицу, но таблица ДОЛЖНА быть выбрана с помощью

"SELECT * FROM[Sheet1$] WHERE[M] = " & mySQLVariable

Примечание: SELECT * FROM[Sheet1$] работа:

Файл Excel выглядит следующим образом: Excel file

Перед использованием макроса docx выглядит так:

Before Macro

и после этого выглядит так (работает как исключение)

After Macro

С помощью дедукции я думаю, что WHERE[M] = " & mySQLVariable является проблемой

На самом деле с ГДЕ я получил: 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 ]

1 голос
/ 20 мая 2019

В заключение, как показывает OP, диапазон данных Excel начинается с A2 с заголовков столбцов в строке 2 и данных, начинающихся в строке 3. В соединениях ODBC Excel при указании SheetName$ по умолчанию предполагается, что данные начинаются с A1 с именованными столбцами.

Поскольку это значение по умолчанию не применяется, предложение FROM должно измениться соответственно, чтобы указать начальную и конечную ячейку. Чтобы избежать этого конкретного требования к диапазону, настройте электронную таблицу так, чтобы строка 1 не использовалась для элементов без данных.

SQLStatement:="SELECT * FROM [Interface-Test$A2:P1000] WHERE [MAIL ADDRESS] = " & mySQLVariable
0 голосов
/ 20 мая 2019

Ваш вопрос немного двусмысленный, но ...

Если вы хотите использовать номер столбца, вы можете использовать [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

Что даст вам имя, которое использует набор записей (номера полей начинаются с нуля).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...