MS Access 2016 TransferSpreadsheet导入错误3274:未达到预期格式

问题描述 投票:0回答:1

我正在尝试使用MS Access 2016中的VBA设置一个宏,以将大量.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之前,将SetAttr设置为vbNormal

没有列名称包含任何空格(尽管一个包含下划线,并且根本没有在已成功运行的列上导入列,但这是一个单独的问题 - 我手动将列添加到Access表以防万一,但它是没有数据条目)。

所有.xls文件都来自相同的源,格式相同,具有相同的列名和数据类型 - 它们是来自计算机源的自动日报。导入的前13个文件很好,我发现运行的文件和剩余的文件之间没有明显的区别。

任何人都可以帮助我了解这个宏发生了什么以及如何解决它?

编辑添加:我在我的表中添加了一个索引以防止重复输入,这显着减少了导入记录的数量,但它仍然停止处理完全相同的文件。在宏不会处理的其中一个文件上手动运行导入向导工作正常,但是我要导入大量文件,并且希望避免逐个手动导入它们。

excel ms-access access-vba ms-access-2016
1个回答
0
投票

我通过更多实验得出结论 - 错误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
© www.soinside.com 2019 - 2024. All rights reserved.