Соединение VBA SQL с Excel из Word не возвращает записей
У меня возникают приступы, когда я пытаюсь понять, как читать записи из электронной таблицы 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 ответ
Следующее работает для меня. Ключ к получению информации набора записей в источнике тестовых данных, который я использовал, включал IMEX=1
в строке подключения, чтобы указать, что источник данных имеет заголовки.
Код в вопросе имеет дополнительные проблемы:
- Необходимо использовать
rs.MoveFirst
"инициализировать" набор записей (получить его до первой записи. - Необходимо использовать
rs.MoveNext
в каждой итерации цикла, в противном случае код будет "зависать" в первой записи и попадать в бесконечный цикл. - Безопаснее использовать
Do While Not rs.EOF
для теста на выход из цикла, если в наборе записей действительно нет записей. - Необходимо указать поля из набора записей. Полное имя, город, улица и т. Д. Не имеют смысла, по крайней мере, в коде в вопросе.
- Всегда освобождать объекты
Nothing
в обратном порядке они были созданы. Невозможно разорвать соединение до освобождения набора записей - активный набор записей будет поддерживать соединение "живым".
Мой пример кода:
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