Если ваш код работает правильно изнутри сеанса Access, рассмотрите возможность создания экземпляра приложения Access из кода Excel, а затем запустите остальные из этого экземпляра приложения Access.
Const cstrDbPath As String = "C:\Data\myDB.mdb"
Dim appAccess As Object
Set appAccess = CreateObject("Access.Application")
appAccess.OpenCurrentDatabase cstrDbPath, False
'then your code ... for example ... '
appAccess.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, _
"tempCorrection", "C:\Data\conrrections.xls", True
'before you exit the procedure ...'
appAccess.Quit
Set appAccess = Nothing
Я надеюсь, что это указывает начто-то полезноеТем не менее, я подозреваю, что здесь больше вовлечено.Я рекомендую вам включить Option Explicit
в сеанс объявлений вашего модуля, а затем отладить-> скомпилировать код вашего приложения из главного меню VBE.Похоже, что компилятор может жаловаться на db_fe
, так как вы не Dim его ... это глобальная переменная, объявленная в другом месте?Что бы это ни было, обязательно используйте Option Explicit
!
Редактировать : установите точку разрыва в строке TransferSpreadsheet, затем построчно пройдитесь по остальной части процедуры (F8).Непосредственно перед тем, как перейти к строке db_fe.Execute
, попробуйте что-то вроде этого, чтобы увидеть, найден ли tempCorrection:
Debug.Print DCount("*", "tempCorrection")
Не уверен, насколько это будет полезно, либо ... на данный момент я в основномхватаясь за соломинку.Моя интуиция подсказывает, что это может иметь какое-то отношение к удалению и повторному созданию tempCorrection каждый раз ... Я хотел бы написать код об этом.:
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, _
"tempCorrection", "C:\Data\corrections.xls", True
DoCmd.RunSQL "alter table tempCorrection add column newColumn text;"
DoCmd.RunSQL "update tempCorrection set newColumn='" & _
filename & "';", dbFailOnError
db_fe.Execute "updateCorrections", dbFailOnError
Вы используете TransferSpreadsheet
для создания таблицы tempCorrection .Позже вы получите сообщение об ошибке db_fe.Execute
, что ядро базы данных не сможет найти tempCorrection .Но между ними вы выполняете 2 оператора DDL, которые ссылаются на tempCorrection --- Я не понимаю, почему они не выдают ошибку о том, что таблица не найдена.Может быть, это как-то связано с DoCmd.RunSQL
(и / или у вас SetWarnings False).Я бы заменил DoCmd.RunSQL
на db_fe.Execute
плюс dbFailOnError
.
Также вторым параметром DoCmd.RunSQL
является указание механизму БД, использовать ли транзакцию при выполнении SQL.Использование dbFailOnError
в качестве второго параметра для DoCmd.RunSQL
кажется неправильным.