Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
9 / 9 / 0
Регистрация: 08.04.2021
Сообщений: 297

Горячая клавиша на макрос в надстройке

29.05.2025, 19:13. Показов 1356. Ответов 5

Студворк — интернет-сервис помощи студентам
Здравствуйте.
1.Описание проблемы: Не работает вторая горячая клавиша для макроса надстройки. (Первая работает).

2.Мои действия:
2.1.Назначил двум макросам хоткеи в модуле рабочей книги:

Visual Basic
1
2
3
4
5
6
Option Explicit
 
Public Sub Workbook_Open()
    Application.OnKey "{RIGHT}", "ОткрытьПапкуДинамика"   ' Перехват клавиши  RIGHT - ВПРАВО.
    Application.OnKey "{UP}", "Test"   ' Перехват клавиши  UP - ВВЕРХ.
End Sub
2.2. Оба макроса разместил в стандартных модулях:
Первый: m1_ОткрытьПапкуДинамика
Visual Basic
1
2
3
4
5
Sub ОткрытьПапкуДинамика()
    Dim myFolder As String
    myFolder = "C:\Users\Ooos\Desktop\Динамика"
    Shell "explorer.exe """ & myFolder & """", vbNormalFocus
End Sub
Второй: Module1
Visual Basic
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Option Explicit  
Dim gRibbon         As IRibbonUI
 
Sub Test(control As IRibbonControl)
 
    Dim dokumentov  As Long
 
    With ActiveSheet.Range("H1")
        .Formula = "=SUMIFS(C2:C50000, F2:F50000, TODAY())"
        .Value = .Value
    End With
 
    dokumentov = ActiveSheet.Range("H1")
 
    If Not gRibbon Is Nothing Then
        gRibbon.InvalidateControl "Бокс_1"
    End If
    
    If Not gRibbon Is Nothing Then
        gRibbon.InvalidateControl "Бокс_2"
    End If
    
     If Not gRibbon Is Nothing Then
        gRibbon.InvalidateControl "Бокс_3"
    End If
     
    MsgBox "Сработала процедура, заданная в onAction элемента " & control.ID
End Sub
 
Sub CallTest(control As IRibbonControl)
    Call Test(control)
End Sub
 
Sub dokumentov(editBox As IRibbonControl, ByRef text)
    Dim dokumentov  As Long
    dokumentov = ActiveSheet.Range("H1")
    text = "   " & dokumentov
End Sub
 
Sub RibbonLoaded(ribbon As IRibbonUI)
    Set gRibbon = ribbon
End Sub
 
Sub Segodnja(editBox As IRibbonControl, ByRef text)
    Dim dtToday As Date
        dtToday = Now
    text = "   " & Format(dtToday, "dd mmmm yyyy г.")
End Sub
 
Sub Summa(editBox As IRibbonControl, ByRef text)
    Dim Summa  As Long
    Summa = ActiveSheet.Range("I1")
    text = "   " & Format(Summa, "0.00" & " руб")
End Sub
 
Sub CallОткрытьПапкуДинамика(control As IRibbonControl)
    Dim myFolder As String
    myFolder = "C:\Users\Ooos\Desktop\Динамика"
    Shell "explorer.exe """ & myFolder & """", vbNormalFocus
End Sub

Важно: Первый Sub ОткрытьПапкуДинамика() не привязан к интерфейсу надстройки на уровне XML-кода, Второй Sub Test(control As IRibbonControl) - привязан.

Ribbon XML:
XML
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
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="RibbonLoaded">
    <ribbon startFromScratch="false">
        <tabs>
            <tab id="Сборка" label="Валидация ПД">
            
                <group id="groupe_1" >              
                        <button idMso="VisualBasic" label="Редактор"  size="large" />                     
                </group>
                    <group id="groupe_2" >
                        <button id="change_cell" size="large" image="лалала32" label="Старт валидации" onAction="CallTest"/>
                    </group>    
                        <group id="groupe_3" label="Результаты">             
                        <editBox id="Бокс_1"  
                                 label="Валидировано документов сегодня:" 
                                 getText="dokumentov" /> 
                         <editBox id="Бокс_3"   
                                 label="Сумма" 
                                 sizeString="WWWWWWWWWWW"
                                 getText="Summa" />
                        </group>                                 
                    <group id="groupe_4" label="Динамика">             
                         <button id="ФайлДинамика" size="large" image="xls"  label="Открыть файл " screentip="Динамика_2025" />
                         
                         <button id="ПапкаДинамика" size="large" image="Папка_14115"  label="Открыть папку" onAction="CallОткрытьПапкуДинамика"/>
                    </group> 
                    <group id="Data" label="Дата начала валидации ПД 20.05.2025" >
                        <editBox id="Бокс_2"  
                                 label="Сегодня"
                                 sizeString="WWWWWWWW" 
                                 getText="Segodnja" />                               
                    </group>                                    
            </tab>
        </tabs>
    </ribbon>   
</customUI>

Вопрос: Каким образом назначить горячую клавишу макросу надстройки Sub Test(control As IRibbonControl) связанному кодом HML?

Приложение: Файл .xlsx + файл надстройки .xlam

Desktop.rar
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.05.2025, 19:13
Ответы с готовыми решениями:

Горячая клавиша в надстроке
Всем, Здравствуйте! Помогите разобраться. Почему в макросе не срабатывает горячая клавиша...

RowSource в надстройке Excel тупит (ListBox.RowSource = 'Sheet!A1:B100')
Ничего не понимаю! Пишу надстройку для Excel-я, при вызове одной из форм настраиваю листбокс путем...

Как сделать так, чтобы в каждой надстройке вызывалась своя форма?
Имеются две надстройки, в каждой есть форма About. Если в любой из них вызвать на показ эту форму...

5
9 / 9 / 0
Регистрация: 08.04.2021
Сообщений: 297
30.05.2025, 12:09  [ТС]
UPD: В ситуации острой необходимости "Запуска макроса надстройки клавишей" вынужден использовать смешной, но железно работающий "костыль":
В модуле рабочей книги:
Visual Basic
1
2
3
4
5
Option Explicit 
Public Sub Workbook_Open()
    Application.OnKey "{RIGHT}", "ОткрытьПапкуДинамика"   ' Перехват клавиши  RIGHT - ВПРАВО.
    Application.OnKey "{UP}", "КликНаКнопкуСтарт"   ' Перехват клавиши  UP - ВВЕРХ.
End Sub
В стандартном модуле:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Option Explicit
Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
 
Sub КликНаКнопкуСтарт()
    SetCursorPos 500, 100  ' координаты центра кнопки "Старт валидации" на ленте надстройки относительно экрана.
               mouse_event &H2, 0, 0, 0, 0
               Sleep (300)
               mouse_event &H4, 0, 0, 0, 0
End Sub

Однако коллегам такое решение предлагать как-то не комильфо, воздержусь.
Понимаю, что вопрос нормального кода Запуска клавишей макроса надстройки связанного кодом HML специфический, но как бы базовый и принципиальный, а потому надеюсь на помощь форумчан..
0
ᴁ ©
Эксперт MS Access
 Аватар для АЕ
4136 / 2430 / 503
Регистрация: 13.12.2016
Сообщений: 8,271
Записей в блоге: 5
30.05.2025, 13:44
ooos, посмотрите в сторону риббон. возможно он спасет. Во всяком случае я использую. Не клавиша конечно, но можно выбрать из меню. Еще вариант прицепить в контекстное меню. Ну а самый быстрый способ назначить на панели быстрого доступа.
Миниатюры
Горячая клавиша на макрос в надстройке  
1
9 / 9 / 0
Регистрация: 08.04.2021
Сообщений: 297
30.05.2025, 17:41  [ТС]
Уважаемый АЕ, спасибо за ценные идеи по данному вопросу (а так же за сегодняшнее решение Настройка расположения диалогового окна Application.InputBox).
Буду копать риббон, ибо он не только полезный в плане придания завершенности проекту из набора десятков макросов путём создания интерфейса, то бишь ленты надстройки , но и весьма интересный сам по себе, имхо.
PS: А перед этим было бы неплохо разобраться с причиной появления проблемы со стороны VBA, а именно ошибки "Argument Not Optional", возникающей, когда функция или процедура вызывается без необходимых аргументов.
Отработать 3 причины возникновения и 3 метода исправления. Возможно, решение не так далеко находится (или нет).
0
2041 / 473 / 131
Регистрация: 13.11.2008
Сообщений: 902
30.05.2025, 19:19
Лучший ответ Сообщение было отмечено ooos как решение

Решение

Цитата Сообщение от ooos Посмотреть сообщение
было бы неплохо разобраться с причиной появления проблемы со стороны VBA, а именно ошибки "Argument Not Optional"
там нечего разбираться - процедура Test является процедурой обратного вызова, имеющий обязательный аргумент - control. При вызове через гор.клавиши методом OnKey Вы этот аргумент не передаете. Вот и получаете ошибку.
У Вас есть процедура CallTest - чуть измените её и вызывайте на здоровье хоть гор.клавишами, хоть как-то иначе:
Visual Basic
1
2
3
Sub CallTest()
    Call Test(Nothing)
End Sub
А на открытие книги соответственно:
Visual Basic
1
2
3
4
5
6
Public Sub Workbook_Open()
 
    Application.OnKey "{RIGHT}", "ОткрытьПапкуДинамика"   ' Назначаю перехват клавиши  RIGHT - ВПРАВО.
    Application.OnKey "{UP}", "CallTest"   ' Назначаю перехват клавиши  UP - ВВЕРХ.
 
End Sub
Только вот из процедуры Test придется убрать одну строку:
Visual Basic
1
MsgBox "Сработала процедура, заданная в onAction элемента " & control.ID
Но я так понимаю она все равно не нужна.
1
9 / 9 / 0
Регистрация: 08.04.2021
Сообщений: 297
31.05.2025, 11:02  [ТС]
Уважаемый The_Prist, Дмитрий Валентинович, я знал кто сможет помочь мне, ждал и надеялся )
Безмерно рад и премного благодарен Вам за решение важного для меня вопроса!
Донат отправлен
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.05.2025, 11:02
Помогаю со студенческими работами здесь

Как определить, форма запущено или нет в .xla надстройке?
Эст “Pipes.xla” надстройка. Из рабочей книги вызываются разные функции и формы из этой надстройки....

Обращение к справочнику в надстройке
Добрый день. Подскажите плз как обратиться к данным хранящимся в файле надстройки. Когда прописываю...

Как убрать HTML из строк в надстройке
Как убрать HTML из строк в надстройке Здравствуйте все. У меня есть надстройка, которая...

К пользовательской функции добавляется полный путь к надстройке в ячейке
Возникла такая проблема. У меня есть некая надстройка, где расположены пользовательские функции....

Как программно задать горячие клавиши на макрос?
Существует собственная книга макросов. Необходимо подвесить на один из макросов &quot;Hot Key&quot; Вот есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru