2010-03-20 4 views
3

Я работаю над приложением Excel, которое запрашивает базу данных SQL. Запросы могут занять много времени (20-40 минут). Если у меня есть что-то пропущенное, это может занять много времени до ошибки или достичь точки останова. Я могу сохранить результаты на листе в порядке, это когда я работаю с наборами записей, которые могут взорваться.VBA - Создать ADODB.Recordset из содержимого электронной таблицы

Есть ли способ загрузить данные в ADODB.Recordset, когда я отлаживаю, чтобы пропустить запрос к базе данных (после первого раза)?

Я бы использовал что-то вроде этого?

Query Excel worksheet in MS-Access VBA (using ADODB recordset)

+0

Это выглядит хорошо для меня, обратите внимание на строку подключения, если вы используете версию, большую, чем 2003. – Fionnuala

+0

Спасибо за комментарий. Однако надеялся на smidgen кода или ссылку на более явный пример. Возможно, мой вопрос действительно вызвал ответ «да/нет». Моя вина. :) – robault

ответ

6

я должен был установить MDAC, чтобы получить msado15.dll и один раз у меня было, я добавил ссылку на него из (на Win7 64bit):

C: \ Program Files (x86) \ Common Files \ System \ ado \ msado15.dll

Затем я создал функцию для возврата объекта ADODB.Recordset, передав имя листа, существующее в текущей активной книге. Вот код для любых других, если они нуждаются в этом, в том числе Test() Sub, чтобы увидеть, если он работает:

Public Function RecordSetFromSheet(sheetName As String) 

Dim rst As New ADODB.Recordset 
Dim cnx As New ADODB.Connection 
Dim cmd As New ADODB.Command 

    'setup the connection 
    '[HDR=Yes] means the Field names are in the first row 
    With cnx 
     .Provider = "Microsoft.Jet.OLEDB.4.0" 
     .ConnectionString = "Data Source='" & ThisWorkbook.FullName & "'; " & "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'" 
     .Open 
    End With 

    'setup the command 
    Set cmd.ActiveConnection = cnx 
    cmd.CommandType = adCmdText 
    cmd.CommandText = "SELECT * FROM [" & sheetName & "$]" 
    rst.CursorLocation = adUseClient 
    rst.CursorType = adOpenDynamic 
    rst.LockType = adLockOptimistic 

    'open the connection 
    rst.Open cmd 

    'disconnect the recordset 
    Set rst.ActiveConnection = Nothing 

    'cleanup 
    If CBool(cmd.State And adStateOpen) = True Then 
     Set cmd = Nothing 
    End If 

    If CBool(cnx.State And adStateOpen) = True Then cnx.Close 
    Set cnx = Nothing 

    '"return" the recordset object 
    Set RecordSetFromSheet = rst 

End Function 

Public Sub Test() 

Dim rstData As ADODB.Recordset 
Set rstData = RecordSetFromSheet("Sheet1") 

Sheets("Sheet2").Range("A1").CopyFromRecordset rstData 

End Sub 

Данные Лист1: Field1 Field2 Field3 Красный A 1 Синий B 2 Зеленый C 3

Что должно быть скопировано на Лист2: Красный A 1 Синий B 2 Зеленый C 3

Это экономит мне огромное количество времени от запросов к SQL каждый раз, когда я хочу, чтобы внести изменения и проверить его ...

--Robert

+0

Данные листа не будут совпадать с тем, как я этого хотел, выглядит как возврат каретки исключается из комментариев. Надеюсь, это имеет смысл. – robault

+0

'cmd.State' не является битовой маской, просто используйте' cmd.State = adStateOpen' – wqw

+0

Спасибо! (для указания этого) – robault

2

Самый простой будет использовать rs.Save "filename" и rs.Open "filename" сериализации на стороне клиента набора записей в файлы.

+0

Хорошая точка, это может сработать, но я не пробовал. Я смог использовать решение в функции VBA выше. Спасибо за подсказку. Возможно, это и трюк. – robault

Смежные вопросы