2

Очень новый для любой формы кода. Попытка запустить скрипт в VBA, который будет извлекать данные из базы данных доступа с использованием SQL и помещать их в электронную таблицу Excel. Код похож на ниже. Работает чисто, но я не знаю, как использовать данные, которые он извлекает. Заранее спасибо.

Sub Get_Data()
Dim cn As Object
Dim rs As Object
Dim strFile As String
Dim strCon As String
Dim strSQL, strInput As String

strFile = "S:\Location.Database.accdb"

strCon = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & strFile

Set cn = CreateObject("ADODB.Connection")
cn.Open strCon

strInput = InputBox("Input Desired Name")

strSQL = "SELECT NAME, Location WHERE NAME =""'strInput'"";"

cn.Execute strSQL

cn.Close
Set cn = Nothing

End Sub

1 ответ1

7

Вам нужно заполнить свой объект набора записей (это объявленная вами переменная rs). Я изменил код ниже, чтобы сделать именно это. Затем вы можете скопировать результаты из набора записей непосредственно в диапазон с помощью RANGE.copyfromrecordset <yourrecordset> ниже. Я также добавил это, где я выгружаю результаты в SHeet1.Range ("A1"). Возможно, вы захотите изменить это. ИЗМЕНЕНО ДЛЯ ДОБАВЛЕНИЯ: Просто понял, что вы используете позднюю привязку для ADODB. Я изменил код, чтобы он действительно работал.

Sub Get_Data()
Dim cn As Object
Dim rs As Object
Dim strFile As String
Dim strCon As String
Dim strSQL, strInput As String

strFile = "S:\Location.Database.accdb"

strCon = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & strFile

Set cn = CreateObject("ADODB.Connection")
cn.Open strCon

strInput = InputBox("Input Desired Name")

strSQL = "SELECT NAME, Location WHERE NAME =""'strInput'"";"

'Added the following four lines
Set rs = CreateObject("ADODB.RECORDSET")    
rs.activeconnection = cn    
rs.open strSQL    
Sheet1.Range("A1").CopyFromRecordSet rs

'removed
'cn.Execute strSQL


rs.close
cn.Close
Set cn = Nothing

End Sub

Вы можете думать о RecordSet (в данном случае rs) как о виртуальной таблице, содержащей результаты SQL. Вы можете взаимодействовать с RecordSet в записи по записи (с помощью rs.MoveFirst, MoveNext, MoveLast) и поле за полем (путем перебора коллекции rs.fields), или вы можете просто сбросить результаты в диапазоне.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .