|
Референс Офиса
|
|||
---|---|---|---|
#18+
Добрый день ! Подскажите решение, пожалуйста. Создал базу в Access 2003. На моей машине стоит Офис 2010. Офис - 15 версия. Там где будет работать Офис 2007. Офис - 12 версия. С вордом и экселем справился поздним связыванием. А как быть с самим офисом ?! У меня с его омощью сделаны меню. Само меню меняется программно. Есть, конечно, запасной вариант: меняю референс на машине с 2003 офисом, пересохраняю файл. И тогда на машине с более поздним все работает. Но хотелось бы как-то упростить процедуру. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 11:39 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Павел Жданов, я вот не совсем понял зачем ссылки на библиотеки. Что значит Павел Ждановкак быть с самим офисом ?! Где у Вас меню создаются? Сам по себе Офис - это набор приложений: Excel, Word, Access и т.д. В нем нельзя создать меню - оно создается в отдельном его приложении. Поэтому напишите из какого приложения в каком Вы чего создаете и как. Тогда можно будет подумать как помочь. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 12:50 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
The_Prist, Вот код: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
В референсах - "Microsoft Office 15.0 Object Library" Без этой ссылки не работает. Или другой версии. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 12:58 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Вот такое меню получается: ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 13:08 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Павел Жданов, а зачем здесь референс? Вы внутри одного приложения ведь все это делаете? Другой момент, что может влиять отсутствие ссылки на родителя: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 13:10 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Попробовал без ссылки, заменив Объектом. Заменил часть определений цифрами. Все равно не "пашет" :( В строке "Set MyMenuBar =" уже ошибку выдает. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 13:43 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Павел Жданов, А что за ошибка? Вы перед созданием удаляете это меню? Вдруг в первый раз создалось, а Вы потом еще пытаетесь создать с таким же именем? Application. добавили? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 14:14 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Павел Жданов, а константы msoBarTop, msoBarNoMove и др. кто при отключении ссылки будет определять? Поэтому и ошибка (в зависимости от наличия Option Explicit одна или другая). Ссылка на библиотеку (сильно) нужна, если надо обрабатывать события. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 14:58 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Константы не определяет. События есть - тыки по меню, добавления меню и удаления. Есть ли хитрый споособ обойти ссылку ? По примеру с Word и Excel: Код: vbnet 1. 2.
Если без ссылки не обойтись, то, видимо, как-то ее нужно изменить. Одну версию на другую... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 15:08 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Павел Жданов, Давайте все же с самого начала. Какое это приложение вообще? Чему принадлежит Application? Откуда запускается код? Откуда уверенность, что есть вообще возможность создания приведенным выше способом панелей? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 15:17 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
The_Prist, хорошо, начнем с начала :)) Какое это приложение вообще? Приложение - Access 2003 Программа создана для учета видеокассет в Архиве. Чему принадлежит Application? У меня на рабочем компе админы поставили Офис 2010 (лицензия и т.п.) В кабинете Архива стоит комп с Офисом 2007 Откуда запускается код? Файл MDB запускается на компе с Офисом 2007. При запуске происходит создание меню, состояние меню зависит от текущих данных. Также меню меняется в процессе работы программы. Откуда уверенность, что есть вообще возможность создания приведенным выше способом панелей? На моём компе все прекрасно работает. Если вручную на машине с Офисом 2007 поменять ссылку, то тоже всё прекрасно работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 15:46 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Вот, можете поэкспериментировать. Создаётся меню с одной кнопкой - "Kassets". По клику на ней появляется окно "Clic on Menu". Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 16:05 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
вам бы в форуме по акцесу уже давно бы объяснили,что 2007 и 2010 - это две большие разницы. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 16:09 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Павел Жданов, Не совсем понятно все же, зачем ссылку-то менять? Если мне не изменяет память, то ссылка на приложение, из которого запущен проект ставится автоматом. Зачем она у Вас вообще установлена? Без неё не работает? Попробуйте ссылку эту снять и скомпилировать проект: Debug-Compile VBAProject Если нормально скомпилируется без ссылки - то нечего и заморачиваться. Только при этом все же мой совет про добавление Application учтите. Ссылка на офис дает возможность как раз к объектам самого приложения обращаться без указания ссылки на него. А если отключить - то обязательно указывать родителя. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 16:10 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Все большое СПАСИБО ! Пойду спрашивать в другом форуме. Простите, оБшибся местом :) The_Prist, без ссылки ничего не компилируется и не работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 16:18 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Павел Жданов, можно вытащить библиотеку типов из Офиса 2003 в отдельный файл .tlb, и делать ссылку на него (см. приложение). Попробуйте, попытка-не пытка. P. S. Да, люди "гонят", но это не значит, что не хотят помочь. А вот если человек не хочет себе помочь сам - то не стоило и начинать. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 16:35 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Павел Ждановбез ссылки ничего не компилируется и не работаетЧто значит не работает? Какая ошибка? 91? Вы Applicaton везде где надо добавили? Я вот тестовый проект сделал, добавил туда все, что надо. Снял галку со ссылки. Все работает. Только если убирать Application не работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 16:41 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
13-й квартал, Ураааааааааааааа !!! Заработалоооо ! Спасибо !!! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 16:48 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
The_Prist, поясни, пожалуйста, куда поставить Applicaton ? У меня не работает без ссылки. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 17:37 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 17:45 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
The_PristСсылка на офис дает возможность как раз к объектам самого приложения обращаться без указания ссылки на него. А если отключить - то обязательно указывать родителя.Загадочные фразы сами по себе. И библиотеке типов приписываются свойства, которыми она не обладает. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 17:46 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Konst_One, зачем там явный Application? У Application выставлен атрибут appobject , все методы и свойства попадут в global namespace. В том числе CommandBars. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 17:58 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
это ответ куда его вставлять, а зачем это не ко мне. я уже не помню, что там в акцессе накручено в объектной модели. тем более, что ТС уже применил tlb и у него всё ок. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 18:08 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
13-й квартал, Коллекция CommandBars относится к Application. А отношение это прописано в библиотеке "Microsoft Office XX.0 Object Library". Если она подключена - то запись CommandBars.Add будет работать и VBA по умолчанию припишет CommandBars к Application, как прописано в типах(как using в C). Но если убрать ссылку на библиотеку "Microsoft Office XX.0 Object Library", то коллекция CommandBars ни к кому не будет отнесена и VBA сочтет её необъявленной процедурой или переменной. И если установлена директива Option Explicit - VBA честно об этом ошибкой и скажет. Если не установлена вышеупомянутая директива - то при попытке создать новую панель получим ошибку отсутствия метода для объекта. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 18:14 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Итак, методом проб и ошибок разобрался ! Переменные заменил Объектами. Все константы - цифрами. Ошибка вылезала из-за вот этого - "Option Explicit" ! Как только убрал - перестал Access ругаться :) И без апликейшена тоже работает. Осталось заменить чем-то Office.FileDialog ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 18:35 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Павел ЖдановОшибка вылезала из-за вот этого - "Option Explicit"Эх...А вот она очень даже полезная. То, что Вы убрали директиву не означает, что убрали ошибки. Они как были так и остались. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 18:50 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
The_Prist13-й квартал, Коллекция CommandBars относится к Application.Да. Есть свойство Get с именем CommandBars имеющее тип CommandBars. (Совпадение имён сбивает с толку, не правда ли?): Код: plaintext 1. 2.
The_PristА отношение это прописано в библиотеке "Microsoft Office XX.0 Object Library".Нет. Отношение это прописано в той же библиотеке типов, где описан Application - в library Access. Тип CommandBars описан в library Office, на которую ссылается (импортирует) библиотека Access, чтобы её мог скомпилировать midl: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Но (полная) информация о типах, описанных в импортируемых библиотеках, в компилируемую библиотеку не попадает (иначе творился бы бардак).The_PristЕсли она подключена - то запись CommandBars.Add будет работать и VBA по умолчанию припишет CommandBars к Application, как прописано в типах(как using в C). Но если убрать ссылку на библиотеку "Microsoft Office XX.0 Object Library", то коллекция CommandBars ни к кому не будет отнесена и VBA сочтет её необъявленной процедурой или переменной. И если установлена директива Option Explicit - VBA честно об этом ошибкой и скажет. Если не установлена вышеупомянутая директива - то при попытке создать новую панель получим ошибку отсутствия метода для объекта.Неправильные предпосылки, неправильные выводы. Про то, как свойство get CommandBars попадёт в глобальное пространство имён - см. мой пост выше про appobject. CommandBars.Add вызовется вне зависимости от подключения ссылки на офисную библиотеку в VBA-проекте, вопрос только в связывании - раннем (подключена) или позднем (не подключена). ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 19:01 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Павел Жданов, Если "заработало" без Option Explicit - где-то осталась ошибка. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 19:02 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
13-й кварталНеправильные предпосылки, неправильные выводы. https://msdn.microsoft.com/en-us/library/office/ff821379.aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 19:06 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
"Если "заработало" без Option Explicit - где-то осталась ошибка" Вот вы оптимисты ! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 19:22 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Павел ЖдановВот вы оптимисты !Мы реалисты ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 19:27 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
The_Prist https://msdn.microsoft.com/en-us/library/office/ff821379.aspx И? Информация по этой ссылке (и дальше) никак не противоречит написанному мной. Это высокоуровневое описание. Я толкую про то, что происходит уровнем ниже. Или вы воспринимаете слово "once" в фразе Application.CommandBars Property (Access)Once you establish a reference to the CommandBars collection object, you can access all the properties and methods of the object.как признак исключительности - "только так, и никак иначе"? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 23:02 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
13-й квартал, Не надо за меня додумывать, как я воспринимаю once. Написанному мной моя ссылка так же не противоречит. Моя ссылка была дана с одной целью: MSDN утверждает, что CommandBars является свойством Application. И если Application не указывать - будьте добры поставить ссылку, чтобы VBA знал откуда черпать свойство CommandBars(и её методы и свойства) и что в результате выдавать. Чтобы у него(VBA) не было двояких толкований и соблазнов(все же офис он такой - может взять не то, что хотим мы, если явно ему не указать). А в некоторых версиях офиса бывают глюки и похлеще. И Microsoft отмалчивается. Я пытаюсь описать простыми словами человеку, что если поставить Application, то проблема вероятно исчезнет. Я уже с этим сталкивался в 2007 офисе и разбирал подобную историю. И никаких лишних .tlb мне не потребовалось таскать с проектом. Вы вот уверены, что для всех версий офиса нигде ничего не заглючивает(особенно в 2007) и все ссылки именно как Вы расписали красиво раскладываются и Application нафиг не нужная приблуда в кодах? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2015, 23:53 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
The_PristМоя ссылка была дана с одной целью: MSDN утверждает, что CommandBars является свойством Application.И IDL-овский текст (приведённый мной) это доказывает. И CallByName (обёртка над IDispatch::Invoke) тоже. MSDN описывает факт. MSDN НЕ говорит о том, что доступ к методам и свойствам дуального (dual) интерфейса возможен исключительно при наличии библиотеки типов (где б тогда были скриптовые языки?).The_PristИ если Application не указывать - будьте добры поставить ссылку, чтобы VBA знал откуда черпать свойство CommandBars(и её методы и свойства) и что в результате выдавать.Третий раз говорю про appobject . Объект Application любого VBA-хоста (купите VBA SDK, и будет у вас свой Notepad с блэкджеком и VBA) имеет этот атрибут, и его методы и свойства попадают в global namespace проекта VBA.The_PristЧтобы у него(VBA) не было двояких толкований и соблазнов(все же офис он такой - может взять не то, что хотим мы, если явно ему не указать).Соблазны-это к живым существам. Пространство для множественного толкования возникает в случае, когда в контексте применения какого-либо символа (имени) таких символов (имён) в текущей области видимости (scope) несколько. Типичная неоднозначность такого рода: Dim rs As Recordset при подключенных библиотеках DAO и ADODB, поскольку тип Recordset есть в обоих. Да, наверное плохо, что нет никакого предупреждения при компиляции. Да, совсем плохо, что анализом исходного кода VBA-проекта невозможно установить приоритет ссылок на библиотеки типов. Вместе с тем, дисциплина разруливания конфликтов имён известна: от inner scope к outer scope для имён, определённых в исходном коде, в порядке подключения (приоритета) библиотек типов для имён из них. Эту дисциплину надо знать и учитывать. Либо же, переходя к рекомендация ставить Application, квалифицировать имена. Рекомендация ставить Application плоха тем, что неполна: если можно "сломать" CommandBars, то можно "сломать" и Application. "Сломать" полную квалификацию (например, Access.Application.CommanBars) уже сложнее, но на форуме периодически попадаются сообщения, в которых люди пытаются это сделать, называя модули теми же именами, что подключенные библиотеки типов.The_PristА в некоторых версиях офиса бывают глюки и похлеще.Глюки бывают везде. На то и глюки (если это глюки, а не by design), чтобы программист не дремал.The_PristИ Microsoft отмалчивается.Заговор, определённо.The_PristЯ пытаюсь описать простыми словами человеку, что если поставить Application, то проблема вероятно исчезнет.Не исчезнет. Другая у него проблема. Он достаточно нормально, на самом деле, описал. Вы же увидели призрак проблемы, с которой вам приходилось сталкиваться, и погнались за ним.The_PristИ никаких лишних .tlb мне не потребовалось таскать с проектом..tlb ему нужна на машине разработчика (с 2010-м), причём, если всё так, как он говорит, от 2007-го, и её не надо таскать на клиентские машины (Reference должен обновиться при переносе на локально зарегистрированную библиотеку типов; впрочем, это лучше проверить). И нужна она ему только (по большому счёту) по причине использования событий классов, в ней описанных. The_PristВы вот уверены, что для всех версий офиса нигде ничего не заглючивает(особенно в 2007) и все ссылки именно как Вы расписали красиво раскладываются и Application нафиг не нужная приблуда в кодах?Пожалуй, уже ответил выше. Конкретные случаи надо конкретно разбирать, мистические же глюки очень редки, объяснение обычно находится (в рамках описанного). ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2015, 13:20 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Павел ЖдановВот, можете поэкспериментировать. Создаётся меню с одной кнопкой - "Kassets". По клику на ней появляется окно "Clic on Menu". Павел, cделайте так: 1. При отладке кода лучше использовать reference на установленный на машине Microsoft Office XX.0 Object Library 2. Вместо используемых констант, начинающихся с mso записать свои аналогичные (стать на mso-константу в коде, нажать Shift-F2, скопировать Const mso... = ..., вставить в свой код) Const msoBarTop = 1& Const msoBarNoMove = 4& Const msoControlButton = 1& Const msoButtonCaption = 2& 3. После завершения отладки отключить reference Microsoft Office XX.0 Object Library и в коде закомментировать: 'As CommandBar 'As CommandBarPopup 'As CommandBarButton и т.п. типы, которые определены в отключенной библиотеке. То есть переменные теперь станут As Variant (для педантов можно было бы и As Object) Тогда Ваш код станет таким и заработает в т.ч. и с Option Explicit: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39.
Ну, и Application перед CommandBars необязателен ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2015, 01:35 |
|
Референс Офиса
|
|||
---|---|---|---|
#18+
Павел ЖдановОсталось заменить чем-то Office.FileDialog Поступить аналогично. Вот в этом примере Application.FileDialog Property (Access) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2015, 02:01 |
|
|
start [/forum/topic.php?all=1&fid=60&tid=2155947]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
others: | 9ms |
total: | 146ms |
0 / 0 |