Vba створення меню

Тихвинський Віталій
VBA Створення меню

Усередині додатків Word і Excel існує три типи меню:
  • Головне меню - меню, яке виводиться за замовчуванням вгорі вікна програми, вище всіх інших меню.
  • Контекстне меню - меню, яке з'являється при натисканні правої клавіші миші на будь-якому об'єкті (зокрема на документі Word або книги Excel).
  • Панель інструментів - меню, яке можна включити і вимкнути через стандартні пункти головного меню: Вид-Панель Інструментів.
Найбільш часто програміст VBA працює з головним і контекстним меню. І в даному посібнику ми розглянемо роботу саме з цими типами меню додатків.

Звернення до меню відбувається через об'єкти CommandBars і ActiveMenuBar. Нижче наведені приклади звернення до властивості Index меню з ім'ям "text" і до головного активному меню програми:

Меню можна створити методом add об'єкта CommandBars.
Нижче наведено два приклади створення головного та контекстного меню:
Примітка:
Контекстне і головне меню створене користувачем існує поки не закрита додаток, після закриття якого, контекстне та головне меню видаляється з нього.

Головне меню користувача можна вивести через властивість Visible, а контекстне меню через метод ShowPopup. Якщо користувач створив головне меню і вивів його, то воно замінює стандартне меню програми і існує поки програма не закрили, або поки це меню не видалили.

Приклад: В даному прикладі показано як вивести контекстне і головне меню програми.

Меню користувача можна видалити через властивість Delete. Через властивість Reset можна очистити меню користувача або меню програми від доданих пунктів.

приклад:

Пункт в меню додається методом Add об'єкта Controls, який є нащадком об'єктів CommandBars і ActiveMenuBar.

Приклад: В даному прикладі додається додатковий пункт меню першого рівня. Вхідний не обов'язково параметр Type методу Add використовується для установки відповідного типу додається підпункту меню. Найбільш часто вживані значення цієї властивості: msoControlButton - підпункт меню не містить в собі інших підпунктів, msoControlPopup - підпункт меню має триваючий список підпунктів наступного рівня. Якщо не обов'язковий, вхідний параметр ID методу Add має значення 850, то додається пункт меню стає виділеним. Після створення пункту меню задаються його властивості, про які розказано нами в главі Властивості і методи пункту меню.
Нижче наведені процедури, призначені для додавання пунктів меню: Дані процедури необхідно створити в модулі загальних підпрограм, того проекту, звідки будуть додаватися пункти.
Для безпосереднього додавання пунктів в меню використовуються підпрограми ДобавітьПункти, ДобавітьПункти2.
Нижче приведена інструкція по вхідних параметрів даних процедур:
  1. Необхідно задати ім'я меню. Якщо параметр ІмяМеню процедури додає пункти має значення порожнього рядка, то пункти додаються до головного меню програми.
    Імена стандартних контекстних меню програми Word наступні:
    • "Text" -контекстное меню на виділеному тексті
    • "Curve" - ​​контекстне меню на виділених лініях
    • "Shapes" - контекстне меню на виділених автофігура
  2. Необхідно ввести імена подій в строковому форматі через кому.
  3. Ім'я події не повинно містити пропусків і символу .
  4. Якщо потрібно записати і ім'я події пункту меню, і підпис пункту меню їх розділяють крапкою з комою.
  5. Якщо у введеному імені події містяться прогалини і символ , То ці символи автоматично видаляються з імені події, і якщо не вказана підпис пункту меню, то в підпис пункту меню передається ім'я події з забороненими символами.
  6. Перед ім'ям події пункту меню можна ввести цифри, які зададуть код піктограми пункту меню (див. Коди піктограм пунктів меню). Але пункт меню, який має підпункти, не може мати піктограми.
  7. Перед ім'ям події пункту меню і перед цифрами задають піктограму пункту меню можна ввести символ підкреслення "_", або символ мінус "-", при цьому пункт меню буде відділений від інших пунктів розділової лінією.
  8. Якщо необхідно підкреслити букву підписи, перед нею ставлять символ
  9. Якщо необхідно позначити пункт меню то підпис пункту меню повинна закінчуватися пробілом (пункт меню, який має підпункти, не може бути виділений).
  10. У вхідних параметрах ПунктиМеню можуть бути підпункти, які відділяються від основного пункту меню коми.
  11. Процедурою ДобавітьПункти можна додати кілька пунктів першого рівня, і підпункти до них. Процедурою ДобавітьПункти2 можна додати тільки один пункт першого рівня (за один запуск даної процедури), але до цього пункту можна додати підпункти як другого, так і третього рівня.
  12. Перед додаванням пунктів меню необхідно створити всередині проекту, з якого додаються пункти меню, модуль загальних підпрограм, який буде містити в собі процедури, імена яких збігаються з іменами подій пунктів меню (для пунктів меню, які мають підпункти, їх задавати не потрібно, так як процедури ДобавітьПункти не ставлять відповідні властивість OnAction для даних пунктів меню. см. Властивості і методи пунктів меню).

    приклад:



