Страница: 1 |
Страница: 1 |
Вопрос: Программно заменить модуль класса и сделать ссылку
Добавлено: 26.02.09 12:52
Автор вопроса: GDK
Хочу сделать модуль класса, который будут использовать макросы в различных документах. Этот модуль класса буду время от времени обновлять. Как сделать так, чтобы он обновлялся во всех документах, которые его используют?
И второй вопрос. Как программно в документе А сделать ссылку на документ Б по аналогии с ручной работой VBE->menu->Tools->References.
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #1
Добавлено: 26.02.09 14:44
1. Сохрани модуль класса в "Личной книге макросов" PERSONAL.XLS. Не знаю точно где она находится, но до нее можно "достучаться", записав в нее какой-нибудь бессмысленный макрос, остановив запись и перейдя к VBE увидеть эту книгу в Project Explorer. Туда можно вручную или через объектную модель VBE удалять/добавлять модули классов и простые модули, при этом все они будут доступны тебе из любой книги.
2. Наверняка не знаю. Возможно надо покапаться в объектах VBE, т.е. один раз вручную подключаешь Microsoft Visual Basic for Applications Extensibility 5.3, смотришь объекты в Браузере объектов (F2) и медитируешь, медитируешь... )
Номер ответа: 2
Автор ответа:
GDK
Вопросов: 13
Ответов: 348
Профиль | | #2
Добавлено: 26.02.09 15:10
Я не правильно задал первый вопрос. Хоцца программно заменять модуль класса в к-либо документе.
2.-Это похоже на приговор.
Номер ответа: 3
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #3
Добавлено: 26.02.09 16:17
Смотри метод VBIDE.References.AddFromFile(Filename As String). До меня пока не дошло, как его грамотно вызвать - без ошибки. Думаю, направление ты понял )
Номер ответа: 4
Автор ответа:
GDK
Вопросов: 13
Ответов: 348
Профиль | | #4
Добавлено: 26.02.09 16:28
Конечно понял. Метод - .meditacia(param as engl.help)
Номер ответа: 5
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #5
Добавлено: 26.02.09 22:03
Ответ на первый вопрос с учетом уточнения во втором посте найден:
Все выглядит до неприличия просто, если не учитывать танцы с бубном:
1. Надо ручками подключить к проекту "Microsoft Visual Basic for Applications Extensibility 5.3", в простонародье библиотека VBIDE.
2. Разрешить доступ к Visual Basic Project из меню Excel Сервис-Макрос-Безопасность... вкладка Надежные издателигалочка Доверять доступ к Visual Basic Project [OK]
3. Для доступа всех книг к обновленному модулю класса рекомендую засовывать импортируемый модуль класса в Личную книгу макросов PERSONAL.XLS (читайте первый пост, пункт 1).
P.S. Только не надо теперь спрашивать, как программно подключать к проекту VBIDE и как программно разрешать доступ к Visual Basic Project, т.к. это не совсем тривиально на VBA да и сделать это надо на одной машине всего один раз ручками..
Номер ответа: 6
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #6
Добавлено: 26.02.09 22:25
Ответ на второй поставленный вопрос:
Так же просто. Требует тех же самых танцев с бубном. Имя проекта VBA в ThisWorkbook не должно совпадать с именем проекта VBA в связываемой книге, иначе ошибка - конфликт имен. Интересный эффект. Продолжаю удивляться всем возможностям Excel, которые я до сих пор не до конца изучил. Я имею ввиду, что после этих действий книга Book2.xls открывается вместе с "родительской" книгой и книгу Book2.xls нельзя закрыть до тех пор, пока не закрыта первая книга, да и закрываются они обе вместе, на пару! GDK, спасибо за интересный вопрос.
Номер ответа: 7
Автор ответа:
GDK
Вопросов: 13
Ответов: 348
Профиль | | #7
Добавлено: 03.03.09 13:27
Про безопасность это понятно. Спасибо за ответы. А то я знал что это всё можно, но не знал как (а в англ.-баобаб). Кстати можно на VB накатать экзешник. Чтоб пользователя не мучить.
А по второму вопросу это также происходит если руками из меню подключаешь файл. А не закрывается наверное потому что при подключаемый документ выступает в роли типа Dll. При этом если его заранее подключить, очень удобно работать с его объектами. Например: Dim Serv as ЧужойПроект.ЧужойКласс
Serv.prop1
После того как напишешь Serv1 и поставишь точку IDE предложит все св-ва и Public-методы и функции. Ну и как же это было бы возможно если б второй документ был бы закрыт? На этапе разработки работаешь с удобством, отправляешь на любоцй комп с офисом, а там все ссылки устанавливаются программно. Ну короче удобно (лишь бы руки не из зада были). Потому и спросил.
Номер ответа: 8
Автор ответа:
GDK
Вопросов: 13
Ответов: 348
Профиль | | #8
Добавлено: 13.08.09 10:55
Ofiгеть! Не нашёл библиотеку VBIDE. Т.е. дома всё нашёл в списке Tools.References... Подключил.
Public Function CopyComponents()
Dim i As Long
Dim Compon As VBcomponent
For i = 1 To SourceDoc.VBProject.VBComponents.Count
Set Compon = NewDoc.VBProject.VBComponents(i) 'Тут вываливается сообщение об ошибке
Next i
End Function
На другом компе открыл свой файл. Глянул в Tools.References... а там
MISSING: Microsoft Visual Basic 6.0 Extensibility
и путь к ней
С:\Program Files\Microsoft Visual Studio\VB98\VB6EXT.OLB
Стало примерно понятно почему вываливалась ошибка. Библиотека то не VBA-шная, а VB-я. Значит тип объекта не соответствующий, хотя называется так же.
Ну да ладно. На др. компе не установлена VS. Где найти библиотеку VBIDE? В Tools.References... её нет. Если не трудно подскажите путь к файлу.
И ещё. Как программно скопировать все компоненты(модули, формы, код в листах если это ексель) из одного открытого документа в другой открытый? Через экспорт>импорт как то не хотелось бы.
Короче весь этот гимор затеял для того чтобы каждый раз не делать всё это вручную. Часто бывает так что при многократном копировании комп-флэшка-комп-.... начинаются глюки у копируемых файлов, которые выражаются в прекращении нормальной работы кодов типа
что лечится
Пока получилось только скопировать все ссылки, хотя думал будет всё наоборот.
Номер ответа: 9
Автор ответа:
GDK
Вопросов: 13
Ответов: 348
Профиль | | #9
Добавлено: 17.08.09 15:13
Похоже ПРИДЁТСЯ через экспорт/импорт. Блин!
Номер ответа: 10
Автор ответа:
GDK
Вопросов: 13
Ответов: 348
Профиль | | #10
Добавлено: 18.08.09 08:22
Сделал лля Ворда. Создаёт резервную копию файла, сохраняет исходный док. в формате ртф, сохраняет полученный ртф в формате .док, устанавливает в полученном файле все ссылки из исходного файла, копирует все модули и формы и код из ThisDocument затем сохраняет это всё. Пришлось через экспорт/импорт.