Создание и запись данных в таблицу - MS Access - PullRequest
1 голос
/ 01 декабря 2011

РЕДАКТИРОВАТЬ: изменено, поскольку у меня другая проблема с тем же кодом

2-е редактирование: добавление дополнительного кода, который, кажется, вызывает проблему

Я создал программу VBA в доступеагрегирует данные из ряда внешних источников и записывает результаты в новую таблицу.В идеале, когда я запускаю программу, я хочу стереть все данные, которые в данный момент находятся в таблице, и заменить их новыми данными.В настоящее время я удаляю все данные в таблице ... затем записываю свои новые данные

Вот код для справки

Function getTestFixtures(FixtureName As String) As Recordset
Dim db As Database

Set db = OpenDatabase(GetDBPath & "TestFixtures.xlsx", False, False, "Excel 12.0;HDR=Yes;")

If db Is Nothing Then
     MsgBox "Can't find the file!", vbExclamation, ThisWorkbook.Name
     Exit Function
End If

Set getTestFixtures = db.OpenRecordset("Select * from [" & FixtureName & "$]")

End Function

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

Sub Write_OTDC_Data(POlist As Dictionary)
Dim Rst As Recordset


DoCmd.SetWarnings False
DoCmd.runsql "Delete * from [OTDC Results]"
DoCmd.SetWarnings True


Set Rst = CurrentDb.OpenRecordset("OTDC Results")

With Rst

  For Each key In POlist.Keys
    .AddNew
    For i = 0 To 9
        .Fields(i).value = POlist(key)(i)
    Next
    .Update
  Next
.Close
End With
End Sub

Моя проблема в том, что я получаю следующую ошибку, если пытаюсь что-либо изменить после выполнения обеих вышеуказанных процедур.

Error Message

Запуск в автономном режиме не приводит к ошибке.

1 Ответ

0 голосов
/ 27 января 2012

Я не уверен, что этот вопрос до сих пор не решен.Если это не так, у меня есть несколько советов для вас, но не так много уверенности, что они решат проблему.

Попробуйте DoCmd.TransferSpreadsheet импортировать данные листа в чистую таблицу вместо использования OpenDatabase сРабочая тетрадь.

В вашем MsgBox мне интересно, означает ли ThisWorkbook.Name что-либо для приложения Access.Кроме того, я бы проверил, существует ли книга, затем открою ее (или импортирую из нее лист), только если файл найден.

If Len(Dir(GetDBPath & "TestFixtures.xlsx")) = 0 Then
    'not found
Else
    'use it
End If

На самом деле мне непонятно, почему вы не получаете сообщение об ошибке OpenDatabase, если файл рабочей книги не существует.И это заставляет меня с подозрением относиться к DoCmd.SetWarnings False Никогда, никогда не выключайте SetWarnings.Это подавляет важную информацию.И это совершенно не нужно.Задайте для переменной объекта DAO.Database значение CurrentDB(), затем используйте вместо этого:

dbObjectVariable.Execute "Delete from [OTDC Results]", dbFailOnError 

Добавьте обработчик ошибок для решения любых проблем, которые выявляет dbFailOnError.

Наконец, это повторяется, потому чтоэто так важно НИКОГДА выключить SetWarnings.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...