Access 中的运行时错误 3011

Posted

技术标签:

【中文标题】Access 中的运行时错误 3011【英文标题】:Runtime Error 3011 in Access 【发布时间】:2017-07-05 09:30:28 【问题描述】:

我只是尝试使用 vba 导入一个 .csv 文件。 我使用带有自定义规范的 DoCmd.TransferText 方法。我尝试使用向导导入具有相同规格的文件,并且效果很好。

但是当我启动 vba 时,我收到此错误消息:

Sorry, it is in german, but I think one can read the essentials

这是我调用方法的部分代码:

Public Function ImportFileToTable(params As ImportFileToTableParams) As ImportFileToTableResult
    'TODO: Import a CSV File into the selected table
    Dim result As New ImportFileToTableResult

    On Error GoTo ImportFail
    DoCmd.TransferText acImportDelim, params.SpecificationName, params.TableName, params.FileName, params.HasFieldNames

    result.Success = True
    Set ImportFileToTable = result
    Exit Function

ImportFail:
    result.Success = False
    result.ErrorMessage = "There was an error importing the File"
    Set ImportFileToTable = result
End Function

我的数据库在网络驱动器上,但我试图将它复制到我的本地驱动器上,并且它具有相同的 otcome。我还尝试了文件位置。

我使用的软件是: -Microsoft Access 2013

提前谢谢大家:)

【问题讨论】:

您的 Params.FileName 似乎没有包含 CSV 文件的完整路径。 这也是我的第一个想法,但我也尝试将其直接写入方法并得到相同的错误 你能Debug.Print Params.FileName 给我结果吗?问题应该在那里,不知道有什么其他方法可以抛出该错误。另外,尽量省略调试参数,如Params.SpecificationNameParams.HasFieldNames 这样放置的结果相同: DoCmd.TransferText acImportDelim, , params.TableName, params.FileName | Debug.Print Params.FilenName: C:\Users\aaa\Desktop\aaaviezev01.bgtvie.jc.local-Cl-201706050505.csv * *a 用于模糊信息 您的文件名中有隐藏字符(如果您只是复制粘贴的话)。将其复制粘贴到即时窗口会返回 aaaviezev01.bgtvie.jc.local-Cl-20170605??0505。奇怪的是,Windows 确实接受将文件重命名为该名称(据我所知,它不应该)。先重命名文件,再导入。 【参考方案1】:

更完整的答案:

文件名包含非 ASCII 字符。多重访问功能无法正确处理此问题。解决方案是将任何包含非 ASCII 字符的文件重命名为不包含这些字符的文件。

一些有用的辅助函数:

测试一个字符串是否包含非 ASCII 字符,如果包含则返回 true,如果不包含则返回 false(在这种情况下可用于引发描述性错误)。

Public Function StringContainsNonASCII(str As String) As Boolean
    Dim i As Integer
    'Default is false
    StringContainsNonASCII = False
    'Remove question marks
    str = Replace(str, "?", "")
    For i = 1 To Len(str)
        'Search for question marks
        If Asc(Mid(str, i, 1)) = 63 Then
            StringContainsNonASCII = True
            Exit Function
        End If
    Next i
End Function

从字符串中去除非 ASCII 字符

Public Function RemoveNonASCII(str As String) As String
    Dim i As Integer
    For i = 1 To Len(str)
        'Append the question marks
        If Mid(str, i, 1) = "?" Then
            RemoveNonASCII = RemoveNonASCII & "?"
        End If
        'Append anything that isn't a questionmark
        If Asc(Mid(str, i, 1)) <> 63 Then
            RemoveNonASCII = RemoveNonASCII & Chr(Asc(Mid(str, i, 1)))
        End If
    Next i
End Function

【讨论】:

以上是关于Access 中的运行时错误 3011的主要内容,如果未能解决你的问题,请参考以下文章

带有 SQL 查询的 Access 中的运行时错误 3067

将 Excel 文件导入 Access 表运行时错误“-2147352565 (8002000b)”

Access 2010 运行时错误 2185

Access 2007 运行时错误

Access 2010 级联组合框运行时错误 424

运行时错误 3464:条件表达式中的数据类型不匹配