Страницы: 1
RSS
Как сделать так, чтобы макрос работал и с хоткейа, и с кнопки на ленте, добавленной в XML?
 
Доброй ночи!
У меня была надстройка, в ней макрос, который через Application.OnKey был прикреплен к клавишам Ctrl+F9.
Он выводил адрес выделенного диапазона.
Недавно я начал изучать редактирование ленты через XML.
Я сделал так, чтобы при открытии надстройки добавлялась новая вкладка, в ней новая кнопка, которая запускала тот самый макрос.
Чтобы кнопка с ленты заработала, я добавил в название макроса, внутрь скобок "control as iRibboncontrol".
Но из-за этого, при нажатии Ctrl+F9.даёт ошибку "Argument not optional".

Чтобы макрос работал и с кнопки на ленте, и с хоткейа Ctrl+F9, я написал макрос, который запускается при нажатии кнопки с ленты и сам ничего такого не делает, а просто запускает мой макрос:
Код
Sub rekvizit_rbc(control As IRibbonControl)
Application.Run "rekvizit"
End Sub

Sub rekvizit()
MsgBox Selection.Address
End Sub
Вопрос: Чтобы макрос работал и с кнопки на ленте, и с хоткейа Ctrl+F9, есть какой-то более простой способ, чем мой?
Может в XML или в VBA можно использовать какое-то свойство, чтобы не писать два макроса?
Короче говоря, можно ли обойти проще, чем писать макросчик на каждую кнопку, на запуск основного макроса?

P.S. Я знаю, что в XML можно задать кнопке на ленте хоткей (через keytip), но это мне не подходит.
P.P.S. В реале макросов больше.
 
на всякий случай прилагаю файл надстройки
 
Не знаю, у меня все работает в приложенном файле.
Попробуйте так записать:
Код
Private Sub Workbook_Open()
Application.OnKey "^{F9}", "'" & ThisWorkbook.Name & "'!rekvizit"
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
извиняюсь, если не смог объяснить правильно.
был макрос, к нему хоткей, макрос назывался rekvizit()
в XML сделал кнопку к этому макросу, но пришлось переименовать макрос на rekvizit(control as iRibbonControl)
теперь макрос не запускается хоткеем, он не запускается даже через окно запуска макросов (Alt+F8), пишет "Argument not optional"
поэтому пришлось кнопку с ленты привязать к новому маленькому макросу, который просто запускает основной макрос, то есть написать ещё один макрос

Вопрос: Можно решить как-то проще? Чтоб не писать второй макрос?

P.S.
Цитата
The_Prist написал:
Попробуйте так
не помогло.

Цитата
The_Prist написал:
Не знаю, у меня все работает в приложенном файле.
потому что, я вложил туда вариант решения проблемы с двумя макросами
 
а другого варианта нет. Только из процедуры обратного вызова ленты вызывать основной макрос. Не понимаю в чем сложность.
Процедура обратного вызова должна получить в качестве параметра кнопку ленты Ribbon, которая спровоцировала вызов этой процедуры. Поэтому через Run не получится это осуществить.

Советую иногда гуглить по получаемым ошибкам и в переводчик вставлять текст. Argument not optional означает, что процедура имеет аргументы, которые должны быть в неё переданы, но Вы их не передаете.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий, спасибо за подробный ответ
 
Цитата
The_Prist написал:
а другого варианта нет.
Коллеги, здравствуйте!

Чтобы карантинные праздники проходили с пользой, захотел пройтись по темам, на которые хронически не хватает времени...
Поэтому, если уже не интересно или найдено решение, то извиняюсь за беспокойство...
Ну, например, вот сейчас, в своем риббоне добавил onLoad="RibbonRun"
Код
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="RibbonRun">
а в коллбэке приказал
Код
' (компонент: ribbon, атрибут: onload), 2010+
Private Sub RibbonRun(ribbon As IRibbonUI)
Application.OnKey "^{F9}", "'" & ThisWorkbook.Name & "'!MakeHeader"
    'Объявите глобальную переменную объекта ленты: Public gobjRibbon As IRibbonUI
    'Set gobjRibbon = ribbon
End Sub
Может я еще чего-то недопонимаю, но мне кажется работает так, как хотелось на постановке задачи, т.е.
макрос запускается и через кнопку на риббоне и через хоткей Ctrl+F9 и решение не обременительное....
Вместо "MakeHeader" напишите свой макрос. И все требуемые хоткеи можно в этой процедуре прописать.

Страницы: 1
Читают тему
Наверх