Всем привет Имеется файл Excel, в который из базы Access макросом копируется часть данных из нужной таблицы с необходимыми фильтрами. Внизу кусок кода, который за это отвечает.
Проблемы, которые хочется решить: 1) Файл не работает на 64-разрядной версии (а хочется, чтобы работал) 2) Файл не работает на версии Excel выше 2013 года (а хочется, использовать последнюю версию Excel) 3) На некоторых компьютерах файл иногда зависает, когда база Access и файл Excel лежат на сетевом диске, а не на диске компьютера
Если попробовать поменять версию, на ту, которая не соответствует одному из параметров, то Excel выдает ошибку ODBC 1004 на предпоследней строке кода
Можно переделать полностью базу Access, т.к. я подозреваю, что она тоже не оптимальна, т.к. сделана лет 7 назад, только данные обновляются ежедневно Можно полностью переписать код макроса. Подскажите что лучше сделать или подскажите что лучше почитать, чтобы это сделать самостоятельно?)
Комментарии по коду: переменные MySource, MyTable, MySelection, MyFilter определяются выше MySource - путь к текущей папке, где лежит файл Excel и база Access MyTable - Таблица в базе Access MySelection - Имя одного из столбцов таблицы MyFilter - одно из значений, которое может встретиться в столбце MySelection
P.S. использовать PQ не предлагать, нужна именно выгрузка значений из базы Access, чтоб потом их обрабатывать формулами, которые неудобно использовать в умных таблицах.
Андрей VG, если использовать ACE OLEDB 12.0 - это нормальные современные методы или есть что-то получше?
Нашел вот такой кусок кода:
Код
Private Sub Workbook_Open()Dim cn As Object, rs As Object
Dim intColIndex As Integer
Dim DBFullName As String
Dim TargetRange As Range
On Error GoTo Whoa
Set TargetRange = ActiveSheet.Range("A1")
Set cn = CreateObject("ADODB.Connection")
cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=T:\Tablica\TestMDB.mdb;" & _
"Jet OLEDB:Database Password='****';"
Set rs = CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM TEST2", cn, , , adCmdText
' Write the field names
For intColIndex = 0 To rs.Fields.Count - 1
TargetRange.Offset(1 - 1, intColIndex).Value = rs.Fields(intColIndex).Name 'ori nie bylo -1
Next
' Write recordset
TargetRange.Offset(1, 0).CopyFromRecordset rs
LetsContinue:
On Error Resume Next
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
On Error GoTo 0
Exit Sub
Whoa:
MsgBox "Error Description :" & Err.Description & vbCrLf & _
"Error at line :" & Erl & vbCrLf & _
"Error Number :" & Err.Number
Resume LetsContinue
End Sub