Користувацькі форми VBA
Userform є дуже важливою частиною програмування у VBA. Це дозволяє вам створити професійний інтерфейс користувача для спілкування з користувачами вашого додатка VBA. Це також дозволяє повністю контролювати користувача у тому, що він робить із вашою книгою.
Звичайно, ви можете використовувати клітинки аркуша для прийняття параметрів від користувача, але форма користувача створює набагато кращий досвід користувача.
Розширивши висоту та ширину вашої форми користувача до розміру вікна Excel, ви зможете зробити вашу програму схожою на звичайну програму Windows, при цьому користувач не знатиме, що він використовує Excel як хост.
Вам доступні всі звичайні елементи керування Windows, такі як випадаючі списки, списки, прапорці. У вас також є величезний спектр методів, подій та властивостей, які слід використовувати для покращення користувацького досвіду.
Важливим моментом є те, що коли ви відображаєте вбудовану або модальну форму користувача, ви не можете редагувати свій код у VBE або отримувати доступ до будь -яких функцій Excel. Лише після закриття форми курсор з’явиться у вашому коді.
Вбудовані форми користувача VBA
Excel VBA як кілька вбудованих форм, які можна використовувати для спілкування з користувачем.
Вікно повідомлень
Це найбільш часто використовувана форма у VBA. Він просто відображає текстове повідомлення, можливо інформуючи користувача про те, що він ввів недійсний ввід або що процес VBA закінчився. У своїй найпростішій формі вони відображають текстовий рядок, але ви також можете додати піктограму, таку як запитання чи знак оклику, і надати вікно повідомлення іншу назву.
Це базовий приклад. Можна натиснути лише одну кнопку, а в рядку заголовка написано "Microsoft Excel"
Код для створення цього дуже простий:
123 | ПідтестMsgBox ()MsgBox "Цей процес завершено"End Sub |
Ви можете використовувати різні параметри для додавання кнопок, значків та зміни рядка заголовка
123456789 | ПідтестMsgBox ()Dim Ret як варіантRet = MsgBox ("Ви впевнені?", VbТак чи vbQuestion, "Моя програма")Якщо Ret = vbТак"Ваш процес тутІнакшеВийти з підпЗакінчити ЯкщоEnd Sub |
Цей код додає кнопки «Так» і «Ні» та значок знака питання та встановлює рядок заголовка. Зауважте, що можна поєднати стилі вікна повідомлення за допомогою оператора "Або"
Крім того, коли ви повертаєте значення з вікна повідомлення, повертається змінна повинна бути визначена як варіант або vbMsgBoxResult, а оператор вікна повідомлення повинен використовувати дужки,
Поле введення
У VBA є дуже просте поле введення, хоча воно досить обмежувальне в тому, що з ним можна робити. Якщо є можливість, краще розробити спеціальну форму користувача
12345 | Sub TestInputBox ()Dim Ret як рядокRet = InputBox ("Будь ласка, введіть своє ім'я", "Введіть ім'я")MsgBox RetEnd Sub |
Ви також можете додати до параметрів значення за замовчуванням.
Отримайте відкрите ім'я файлу
Це дозволяє використовувати діалогове вікно файлу Windows у вашому коді VBA. Користувачеві це виглядає дуже ефектно, коли він працює, але його дуже просто включити, і ви автоматично отримаєте всі можливості діалогу файлів разом з ним.
Код обмежує користувача бачити лише файли Excel. На жаль, вони можуть ввести ім’я файлу, що не є Excel, у поле Ім'я файлу, і натиснути кнопку відкриття, тому вам знадобиться деякий код, щоб переконатися, що файл Excel вибрано.
Використовуйте команду "ChDir", щоб змінити каталог за умовчанням на ваші власні вимоги перед відображенням діалогового вікна файлу
Зверніть увагу на використання символів підстановки у параметрі FileFilter. Файли Excel для відображення можуть бути до 2007 року, мати макроси або бути двійковими, тому фільтр - ".xls*".
123456 | Sub TestFileDialog ()Dim MyFile As StringChDir "C: \ temp"MyFile = Application.GetOpenFilename ("Файли Excel (*.xls*),*. Xls*", "" Виберіть файл ")MsgBox MyFileEnd Sub |
Якщо потрібно, ви можете дозволити користувачеві вибирати декілька файлів одночасно за допомогою параметра MultiSelect. За замовчуванням встановлено значення False (лише для одного вибору)
12345678 | Sub TestFileDialog ()Затемнити MyFile як варіантChDir "C: \ temp"MyFile = Application.GetOpenFilename ("Файли Excel (*.xls*),*. Xls*", "" Виберіть файл ",, Правда)Для кожного f У MyFileMsgBox fДалі fEnd Sub |
Користувач утримує клавішу Shift у діалоговому вікні файлу, щоб вибрати кілька файлів.
Цикл "Для кожного" відображає повний шлях та ім'я кожного вибраного файлу
Діалоги за замовчуванням Excel
У програмі Excel VBA є колекція діалогів, яку можна використовувати для відображення будь -якого стандартного діалогового вікна Excel. Недоліком є те, що ви не можете отримати доступ до параметрів, які вибрав користувач, або змінити зовнішній вигляд діалогового вікна, але ці діалоги можуть бути корисними для спрямування користувача до стандартної функції Excel та дозволу йому вибирати певні параметри в діалозі.
Хорошим прикладом цього є відображення діалогового вікна "Друк" з VBA:
123 | Sub TestPrintDialog ()Application.Dialogs (xlDialogPrint) .ShowEnd Sub |
Коли ви відкриєте дужки в колекції Dialogs, ви побачите список величезної кількості констант для вбудованих діалогів. Варто поекспериментувати з деякими з цих варіантів у вашому коді
Вставка нової форми користувача
Ви можете створювати власні користувацькі форми користувача, вставляючи форму користувача у редактор Visual Basic (VBE)
Для цього потрібно вибрати Вставити | UserForm на панелі меню VBE.
Натисніть на «UserForm», і з’явиться нова порожня форма, готова до розробки
Сама форма (показана як "UserForm1") виглядає досить маленькою, але ви можете використовувати ручки навколо неї, щоб збільшити або зменшити її, перетягнувши ручки курсором.
У нижньому лівому кутку екрана є вікно властивостей. Оскільки фокус зосереджений безпосередньо на самій формі, вона містить усі властивості форми, характерні для цієї форми.
Зауважте, що коли ви починаєте додавати елементи керування, такі як поля зі списком та кнопки команд, усі ці елементи керування мають свій власний набір властивостей, і вони можуть сильно відрізнятися в тому, що ви можете робити з кожним із них.
Властивості, які ви бачите зараз, застосовуються лише до самої форми.
Властивість ‘Name’ - це ім’я, яке використовується для визначення об’єкта форми у коді VBA. Можливо, ви захочете використати щось більш значуще для назви об’єкта, щоб під час перегляду коду було очевидно, яка форма використовується.
Властивість "Назва" також відображатиметься у вікні "Провідник проектів" у верхньому лівому куті екрана
Вам потрібно змінити рядок заголовка вашої форми на щось інше, ніж "UserForm1", і ви можете це зробити, ввівши новий текст у властивості "Caption"
Ви можете внести величезну кількість змін у те, як користувач бачить вашу форму. Ви можете змінювати кольори, додавати зображення, наприклад корпоративний логотип, змінити позицію за допомогою "Ліворуч" і "Зверху", змінити розмір за допомогою "Висота" та "Ширина", змінити вказівник миші та багато іншого
Усі ці властивості також можна змінити програмно для будь -якого елемента керування, який ви додали до форми. Наприклад, користувач може вибрати елемент керування зі списку, і ви можете вимкнути або приховати інші елементи керування на основі вибору користувача
Використання набору інструментів
Ви помітите, що при натисканні на саму форму з’являється спливаюче вікно з набором інструментів. Якщо ви натиснете де -небудь ще, наприклад на панелі властивостей, вона зникне, але знову з’явиться, коли ви натиснете на форму.
Набір інструментів надає справжню механіку дизайну форми. Це дає змогу додати до вашої форми звичайні елементи керування Windows, з якими знайомі користувачі.
Ви помітите, що у формі є мережа точок. Це "snapgrid", тому, коли ви додаєте елемент керування до форми, він автоматично вирівнює позицію по рядках і стовпцях крапок. Це надзвичайно допомагає у вирівнюванні елементів керування, щоб вони не виглядали рваними
Якщо ви натиснете на елемент керування, а потім вирішите його не використовувати, натискання на піктограму "Стрілка" у верхньому лівому куті панелі інструментів змінить курсор на нормальний.
Ви можете додати додаткові елементи керування до набору інструментів за допомогою Інструменти | Додаткові елементи управління в меню VBE. Доступна значна кількість таких варіантів, але залежно від версій Windows і Excel вони не завжди працюють, тому часто потрібні деякі експерименти.
Крім того, ваші користувачі можуть не мати доступу до деяких із цих додаткових елементів керування або працювати зі старішими версіями Windows та Excel, що може спричинити проблеми. У великих організаціях, особливо якщо вони глобальні, немає такого поняття, як стандартний ПК для збірки, на який можна покластися!
Додавання кнопки виходу до форми
Кнопку Command легко додати до форми. Це виглядає так само, як кнопки, які ви бачите в інших формах Windows, зазвичай як кнопки "OK" або "Скасувати".
Натисніть на іконку кнопки команди в панелі інструментів. Це друга піктограма зліва в нижньому рядку значків. Дивіться зображення вище. На ній є літери "ab".
Ви можете або утримувати кнопку миші натиснутою, і перетягнути елемент керування на форму, або перемістити курсор до форми, де він зміниться на «хрестовий» курсор, і ви зможете розмістити та розмістити кнопку
Якщо перетягнути елемент керування до форми, ви отримаєте розмір кнопки за умовчанням. Переміщення курсору до форми дозволяє змінювати розмір кнопки, перетягуючи курсор "хрест" по формі
Тепер ваша форма буде виглядати так:
У підписі кнопки буде текст за умовчанням, але ви захочете змінити його відповідно до власних вимог. Ви можете натиснути на текст у межах кнопки ("CommandButton1"), і це дозволить вам безпосередньо редагувати підпис.
Ви також можете змінити його у вікні властивостей (нижній лівий кут екрана). Ви побачите властивість під назвою "Caption", і ви можете відредагувати значення для цього. Змініть це на "Вихід"
Як і у властивостях форми, властивість "Ім'я" визначає ім'я, яке буде використовуватися у вашому коді VBA. Можливо, вам захочеться використати ім’я, яке є більш значущим і очевидним у вашому коді. Ви можете ввести це значення у властивості "Ім'я".
Ви можете змінити положення кнопки, перетягнувши її навколо форми, а також змінити її розмір, натиснувши на ручки кнопок (білі квадратні коробки) та перетягнувши їх, щоб збільшити або зменшити
Ви також можете змінити розмір кнопки, змінивши значення висоти та ширини у вікні властивостей
Ви можете переглянути форму в Excel, натиснувши зелений трикутник на панелі інструментів VBE або натиснувши клавішу F5
Ви можете викликати форму з коду VBA всередині модуля, використовуючи метод «Показати»
123 | Sub ShowForm ()UserForm1.ShowEnd Sub |
Ваша форма користувача фактично є глобальним об'єктом і її можна викликати з будь -якого місця вашого коду
Наразі ваша кнопка команди нічого не робить, оскільки за нею немає коду VBA. Ви повинні це написати самі! На даний момент все, що може статися, це те, що ви можете натиснути кнопку «Закрити» X у верхньому правому куті форми.
Щоб додати код VBA, двічі клацніть на кнопку у формі
Це перенесе вас у звичайне вікно коду VBA і покаже подію клацання за умовчанням.
Ви використовуєте метод "Приховати", щоб закрити форму, а також можете додати будь -який інший код, наприклад, поле повідомлення, щоб підтвердити користувачеві, що сталося.
Зауважте, що вікно коду має два спадні меню у верхній частині. Перший дозволяє вибрати елементи керування формою, а другий показує всі події, доступні для додавання коду. Очевидним для кнопки є подія "Натисніть", але є й інші, такі як "Подвійний клік" або "Переміщення миші"
Коли ви зараз запускаєте форму, кнопка насправді щось робить. Форма зникає, і відображається вікно повідомлення, що підтверджує закриття форми
Ви, звичайно, можете збільшити код виходу. Ви можете відобразити іншу форму або вжити заходів щодо параметрів, які користувач ввів у вашу форму
Додавання елемента керування міткою до форми
Елементи керування мітками призначені для запиту користувача щодо того, які дані вони повинні ввести до елемента керування у формі, наприклад текстове поле, спадне меню тощо. За замовчуванням мітка не має кордонів, але за потреби їх можна додати через вікно властивостей.
Як елемент керування, вони читаються лише користувачеві і є просто способом розміщення тексту у формі, будь то жирний заголовок або інструкція, що ввести чи вибрати.
Щоб додати мітку, клацніть піктограму «А» у наборі інструментів (верхній рядок, другий зліва) і двічі клацніть на ній або перемістіть курсор до форми та виберіть позицію та розмір.
Використовуючи властивість “Caption” у вікні властивостей або натиснувши на елемент керування міткою, ви можете ввести текст для елемента керування етикеткою.
Зауважте, що текст буде переноситись відповідно до розміру елемента керування міткою, і якщо рядок тексту занадто довгий, він не відображатиметься повністю у формі, тому вам слід бути обережним у визначенні розміру елемента керування підписом.
Використовуючи вікно властивостей, ви можете змінити зовнішній вигляд елемента керування міткою з різними кольорами, шрифтами, стилем задньої частини, наприклад. якщо воно накладається на зображення, і ви хочете, щоб воно було прозорим
Для керування етикеткою не потрібно створювати код. Основна мета - додати текст до форми, щоб користувач бачив, як працюють усі інші елементи керування
Додавання текстового елемента керування до форми
Текстовий елемент керування дозволяє користувачеві вводити текст, наприклад, вводити ім'я або коментарі
Текстовий елемент керування додається з панелі інструментів, натиснувши на піктограму текстового елемента керування (верхній рядок, третій зліва) та двічі клацнувши або перетягнувши елемент керування на місце у формі.
Текстовий елемент керування часто плутають з елементом керування мітками, але текстовий елемент керування вводить користувач
Текст "Введіть своє ім'я" є елементом керування мітками, як описано раніше, і тепер у нас є біле текстове поле, готове для користувача, щоб щось ввести
За допомогою вікна властивостей можна змінювати кольори, шрифти, спеціальні ефекти або використовувати символи пароля для текстового поля. Доступна величезна гнучкість
Одним з дуже важливих властивостей текстового поля є властивість "MultiLine". Якщо ви хочете, щоб користувач ввів у текстовий елемент керування велику кількість тексту, напр. коментарі, тоді для властивості ‘MultiLine’ має бути встановлено значення True.
За замовчуванням це значення False, що означає, що яким би великим не було ваше текстове поле, введений текст залишатиметься в одному безперервному рядку і прокручуватиметься з текстового поля. Він не буде обгортатись у коробці.
Немає спливаючого вікна, якщо клацнути правою кнопкою миші на текстовому полі під час його запуску, але CTRL+V працюватиме для Вставити, а CTRL+C працюватиме для Вирізати, якщо користувач захоче вирізати та вставити текст у та з іншого додатків
Знову ж таки, вам доведеться написати власний код, щоб мати справу з текстом, який ввів користувач. Ви можете перенести його в клітинку на робочому аркуші
Ви можете додати цей код до події "Змінити" для текстового поля
123 | Приватний підрядник TextBox1_Change ()Аркуші ("Аркуш1"). Діапазон ("А1"). Значення = TextBox1.ValueEnd Sub |
Ви також можете ввести код перевірки, щоб перевірити, чи користувач не вводить сміття, що матиме катастрофічні наслідки для вашої програми
Подія зміни не підходить для цього, оскільки вона викликається кожного разу, коли користувач вводить новий символ. Користувач може почати вводити рядок тексту і миттєво виявити, що він порушив ваші правила перевірки ще до того, як завершив дійсний текст.
Ви використовуєте подію "Вихід". Це спрацьовує, коли користувач переміщує фокус на інший елемент управління у формі, що означає, що користувач більше не вводить дані.
123456 | Private Sub TextBox1_Exit (ByVal Cancel As MSForms.ReturnBoolean)Якщо IsNull (TextBox1.Value) або Len (TextBox1.Value) <4 ТодіMsgBox "Назва недійсна", vbCriticalTextBox1.SetFocusЗакінчити ЯкщоEnd Sub |
Коли користувач натискає інший елемент керування на формі, цей код перевіряє або нульове значення у текстовому полі, або менше 4 символів. Якщо перевірка відповідає дійсності, з'являється вікно повідомлення з критичним значком, яке інформує користувача про те, що ім’я недійсне, і фокус переміщується назад до текстового поля, що порушує правила, для виправлення користувачем.
Зауважте, що навіть якщо користувач натисне кнопку Вихід, подія виходу з текстового поля буде виконана першою, тому це запобігає виходу користувача без виправлення введення
Ініціалізувати та активувати події у формі
Коли VBA вперше створює та створює форму, вона запускає подію "Initialize". Однак, оскільки форма також відображається на цьому етапі, вона також запускає подію "Активувати". Відтоді щоразу, коли форма з'являється за допомогою методу "Показати" або вона з'являється як частина ієрархії форм, тоді запускається подія "Активувати", але не подія "Ініціалізувати"
Подія "Ініціалізувати" відбувається лише один раз, але подія "Активувати" може відбуватися багато разів
У вашій формі ви можете налаштувати значення за замовчуванням з аркуша в елементах керування введенням, наприклад текстові поля, щоб вони з'явилися під час першого використання форми, але користувач може перезаписати значення за замовчуванням, і ці нові значення залишаться на місці, поки код працює
12345678 | Приватний підкористувач UserForm_Initialize ()TextBox1.Value = Аркуші ("Аркуш1"). Діапазон ("A1"). ЗначенняЯкщо TextBox1.Value = ”” ТодіTextBox1.Visible = FalseІнакшеTextBox1.Visible = ІстинаЗакінчити ЯкщоEnd Sub |
Ви можете знайти подію "Ініціалізація" у другому спадному меню у вікні коду, а ім'я форми користувача у першому спадному меню.
Цей код буде використовувати значення у комірці A1 на "Аркуші1" як значення за замовчуванням у текстовому полі, створеному раніше в цій статті. Коли форма з’являється вперше, з’явиться значення за замовчуванням. Потім користувач може перезаписати значення за замовчуванням, і це буде збережено. Якщо CellA1 порожнє, текстове поле буде приховано, інакше воно буде видно
Значення за замовчуванням також може бути жорстко кодовано:
1 | TextBox1.Value = “Джон Сміт” |
Ви також можете переконатися, що значення, які ввів користувач, з’являються знову, коли користувач запускає цю форму в цьому конкретному сеансі Excel. Код VBA може легко записувати значення назад у клітинки у книзі за допомогою події «Вихід» на елементі керування та повторно встановлювати їх за допомогою події «Активувати» у формі
123 | Private Sub TextBox1_Exit (ByVal Cancel as MSForms.ReturnBoolean)Аркуші ("Аркуш1"). Діапазон ("A10"). Значення = TextBox1.ValueEnd Sub |
123 | Приватний підкористувач UserForm_Activate ()TextBox1.Value = Аркуші ("Аркуш1"). Діапазон ("A10"). ЗначенняEnd Sub |
Цей код зробить значення користувача постійними, а також забезпечить їх збереження в решті книги
Збереження Вашої заявки та бланків
Коли ви зберігаєте книгу Excel, що містить ваші форми, усі форми та їх код VBA також зберігаються. Однак будь -які значення, які форми зберігають під час їх відображення, будуть втрачені.
Важливо написати код так, щоб, коли користувач виходить із книги або форми, значення записувалися назад у клітинки у книзі та зберігалися.
Модальні та немодальні форми
Сама форма має властивість "Показати модальний". За умовчанням встановлено значення True, але його можна змінити на False (немодальний)
Якщо форма є модальною, це означає, що під час відображення форми неможливо отримати доступ до жодної з функцій Excel. Це включає ваш код у вікні VBE. Ви можете переглянути код, але курсор і клавіатура відключені.
У немодальній формі ви можете отримати доступ до всіх функцій Excel, включаючи вікно VBE, під час відображення форми.
Це важливо з точки зору контролю поведінки користувачів
Закриття форми
Як би добре ви не написали свій код, щоб змусити користувача пройти певний маршрут, вони можуть легко його обійти, натиснувши кнопку «Закрити» X у верхньому правому куті форми
Ви можете запобігти цьому, змінивши подію "QueryClose" у формі
1234 | Приватний підкористувач UserForm_QueryClose (Скасувати як ціле число, Закрити режим як ціле число)Скасувати = ПравдаMsgBox "Ця дія відключена"End Sub |
Подія "QueryClose" запускається, коли користувач натискає кнопку "Закрити" X у формі. Цей код скасовує дію, тому користувач змушений використовувати вашу кнопку «Вийти» та код, який у вас за нею.
Увімкнення та вимкнення елементів керування
Усі елементи керування у вашій формі мають властивість під назвою "Enabled", для якої встановлено значення True або False. Якщо це значення False, то елемент керування буде сірим. Його можна побачити, але не можна використовувати.
Існує також властивість під назвою "Видимий", для якої знову встановлено значення True або False.
Ви можете написати код, щоб або зробити певний елемент управління непридатним, або зробити його абсолютно непомітним для користувача. Використовуючи вислів "Якщо", ви можете вибрати обставини, коли вам потрібно це зробити
Наприклад, ви могли спочатку вимкнути кнопку "Вийти", поки користувач не ввів значення у TextBox1 (ім'я)
123 | Приватний підкористувач UserForm_Initialize ()CommandButton1.Enabled = НеправдаEnd Sub |
1234567 | Приватний підрядник TextBox1_Change ()Якщо Len (TextBox1.Value)> 0 ТодіCommandButton1.Enabled = ІстинаІнакшеCommandButton1.Enabled = НеправдаЗакінчити ЯкщоEnd Sub |
Цей код використовує форму події "Ініціалізація", щоб вимкнути кнопку виходу (команда команд 1), коли форма вперше з'являється, а потім використовує подію "Змінити" на TextBox1 (ім'я), щоб увімкнути кнопку "Вихід", якщо щось було введено або вимкнено це, якщо поле порожнє.
Подія "Зміна" запускається щоразу, коли новий символ вводиться або видаляється з текстового поля. Якщо користувач намагається ввести текст, щоб увімкнути кнопку, а потім видаляє весь текст, кнопка миттєво вимикається