2013-08-04 3 views
3

Я полный noob, пытающийся создать пустую базу данных MS Access с помощью VBA в Excel. Я хочу назвать новую базу данных «tblImport». Это код I'm с помощью:Как создать пустую базу данных MS Access с помощью VBA?

Sub makedb() 
    Dim accessApp As Access.Application 
    Set accessApp = New Access.Application 
    accessApp.DBEngine.CreateDatabase "C:\tblImport.accdb", dbLangGenera 
    accessApp.Quit 
    Set accessApp = Nothing 
    End Sub 

Я получаю следующее сообщение об ошибке:

"Run Time Error 3001: Применение или объекта Определено Error"

Что я могу сделать?

ответ

9

Имя локали константы в методе CreateDatabase неправильно:

Это:
accessApp.DBEngine.CreateDatabase "C:\tblImport.accdb", dbLangGenera

Должно быть:
accessApp.DBEngine.CreateDatabase "D:\tblImport.accdb", DB_LANG_GENERAL

Изменение, что и ваш код должен работать. (Это делает для меня хотя бы).

+0

Это был быстрый ответ. Это сработало и для меня. Спасибо: D – steinbitur

+0

++ Yup, который работает, но это не является причиной сообщения об ошибке :) См. Мой ответ. –

2

Старый вопрос, но это было полезно для меня. Похоже, вам даже не нужен объект Access.

Access.DBEngine.CreateDatabase "D:\tblImport.accdb", DB_LANG_GENERAL 

работает отлично для меня.

+1

Этот метод создает экземпляр 'Access.Application'. Но он исчезает сразу после завершения 'CreateDatabase'. – HansUp

+2

Полезно знать.В любом случае это меньше кода. – brainac

+0

Я не возражаю против этой конкретной строки, но я настоятельно рекомендую прокомментированную философию: не наличие уловки ошибок также меньше кода, в результате чего обновление экрана на меньше кода и т. Д. Редко, в vba, где меньше строк кода переводится как в более надежную реализацию, так и в более высокую эффективность, и часто не приводит к ни тем, ни другим. – CWilson

2

Вы должны использовать первый метод, если собираетесь использовать созданный объект автоматизации. Вы можете открывать формы, использовать инструкции DoCmd и т. Д., Просто предваряя каждое утверждение «accessApp». Например, я использую TempVars для хранения пользовательских данных. Я могу открыть соответствующую базу данных с помощью автоматизации, а затем сделать

accessApp.TempVars.Add "CurrentUser", TempVars.CurrentUser

передать значение CurrentUser из активной базы данных в новую базу данных.

Когда все, что вы хотите сделать, это создать новую базу данных, чтобы сделать такую ​​функцию, как DoCmd.TransferDatabase, вы можете просто использовать

Access.DBEngine.CreateDatabase "D:\tblImport.accdb", DB_LANG_GENERAL

+0

Добро пожаловать на SO. К сожалению, не каждый новый пользователь может написать хорошую запись, как вы. Хотя, возможно, вас заинтересуют эти сообщения в Meta: http://meta.stackexchange.com/a/114538/181303 и http://meta.stackexchange.com/questions/12119/ – ForceMagic

1

старый вопрос. Вот мои два цента. У вас есть опечатка ...

dbLangGenera должен быть dbLangGeneral

Подробнее об этом в Workspace.CreateDatabase Method (DAO)

голосования, чтобы закрыть этот вопрос, как на Dealing with questions with obvious replies

Попробуйте это. Это работает.

Sub makedb() 
    Dim accessApp As Access.Application 
    Set accessApp = New Access.Application 

    accessApp.DBEngine.CreateDatabase "C:\tblImport.accdb", dbLangGeneral 
    accessApp.Quit 

    Set accessApp = Nothing 
End Sub 

EDIT: Будет ли удалить этот ответ и отправить его в качестве комментария, как только пост закрыт.

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