|
|
|
| День добрый!
Пишу процедуру, которая проверяет наличие модуля в базе и, если модуля нет, создает новый.
Сначала проверяем наличие модуля
Dim sModuleName, sCheck As String
On Error Resume Next
sModuleName = "имя проверяемого модуля"
sCheck = Modules(sModuleName).Name
If Err.Number Then 'ошибка, т.е. выбрать модуль не удалось, значит такого модуля в базе нет
После этого я создаю пустой модуль и переименовываю его.
DoCmd.RunCommand acCmdNewObjectModule
sModuleNewName = Modules(Modules.Count - 1).Name 'автоматическое новое имя
DoCmd.Save acModule, sModuleNewName 'сохраняем
DoCmd.Rename sModuleName, acModule, sModuleNewName 'переименовываем
Получаем ошибку
"The name you entered already exists for another object of the same type in this database."
И в самом деле, есть такой модуль в базе, а проверка не сработала.
Причем для всех остальных модулей в проекте проверка прошла успешно.
Проблемный модуль может быть разный в зависимости от набора модулей в базе.
Пробовал делать Compact and Repair - не помогает...
Может я чего-то не понимаю в этом Access'е? | |
|
| |
|
|
|
| При проверке, в случае отсутствия ошибки нет выхода из процедуры/функции.
Далее Вы пытаетесь сохранить модуль под имеющимся именем. Поэтому генерируется ошибка. | |
|
| |
|
|
|
| Проверка на наличие модуля через Error мне кажется не совсем правильной.
Может просматривать коллекцию модулей на совпадение имен будет более правильно? | |
|
| |
|
|
|
| Какой у вас Access? Если 2000 и больше, то забудьте о коллекции Modules.
Есть Application.VBE и его надо использовать:
sCheck = application.VBE.ActiveVBProject.VBComponents(sModuleName).Name
|
а лучше
sCheck = application.VBE.VBProjects("ИмяВашегоПроекта").VBComponents(sModuleName).Name
|
| |
|
| |
|
|
|
| Я попробовал предложенный вариант.
Он точно так-же, как у автора топика, возвращает имя модуля при его наличии, и ошибку при его отсутствии. (9)
Если не затруднит можно поподробней, в чем изюм? | |
|
| |
|
|
|
|
Если не затруднит можно поподробней, в чем изюм?
|
Если вы внимательно читали сообщение автора топика, то вы должны были видеть, что имя модуля не всегда возвращается, хотя модуль есть. Почему? Ответ есть в Help
The Modules collection contains all open standard modules and class modules in a Microsoft Access database.
Using the Modules Collection
You can enumerate through the Modules collection by using the For Each...Next statement.
To determine whether an individual Module object represents a standard module or a class module, check the Module object's Type property.
All open modules are included in the Modules collection, whether they are uncompiled, are compiled, are in break mode, or contain the code that's running.
|
просто этот модуль не является открытым. | |
|
| |
|
|
|
| Большое мерси.
Надо заняться изучением VBE.
| |
|
| |
|
|
|
| Спасибо за ответ!
Теперь понятно.
Получается можно для проверки не считывать имя, а пытаться открыть модуль. Тогда ошибка будет говорить о его отсутствии.
Я тем временем уже сделал другой вариант проверки - через таблицу MSysObjects. | |
|
| |