Мал. 1 Останні додані пункти в контекстне меню "Text"


Примітка:
Якщо ви хочете додати в меню підпункти четвертого і далі рівня, то вам необхідно доростити пункт меню третього рівня Односеансний контекстним меню (див. Односеансний контекстне меню)

Для обробки пунктів меню застосовуються властивості і методи об'єкта Controls. Для видалення пункту меню метод Delete, для приховування та відображення пункту меню іcпользуют властивість Visible, для заборони і дозволу пунктів меню властивість - Enabled. Для створення розділової лінії перед пунктом меню властивість - BeginGroup. Властивість Visible, Enabled і BeginGroup мають значення відповідно True якщо меню видно і активно і відокремлено від інших пунктів розділової лінією, і False якщо меню приватно і не активно і не має розділової лінії. Для пунктів меню, які не мають підпунктів, через властивість FaceId можна задати код піктограми меню (див. Коди піктограм пунктів меню).
Якщо пункт меню не має підпунктів, то з цим пунктом можна задати властивість Controls.ShortcutText, яке виводить праворуч від підпису пункту текст, який повідомляє про те, комбінація яких керуючих клавіш призначена для даного пункту меню (див. Призначення керуючих клавіш до пункту меню).
Через властивість OnAction можна задати ім'я процедури, яка не має вхідних параметрів. Дана процедура буде спрацьовувати при кліці лівою клавішею миші по відповідному пункту меню.
Якщо пункт меню прихований, але властивість пункту меню BeginGroup має значення True, то розділова лінія прихованого пункту меню видно над подальшим, за ним пунктами.
Можна видаляти і приховувати пункти, починаючи з першого рівня, при видаленні і приховуванні верхнього рівня, все підпункти меню розташовані в удаляемом пункті видаляються і ховаються разом з ним.
У вхідному параметрі об'єкту Controls записується або підпис пункту меню, або його індекс.
Підпрограми ДобавітьПункти (див. Додавання пунктів меню) додають по два пункти меню (Не позначений пункт меню, і однотипний йому - позначений). Причому в меню видно тільки один з вищевказаних пунктів. Чи не позначений пункт меню має підпис без пробілу в кінці, а позначений не має прогалину, завершальний підпис (на стандартні пункти меню це правило не поширюється).

приклад:

У пункті меню, який не має підпунктів, можна встановити перемикач.
Підпрограми ДобавітьПункти (див. Додавання пунктів меню) додають по два пункти меню (Не позначений пункт меню, і однотипний йому - позначений). Причому в меню видно тільки один з вищевказаних пунктів. Чи не позначений пункт меню має підпис без пробілу в кінці, а позначений не має прогалину, завершальний підпис. Тому, необхідно міняти в подієвої процедурі цих пунктів меню властивість Visible на зворотне: Якщо перемикач активний, то властивість меню Visible відповідного пункту має значення True: Примітка:
Все вище сказане справедливо тільки для перемикачів, які були додані процедурами ДобавітьПункти. Стандартні пункти меню, які мають перемикачі, побудовані за іншим принципом.

Для того, що б дізнатися коди піктограм пунктів меню, необхідно створити наведені нижче процедури. І запустити процедуру FaceIdPicture. Для продовження виведення піктограм необхідно натиснути клавішу Enter, щоб завершити - необхідно вибрати пункт контекстного меню "Вихід":

Можна створити Односеансний контекстне меню. Таке меню найзручніше всередині програми Excel. Оскільки в даному додатку лист Excel має подія, яке відловлює натискання правої клавіші миші на ньому. Що дозволяє заблокувати висновок стандартного контекстного меню, і вивести замість нього своє. На жаль, документ Word не має такої події, і в додатку Word можливо тільки додавання пунктів в стандартні контекстні меню. Тому в додатку Word функцію СоздатьКонтекстноеМеню можна запускати тільки як процедуру, для продовження підпунктів меню третього рівня (Про що розказано в кінці цього розділу).
Для того, що б заблокувати контекстне меню на аркуші Excel необхідно в модулі відповідного листа, в подієвої процедурі BeforeRightClick встановити значення вхідного параметра Cansel на True. Через властивості Column і Row об'єкта Target можна заблокувати висновок стандартного контекстного меню в певній галузі листа.

