文本导入后MS Access冻结

时间:2009-08-07 17:37:10

标签: ms-access vba import

我有以下代码将分隔文件导入Access 2003数据库:

Public Function importTextFile(sFile As String,  _
                                sTable As String, _
                                sSpecification As String)
On Error GoTo importTextFile_EH

' Validate arguments to see if the objects exist; if not, give a message 
' and exit
If Not FileExists(sFile) Then
    MsgBox "File " & sFile & " does not exist; import terminated.",  _
                                vbCritical + vbOKOnly,  _
                                "Error"
    Exit Function
End If

If Not TableExists(sTable) Then
    MsgBox "Table " & sTable & " does not exist; import terminated.",  _
                                vbCritical + vbOKOnly,  _
                                "Error"
    Exit Function
End If

If Not SpecExists(sSpecification) Then
    MsgBox "Import Specification " & sSpecification &  _
                                " does not exist; import terminated.",  _
                                vbCritical + vbOKOnly,  _
                                "Error"
    Exit Function
End If

' Display a warning to let the user cancel if this is run by mistake.
If vbYes = MsgBox("WARNING: This will delete all data currently in " &  _
                                sTable & "; do you wish to continue?",  _
                                vbExclamation + vbYesNo,  _
                                "Import Text File") Then
    DoCmd.Hourglass Yes

    ' Cleardown the data in the table.
    DoCmd.Echo Yes, "Deleting data in " & sTable & " table..."
    DoCmd.SetWarnings False
    DoCmd.RunSQL "DELETE " & sTable & ".* FROM " & sTable & ";"
    DoCmd.SetWarnings True

    ' Import the text file into the table. 
    DoCmd.TransferText acImportDelim, sSpecification, sTable, sFile

    DoCmd.Echo Yes, "Import complete"
    DoCmd.Hourglass No
Else
    DoCmd.Echo Yes, "Import cancelled."
End If
Exit Function

importTextFile_EH:
    Debug.Print Err.Number & "-" & Err.Description

End Function

我可以使用RunCode来调用此函数,其中参数Function Name的值为

importTextFile (Application.CurrentProject.Path & "\" &  _
                                "batch_results.txt",  _
                                "BatchEngineResults", _
                                "specResults") 

它工作正常。我也可以从立即窗口调用它,它没有任何问题。

但是,如果我从表单(从命令按钮的Click事件)调用该函数,则Access会冻结。看起来导入完成(Access数据库窗口状态栏中的导入进度条显示导入运行和完成),但随后Access无法响应,包括表单和Access数据库窗口。任务管理器不指示Access已挂起(任务状态为“正在运行”),我可以通过标题栏上的“关闭”按钮关闭“访问”。当我再次打开数据库时,我的表中包含了文本文件中的所有数据,因此导入确实有效。

我也试过从表单中调用宏,但得到相同的结果。

有人有什么想法吗?

UPDATE:我在调用函数后尝试调用MsgBox:

importTextFile (Application.CurrentProject.Path & "\" &  _
                                "batch_results.txt",  _
                                "BatchEngineResults",  _
                                "specResults") 
MsgBox "After Import"

出现一个消息框,并且响应迅速。当我解雇它时,Access会像以前一样冻结。你认为这意味着我可能在表格的其他地方有问题,而不是这个功能吗?

2 个答案:

答案 0 :(得分:1)

您是否正在测试此错误处理选项设置为“中断所有错误”?确保你是。您的错误处理可以改进 - 发生错误时没有退出指令。我想技术上不需要,但这是你清理的机会。

我不得不怀疑你是否以某种方式关闭了回音。当它似乎被冻结时,尝试在立即窗口中输入“Application.Echo True”。

答案 1 :(得分:1)

在DoCmd之后你有“是”和“否”。[某事]你应该有正确和错误。除了更改这些内容外,请考虑在模块开头添加 Option Explicit

我认为Yes被视为空变量,因此在布尔上下文中求值时,结果与False相同。例如,以下代码(没有Option Explicit)将在立即窗口中打印False:

Public Sub evaluateYes()
    If Yes Then
        Debug.Print "True"
    Else
        Debug.Print "False"
    End If
End Sub

使用Option Explicit,Access会抱怨编译错误,“未定义变量”,并突出显示“是”字样。

更新:尝试注释掉你的DoCmd.Echo语句。当您的代码未调用DoCmd.Echo时,Access是否仍会冻结?

在回复您的评论时,我不知道为什么您的代码在从宏或立即窗口调用时有效,但在通过按钮单击表单调用时则不行。