Соединение VBA SQL с Excel из Word не возвращает записей - PullRequest
0 голосов
/ 22 декабря 2018

У меня припадки, когда я пытаюсь понять, как читать записи из электронной таблицы Excel в документ Word.Я использую Office 365. Я нашел несколько статей, которые связали меня с книгой и листом, но записи не возвращаются.Я ссылался на библиотеку объектов данных ActiveX 2.8. Когда код попадает в окно сообщения, он возвращает -1

Справка?Что мне не хватает?

Вот что у меня есть для кода на данный момент.

Sub CreateLetter()

Dim rs As ADODB.Recordset, rsCount As ADODB.Recordset
Dim cn As ADODB.Connection
Dim sqlGetTbl As String
Dim sDataSource As String, sDataTable As String
Dim sProvider As String

Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
sDataSource = "D:\spreadsheetname.xlsx"
sDataTable = "[Donor Contact List$]"

sProvider = "Microsoft.ACE.OLEDB.16.0;"
sDataSource = sDataSource & ";Extended Properties = 'Excel 12.0 Xml;HDR=Yes';"

With cn
    .Provider = sProvider
    .ConnectionString = "Data Source=" & sDataSource
    .Open
End  With

sqlGetTbl = "SELECT * FROM " & sDataTable
Set rs = cn.Execute(sqlGetTbl)
MsgBox rs.RecordCount

Do
    With Selection
        .TypeText FullName & Chr(11) & Street & Chr(11) & City & ", " & St & "  " & Zip
        .TypeParagraph
    End With
Loop Until rs.EOF

rs.Close
cn.Close
Set cn = Nothing
Set rs = Nothing

End Sub

1 Ответ

0 голосов
/ 23 декабря 2018

У меня работает следующее.Ключ к получению информации о наборе записей в источнике тестовых данных, который я использовал, включал IMEX=1 в строку подключения, чтобы указать, что источник данных имеет заголовки.

Код в вопросе имеет дополнительные проблемы:

  1. Необходимо использовать rs.MoveFirst для «инициализации» набора записей (получить его для первой записи.
  2. Необходимо использовать rs.MoveNext в каждой итерации цикла, в противном случаекод «застрянет» в первой записи и перейдет в бесконечный цикл.
  3. Безопаснее использовать Do While Not rs.EOF для теста на выход из цикла, если в наборе записей действительно нет записей.
  4. Необходимо указать поля из набора записей. Полное имя, город, улица и т. Д. Не имеют смысла, по крайней мере, в коде вопроса.
  5. Всегда освобождать объекты(установите Nothing) в обратном порядке, в котором они были созданы. Невозможно разорвать соединение до выпуска набора записей - активный набор записей сохранитnnection "live".

Мой пример кода:

Sub CreateLetter()

    Dim rs As ADODB.Recordset, rsCount As ADODB.Recordset
    Dim cn As ADODB.Connection
    Dim sqlGetTbl As String
    Dim sDataSource As String, sDataTable As String
    Dim sProvider As String

    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    sDataSource = "D:\spreadsheetname.xlsx"
    sDataTable = "[Donor Contact List$]"

    sProvider = "Microsoft.ACE.OLEDB.16.0;"
    sDataSource = sDataSource & ";Extended Properties = 'Excel 12.0 Xml;HDR=Yes;IMEX=1';"

    With cn
        .Provider = sProvider
        .ConnectionString = "Data Source=" & sDataSource
        .Open
    End With

    sqlGetTbl = "SELECT * FROM " & sDataTable
    cn.CursorLocation = adUseClient
    Set rs = cn.Execute(sqlGetTbl)
    MsgBox rs.RecordCount
    rs.MoveFirst

    Do While Not rs.EOF
        With Selection
            .TypeText rs.Fields("Fullname").value & Chr(11) & rs.Fields("street").value & Chr(11) & rs.Fields("city").value & ", " & st & "  " & rs.Fields("Zip").Value
            .TypeParagraph
        End With
        rs.MoveNext
    Loop

    rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing
End Sub
...