2009-08-07 7 views
1

У меня есть следующий код, чтобы импортировать файл с разделителями в Access 2003 базы данных:MS Access замерзает После Импорт текста

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") 

и он отлично работает. Я также могу назвать это из окна Immediate, и он работает без проблем.

Однако, если я вызываю функцию из формы (из события Click команды команды), то Access замерзает. Похоже, что импорт завершен (индикатор выполнения в строке состояния окна базы данных доступа показывает, что выполняется импорт и завершение импорта), но затем Access становится неактуальным, как в форме, так и в окне базы данных Access. Диспетчер задач не указывает, что Access зависает (статус задачи «Запуск»), и я могу закрыть Access через кнопку «Закрыть» в строке заголовка. Когда я снова открываю базу данных, моя таблица имеет все данные из текстового файла, поэтому импорт действительно работает.

Я также попытался вызвать макрос из формы, но получить те же результаты.

У кого-нибудь есть идеи?

UPDATE: Я пытался позвонить в MsgBox после того, как вызов функции:

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

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

+0

Если таблица загружается, это, вероятно, где-то в другом месте. Даже в этом случае я добавлю еще пару сообщений msgbox в это событие click и проследую их по строкам, пока вы не узнаете, где он висит (или просто пометьте его метрикой - @ $$) и посмотрите, где он останавливается) – BIBD

ответ

1

У вас есть Да и Нет после DoCmd. [что-то], где у вас должны быть Истинные и Ложные. В дополнение к их изменению, пожалуйста, добавьте Option Explicit в начале вашего модуля.

Я думаю, что Да рассматривается как пустая переменная, поэтому при оценке в булевом контексте имеет тот же результат, что и False. Например, следующий код (без Option Explicit) напечатает значение False в окне Immediate:

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

С Option Explicit, доступ будет жаловаться на ошибки компиляции, «Переменная не определена», и выделите слово Да.

Обновление: Попробуйте комментировать ваши инструкции DoCmd.Echo. Доступ ли еще заморожен, когда ваш код не вызывает DoCmd.Echo?

В ответ на ваш комментарий, я понятия не имею, почему ваш код работает при вызове из макроса или в окне «Немедленное», но не при вызове с помощью кнопки нажмите на форму.

+0

Thanks HansUp; У меня есть Option Explicit в верхней части модуля. Я не могу понять, почему код работает при вызове из окна Immediate и непосредственно из макроса, но не из формы. –

+0

Поскольку у вас есть Option Explicit, будет ли ваш код скомпилирован? Я ожидаю, что вы получите ошибки компиляции, когда вы используете «Да» и «Нет». Если нет, может быть полезно понять, почему. – HansUp

+0

Фиксация операторов DoCmd для использования True/False вместо Yes/No. В прошлый раз я доверяю коду, скопированному из intertubes;) –

1

Вы проверяете это с помощью параметра «Обработка ошибок», установленного в «Перерыв на все ошибки»? Убедитесь, что вы. Ваша обработка ошибок может быть улучшена - нет инструкции для выхода при возникновении ошибки. Я думаю, что это не обязательно, технически, но это ваша возможность очистить.

Мне нужно задаться вопросом, как-то вы отключаете эхо. Когда он окажется замороженным, попробуйте ввести «Application.Echo True» в окне Immediate.

+0

Так же эффективно вводить DoCmd.Echo True - меньше символов для ввода (даже с Intellisense). –

+0

Smandoli; это хорошая идея, я не знаю, для чего установлен параметр «Обработка ошибок», но я проверю. –

Смежные вопросы