MS Access:导入规范无法通过 VBA

Posted

技术标签:

【中文标题】MS Access:导入规范无法通过 VBA【英文标题】:MS Access: Import Specification not working through VBA 【发布时间】:2013-05-17 18:27:00 【问题描述】:

我有一个 csv 文件的导入规范,当我通过 GUI 在文件上运行它时,它工作得很好。但是,当我通过 VBA 运行它时,由于某种原因,它忘记了一列应该是 Text 列,而是将其设为 Number 列,从而导致大量错误。

我的代码如下。它工作,因为一切运行正常,但由于某种原因,CSV 的导入规范无法正常运行。无意义的 case switch 是一个占位符,因为我需要在第一次工作后添加更多类型的报告。

Sub ImportDE(Folder As Object)
Dim db As DAO.Database
Dim names As DAO.Recordset
Dim Files As Object, file As Object, SubFolders As Object, subfolder As Object
Dim ExString As Variant
Dim check As Boolean
Dim FileChange As String

Set db = CurrentDb
On Error Resume Next:   db.TableDefs.Delete "tblImport":   On Error GoTo 0
db.TableDefs.Refresh

Set names = CurrentDb.OpenRecordset("SELECT Old FROM DENames")

Set Files = Folder.Files
Set SubFolders = Folder.SubFolders

For Each subfolder In SubFolders
    ImportDE subfolder
Next

With names
    Do While Not .EOF
        ExString = .Fields(0)
        For Each file In Files
            If InStr(file.Type, "Worksheet") > 0 Then
                If InStr(file.Path, ExString & ".xls") > 0 Then
                    DoCmd.TransferSpreadsheet _
                        TransferType:=acImport, _
                        SpreadsheetType:=acSpreadsheetTypeExcel9, _
                        TableName:="tblImport_" & ExString, _
                        filename:=file.Path, _
                        HasFieldNames:=True, _
                        Range:="A:CT"
                    db.TableDefs.Refresh
                End If
            ElseIf InStr(file.Type, "Comma Separated") > 0 Then
                If InStr(file.Path, ExString & ".csv") > 0 Then
                    Select Case ExString
                    Case "Usage"
                        DoCmd.TransferText _
                            TransferType:=acImportDelim, _
                            SpecificationName:=UsageCSV, _
                            TableName:="tblImport_" & ExString, _
                            filename:=file.Path, _
                            HasFieldNames:=True
                        db.TableDefs.Refresh
                    End Select
                End If
            End If
        Next
        .MoveNext
    Loop
End With
db.Close:   Set db = Nothing
End Sub

我是否遗漏了一些明显的东西?为什么导入规范不能正常工作?

【问题讨论】:

【参考方案1】:

TransferText SpecificationName 参数应该是一个字符串表达式。由于代码没有声明名为UsageCSV 的变量,我猜这是规范的字面名称。如果正确,请将名称用双引号括起来。

DoCmd.TransferText _
    TransferType:=acImportDelim, _
    SpecificationName:="UsageCSV", _
    TableName:="tblImport_" & ExString, _
    filename:=file.Path, _
    HasFieldNames:=True

【讨论】:

不客气。这个问题困扰了很多人。使用 Access 的在线帮助功能结交朋友。它远非完美,但仍然值得检查以确保您正确使用命令参数。祝你好运。【参考方案2】:

选项比较数据库之后的代码模块顶部 添加选项显式。 这将要求您声明所有变量,并且您将永远不会再遇到此问题

【讨论】:

以上是关于MS Access:导入规范无法通过 VBA的主要内容,如果未能解决你的问题,请参考以下文章

VBA 导入 MS Access 到 MS Word

从 MS Access 导入数据

导入 Access 时不存在文本文件规范

将 MS Access 表定义导出和导入为文本文件

将自定义协议导入 MS Excel / Access

使用 python 将 pandas 数据框导入 MS Access 表