Приклад: В даному прикладі заблоковано стандартне контекстне меню до другого стовпчика і четвертого рядка включно.
Для створення контекстного меню необхідно в модулі загальних підпрограм проекту створити функцію: У тому ж модулі необхідно мати процедуру ДанниеМеню, яка нами описана в розділі Додавання пунктів в меню. У тій же главі розказано про вхідному параметрі ПунктиМеню процедури ДобавітьПункти. Цей параметр відповідає параметру ПунктиМеню функції СоздатьКонтекстноеМеню. Перемикати в пункті Односеансний контекстного меню будується не так, як перемикач створений процедурами ДобавітьПункти.

Приклад: В даному прикладі створюється на аркуші Excel контекстне меню з перемикається пунктом.
Функцію СоздатьКонтекстноеМеню можна запускати і як процедуру, наприклад, для продовження підпунктів другого рівня, безпосередньо з подієвих процедур пунктів меню другого рівня (в додатку Word цю функцію потрібно запускати з підпунктів меню третього рівня).

Приклад: В даному прикладі після натискання правою клавішею миші на відповідному аркуші і після вибору відповідних пунктів меню, контекстне меню набуде вигляду:


Р ис 2. Контекстне меню користувача після вибору пункту ПервийУровень

Р ис 3. Контекстне меню користувача після вибору пункту ВторойУровень1

Оскільки пункт меню через властивість OnAction може бути пов'язаний з процедурою не має вхідних параметрів, а процедура без вхідних параметрів в VBA для Word і Excel є макросом, то призначення клавіш для відповідних макросів, відповідає призначенню керуючих клавіш для пунктів меню, які закріплені за ними.
Клавіші для макросів можуть бути призначені через меню програми і програмно.

У програмі Word керуючі клавіші призначаються наступним чином:
  1. Увійти в меню: Вид-Панель Інструментів-Налаштування
  2. У вікні "Налаштування" вибрати закладку "Команди" і кнопку "Клавіатура ..." см. Р ис 4.


Мал. 5 Призначення клавіш в Word


У програмі Excel керуючі клавіші призначаються наступним чином:

  1. Увійти в меню: Сервіс-Макрос-Макроси
  2. У вікні вибрати потрібного імені макросу і натиснути кнопку "Параметри ..." Р ис 6.
  • У появішемся вікні в перейти в розділ "поєднання клавіш" см. Рис 7.
  • У розділі "поєднання клавіш" в режимі погашенням Caps Loock (великі літери) ввести латинську букву в поєднанні з клавішею Shift або без неї, і натиснути кнопку ОК см. Рис 7.

  • Мал. 7 вікно призначення клавіш макросу в Excel.


    Примітка:
    Через меню програми Excel можна призначити поєднання клавіш тільки в комбінації з клавішею CTRL або CTRL + SHIFT, але програмно в цьому додатку можна ввести і інші комбінації клавіш.

    У додатку Excel програмно можна призначити клавіші макросу через метод OnKey об'єкта Application. Метод OnKey має два вхідних параметра Key - для призначення комбінацій клавіш, і Procedure - для введення імені макросу, якому призначаються керуючі клавіші (перед ім'ям макросу може бути ім'я однієї з завантажених книг Excel в якій макрос знаходиться см. Приклад нижче. Ім'я книги загальних макросів - "PERSONAL.XLS"). Якщо параметр Procedure опущений, то зазначена комбінація клавіш знімається з макросу, на який вона була встановлена. Якщо параметр Procedure має значення порожнього рядка, то зазначена комбінація клавіш блокується в Excel. Комбінація клавіш задається в строковому форматі, клавіші в рядку кодуються так:

    В даному прикладі призначаються керуючі клавіші Alt + 1 макросу пункт1, і клавіші Ctrl + Shift + A макросу пунктa знаходиться в Excel файлі з ім'ям "Моя книга". І знімається зарезервована комбінація клавіш CTRL + Shift + B з макросу проекту.
    У додатку Word керуючі клавіші макросу призначаються через метод Add об'єкта KeyBindings, і видаляються через метод Disable об'єкта FindKey. У методі Add об'єкта KeyBindings є вхідний параметр KeyCode, який визначає комбінацію клавіш, і вхідний параметр Command, який задає ім'я макросу. Функція BuildKeyCode призначена для завдання коду керуючих клавіш вхідному параметру KeyCode. Функція BuildKeyCode може мати від одного, до 4 вхідних аргументів, які задаються відповідними константами: Через властивість CustomizationContext можна встановити тип документа, в який додається, або в якому видаляється комбінація клавіш.

    приклад:

    Прімеченіе радактора