MS Access 2016 TransferSpreadsheet Ошибка импорта 3274: не в ожидаемом формате - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь настроить макрос с помощью VBA в MS Access 2016, чтобы импортировать несколько файлов .xls в мою таблицу.

Мне удалось запустить этот макрос для 13 файлов, но после 13-го файла каждый оставшийся файл выдает «Ошибка выполнения 3274: внешняя таблица не в ожидаемом формате».ошибка в строке DoCmd.TransferSpreadsheet:

Function ImportAllExcel()
Dim myfile
Dim mypath
Dim finpath

mypath = REDACTED
finpath = REDACTED

ChDir (mypath)
myfile = Dir(mypath)

Do While myfile <> ""
  If myfile Like "*.xls" Then
    DoCmd.TransferSpreadsheet acImport, 8, _
        "Table Name", mypath & myfile, True

    ' Move imported files to Imported folder
    FileCopy mypath & "/" & myfile, finpath & "/" & myfile
    SetAttr mypath & "/" & myfile, vbNormal
    Kill mypath & "/" & myfile
  End If
  myfile = Dir()
Loop

MsgBox "Import complete."

End Function

Я попытался несколько "исправить" из других сообщений безуспешно:

  • Изменение SpreadsheetType на любое другое значение (включая пустое), числовые и все версии acSpreadsheetTypeExcel)
  • Открытие файла и запуск макроса при открытии
  • Открытие и повторное сохранение файла в формате .xls
  • Открытие и сохранениефайл в формате .xls, используя другое имя
  • Перед попыткой TransferSpreadsheet

установите для параметраAttr значение vbNormal * Ни одно из имен столбцов не содержит пробелов (хотя одно содержит подчеркивание и не импортирует столбец ввсе на тех, которые успешно запустились, но это отдельная проблема - я вручную добавил столбец в таблицу Access на всякий случай, но в ней нет записей).

Все файлы .xls взяты из одного источника, в одном формате, с одинаковыми именами столбцов и типами данных - это автоматический ежедневный отчет из машинного источника.Первые 13 файлов были импортированы просто отлично, и я не вижу заметной разницы между запущенными и оставшимися файлами.

Может кто-нибудь помочь мне понять, что происходит с этим макросом и как его исправить?

РЕДАКТИРОВАТЬ В ДОБАВИТЬ: Я добавил индекс в свою таблицу, чтобы предотвратить дублирование записей, что значительно сократило количество импортируемых записей, но все равно перестает работать с теми же файлами.Вручную запустить мастер импорта для одного из файлов, который макрос не будет обрабатывать, работает нормально, но у меня есть большое количество файлов для импорта, и я бы предпочел не импортировать их по одному вручную.

1 Ответ

0 голосов
/ 13 марта 2019

Я выяснил это путем дополнительных экспериментов - Ошибка 3274 может быть вызвана файлами, которые превышают пределы данных ячейки Access. Я полагаю, что это был один столбец длинного текста, который препятствовал импорту.

После импорта некоторых файлов вручную я столкнулся с другой ошибкой при попытке выполнить импорт вручную: «Мастер не может получить доступ к информации в файле». Убедитесь, что файл существует и имеет правильный формат. . "

Это привело меня к https://support.microsoft.com/en-us/help/2836058/access-errors-during-import-export-to-excel-xls, в котором предлагалось попробовать формат .xlsx ..., который исправил ручной импорт.

Поскольку это сработало, я добавил в свой макрос некоторый код для преобразования файлов в формат .xlsx перед импортом, и он исправил его и прекрасно работал на всех оставшихся файлах.

Если кому-то интересно, вот результаты:

Function ImportAllExcel()

Dim myfile
Dim mypath
Dim endpath
Dim oExcel As Object
Dim oExcelWb As Object
Dim bExcelOpened As Boolean

' Folders to import from/to
mypath = REDACTED
endpath = REDACTED

ChDir (mypath)
myfile = Dir(mypath)

' Suppress confirmation of failed import rows caused by indexing
DoCmd.SetWarnings False

Do While myfile <> ""
  If myfile Like "*.xls" Then

    ' Convert XLS file to XLSX to prevent errors
    On Error Resume Next
        ' Use existing instance of Excel if already open
        Set oExcel = GetObject(, "Excel.Application") 
        If Err.Number <> 0 Then
            'Could not get instance of Excel, so create a new one
            Err.Clear
            Set oExcel = CreateObject("Excel.Application")
            bExcelOpened = False
        Else
            bExcelOpened = True
       End If
    On Error GoTo -1

    oExcel.Visible = False
    Set oExcelWb = oExcel.Workbooks.Open(mypath & myfile)
    oExcelWb.SaveAs Replace(mypath & myfile, ".xls", ".xlsx"), 51, , , , False
    oExcelWb.Close False
    If bExcelOpened = True Then oExcel.Quit

    ' Delete the converted file & select the new one
    Kill mypath & "/" & myfile
    myfile = myfile & "x"

    ' Import the file
    On Error GoTo SkipFile
    SetAttr mypath & "/" & myfile, vbNormal
    DoCmd.TransferSpreadsheet acImport, 8, "TABLE NAME", mypath & myfile, True

    ' Move imported files to Imported folder
    FileCopy mypath & "/" & myfile, endpath & "/" & myfile
    Kill mypath & "/" & myfile

SkipFile:
    ' Clear error handling
    On Error GoTo -1
  End If
  myfile = Dir()
Loop

DoCmd.SetWarnings True

MsgBox "Import complete."

End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...