Доступ – открыть файл Excel, сделать некоторое кодирование с помощью и закрыть

Я пытаюсь открыть файл Excel из Access и делать с ним что-то, но код нестабилен. Иногда это работает, иногда нет. Вот как я это делаю:

Dim FilePath As String Dim ExcelApp As Excel.Application FilePath = "C:\Users\Lucky\Desktop\Test.xls" Set ExcelApp = CreateObject("Excel.Application") ExcelApp.Workbooks.Open (FilePath) With ExcelApp 'do some stuff here End With ExcelApp.Workbooks.Close Set ExcelApp = Nothing 

Я также заметил, что как только я запускаю код, Excel запускает процесс под Диспетчером задач, который должен быть убит вручную, чтобы снова запустить код. В противном случае я получаю два типа ошибок с файлом Excel:

Поэтому я считаю, что есть некоторые недостатки, когда файл закрыт в моем коде. Как я могу это исправить ?

Я не вижу, что не так с вашим кодом – возможно, путь к рабочему столу?
Это код, который я обычно использую – я добавил еще одну функцию, чтобы помочь выбрать файл. Он использует последнее связывание, поэтому нет необходимости устанавливать ссылку на Excel – вы не получаете IntelliSense и не можете использовать константы Excel, такие как xlUp – вы должны использовать числовой эквивалент.

 Public Sub Test() Dim oXLApp As Object Dim oXLWrkBk As Object Dim oXLWrkSht As Object Dim vFile As Variant Dim lLastRow As Long vFile = GetFile() Set oXLApp = CreateXL Set oXLWrkBk = oXLApp.WorkBooks.Open(vFile, False) Set oXLWrkSht = oXLWrkBk.WorkSheets(1) 'First sheet. Can also use "Sheet1", etc... lLastRow = oXLWrkSht.Cells(oXLWrkSht.Rows.Count, "A").End(-4162).Row '-4162 = xlUp MsgBox "Last row in column A is " & lLastRow oXLWrkBk.Close False oXLApp.Quit Set oXLWrkBk = Nothing Set oXLApp = Nothing End Sub Public Function CreateXL(Optional bVisible As Boolean = True) As Object Dim oTmpXL As Object ''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Defer error trapping in case Excel is not running. ' ''''''''''''''''''''''''''''''''''''''''''''''''''''' On Error Resume Next Set oTmpXL = GetObject(, "Excel.Application") ''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'If an error occurs then create an instance of Excel. ' 'Reinstate error handling. ' ''''''''''''''''''''''''''''''''''''''''''''''''''''''' If Err.Number <> 0 Then Err.Clear On Error GoTo ERROR_HANDLER Set oTmpXL = CreateObject("Excel.Application") End If oTmpXL.Visible = bVisible Set CreateXL = oTmpXL On Error GoTo 0 Exit Function ERROR_HANDLER: Select Case Err.Number Case Else MsgBox "Error " & Err.Number & vbCr & _ " (" & Err.Description & ") in procedure CreateXL." Err.Clear End Select End Function Function GetFile(Optional startFolder As Variant = -1, Optional sFilterName As String = "") As Variant Dim fle As Object Dim vItem As Variant ''''''''''''''''''''''''''''''''''''''''''' 'Clear the file filter and add a new one. ' ''''''''''''''''''''''''''''''''''''''''''' Application.FileDialog(3).Filters.Clear Application.FileDialog(3).Filters.Add "'Some File Description' Excel Files", "*.xls, *.xlsx, *.xlsm" Set fle = Application.FileDialog(3) With fle .Title = "Select a file" .AllowMultiSelect = False If startFolder = -1 Then .InitialFileName = CurrentProject.Path Else If Right(startFolder, 1) <> "\" Then .InitialFileName = startFolder & "\" Else .InitialFileName = startFolder End If End If If .Show <> -1 Then GoTo NextCode vItem = .SelectedItems(1) End With NextCode: GetFile = vItem Set fle = Nothing End Function 

Мне удалось решить мою проблему. В моем вопросе нет ничего плохого в коде, за исключением того, что вместо объявления

 Dim ExcelApp As Excel.Application 

Лучше использовать

 Dim ExcelApp As Object 

Но гораздо большая проблема связана с кодом, который вносит изменения в Excel, например, в эту строку:

 x = Range(Cells(1, i), Cells(Rows.Count, i).End(xlUp)).Value 

И правильный синтакс:

 x = ExcelApp.Range(ExcelApp.Cells(1, i), ExcelApp.Cells(ExcelApp.Rows.Count, i).End(xlUp)).Value 'maybe also better to replace xlUp with -4162 

Таким образом, всякий раз, когда вы используете какой-либо код для файла Excel из Access, НЕ ЗАБУДЬТЕ, чтобы ссылаться на все объекты Excel. И, конечно, перед всем, в консоли VBA должна быть установлена ​​правильная ссылка, в моем случае – в Microsoft Office 15.0.

  • Ошибка: MS Access 2016 не может найти сохраненный импорт
  • Excel VBA для запроса базы данных MS Access на Sharepoint с ADODB - «Недействительное имя файла»
  • Как перенести данные, сохраненные как переменные в программе Excel VBA, в базу данных Access
  • Доступ к VBA: как вернуть путь к файлу, который вы просматривали
  • Эквивалент перетаскивания в Excel, но в запросе Access
  • Подсчет количества записей в месяц в таблице Access, которая хранит данные за 25 лет
  • Excel - SQL «INSERT INTO» Ошибка синтаксиса запроса
  • Файл Excel обновлен, но без изменений: экспорт запроса в excel без заголовка
  • импорт данных Excel в доступ
  • Соответствующие поля, которые не совсем совпадают?
  • Excel VBA, выполняющий запрос Access, может возвращать несколько записей
  • Давайте будем гением компьютера.