powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Референс Офиса
11 сообщений из 36, страница 2 из 2
Референс Офиса
    #38952974
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ЖдановОшибка вылезала из-за вот этого - "Option Explicit"Эх...А вот она очень даже полезная. То, что Вы убрали директиву не означает, что убрали ошибки. Они как были так и остались.
...
Рейтинг: 0 / 0
Референс Офиса
    #38952981
The_Prist13-й квартал,

Коллекция CommandBars относится к Application.Да. Есть свойство Get с именем CommandBars имеющее тип CommandBars. (Совпадение имён сбивает с толку, не правда ли?):
Код: plaintext
1.
2.
        [id(0x0000087e), propget, helpcontext(0x000010cf)]
        HRESULT CommandBars([out, retval] CommandBars** pRet);

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.
// typelib filename: MSACC.OLB

[
  uuid(4AFFC9A0-5F99-101B-AF4E-00AA003F0F07),
  version(9.0),
  helpstring("Microsoft Access 11.0 Object Library"),
  helpfile("vbaac10.chm"),
  helpcontext(00000000)
]
library Access
{
    ...
    // TLib : Microsoft Office 11.0 Object Library : {2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}
    importlib("MSO11.tlb");
    ...
};

Но (полная) информация о типах, описанных в импортируемых библиотеках, в компилируемую библиотеку не попадает (иначе творился бы бардак).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-проекте, вопрос только в связывании - раннем (подключена) или позднем (не подключена).
...
Рейтинг: 0 / 0
Референс Офиса
    #38952983
Павел Жданов,

Если "заработало" без Option Explicit - где-то осталась ошибка.
...
Рейтинг: 0 / 0
Референс Офиса
    #38952987
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13-й кварталНеправильные предпосылки, неправильные выводы.
https://msdn.microsoft.com/en-us/library/office/ff821379.aspx
...
Рейтинг: 0 / 0
Референс Офиса
    #38953002
"Если "заработало" без Option Explicit - где-то осталась ошибка"

Вот вы оптимисты ! :)
...
Рейтинг: 0 / 0
Референс Офиса
    #38953008
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ЖдановВот вы оптимисты !Мы реалисты
...
Рейтинг: 0 / 0
Референс Офиса
    #38953114
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.как признак исключительности - "только так, и никак иначе"?
...
Рейтинг: 0 / 0
Референс Офиса
    #38953128
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13-й квартал,

Не надо за меня додумывать, как я воспринимаю once. Написанному мной моя ссылка так же не противоречит.
Моя ссылка была дана с одной целью: MSDN утверждает, что CommandBars является свойством Application. И если Application не указывать - будьте добры поставить ссылку, чтобы VBA знал откуда черпать свойство CommandBars(и её методы и свойства) и что в результате выдавать. Чтобы у него(VBA) не было двояких толкований и соблазнов(все же офис он такой - может взять не то, что хотим мы, если явно ему не указать). А в некоторых версиях офиса бывают глюки и похлеще. И Microsoft отмалчивается.

Я пытаюсь описать простыми словами человеку, что если поставить Application, то проблема вероятно исчезнет. Я уже с этим сталкивался в 2007 офисе и разбирал подобную историю. И никаких лишних .tlb мне не потребовалось таскать с проектом.

Вы вот уверены, что для всех версий офиса нигде ничего не заглючивает(особенно в 2007) и все ссылки именно как Вы расписали красиво раскладываются и Application нафиг не нужная приблуда в кодах?
...
Рейтинг: 0 / 0
Референс Офиса
    #38953501
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 нафиг не нужная приблуда в кодах?Пожалуй, уже ответил выше. Конкретные случаи надо конкретно разбирать, мистические же глюки очень редки, объяснение обычно находится (в рамках описанного).
...
Рейтинг: 0 / 0
Референс Офиса
    #38955540
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ЖдановВот, можете поэкспериментировать. Создаётся меню с одной кнопкой - "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.
Option Explicit

Function Start()
  
  Const msoBarTop = 1&
  Const msoBarNoMove = 4&
  Const msoControlButton = 1&
  Const msoButtonCaption = 2&

  Dim MyMenuBar As Object 'As CommandBar
  Dim Ctr_Pop As Object 'As CommandBarPopup
  Dim Ctr_Pop_but As Object 'As CommandBarButton

  Set MyMenuBar = CommandBars.Add(Name:="MyMenu", Position:=msoBarTop, MenuBar:=True, Temporary:=True)
  MyMenuBar.Visible = True
  MyMenuBar.Protection = msoBarNoMove
  Set Ctr_Pop_but = MyMenuBar.Controls.Add(msoControlButton)
  With Ctr_Pop_but
    .Style = msoButtonCaption
    .Caption = "Kassets"
    .TooltipText = "Help text"
    .FaceId = 202
    .OnAction = "=Fnd()"
    .Parameter = "kass"
    .BeginGroup = True
  End With
End Function

Function Fnd()
  Dim MyMenu 'As CommandBar
  Dim pr As String
  '------------------------------------
  Set MyMenu = CommandBars("MyMenu")
  pr = CommandBars.ActionControl.Parameter
  Select Case pr
    Case Is = "kass"
      MsgBox "Click on Menu"
  End Select
End Function


Ну, и Application перед CommandBars необязателен ;)
...
Рейтинг: 0 / 0
Референс Офиса
    #38955544
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ЖдановОсталось заменить чем-то Office.FileDialog
Поступить аналогично. Вот в этом примере Application.FileDialog Property (Access)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub cmdFileDialog_Click()

  Const msoFileDialogFilePicker = 3&  ' <--Добавлено!

  ' Requires reference to Microsoft Office 11.0 Object Library. ' <-- Ссылка уже не требуется!

  Dim fDialog  'As Office.FileDialog '<-- можно и As Object
  Dim varFile  As Variant

  '  ... и дальше код без изменений ..

End Sub
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Референс Офиса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]