Създаване на VBA потребителски форми

Потребителски форми на VBA

Userform е много важна част от програмирането във VBA. Тя ви позволява да изградите професионално изглеждащ потребителски интерфейс за комуникация с потребителите на вашето приложение VBA. Той също така ви позволява напълно да контролирате потребителя в това, което правят с вашата работна книга.

Разбира се, можете да използвате клетки на работен лист, за да приемате параметри от потребителя, но потребителската форма създава много по -добро потребителско изживяване.

Чрез разширяване на височината и ширината на вашата потребителска форма до размера на прозореца на Excel, можете да направите приложението си да изглежда като нормално приложение за Windows, като потребителят напълно не знае, че използва Excel като хост.

Всички нормални контроли на Windows, като падащи менюта, списъчни полета, отметки са налични за вас. Също така имате огромен набор от методи, събития и свойства, които да използвате, за да подобрите потребителското изживяване.

Важен момент е, че когато показвате потребителска форма, която е вградена или е модална, не можете да редактирате кода си във VBE, нито да получите достъп до всяка функционалност на Excel. Само когато формулярът е затворен, курсорът ще се появи във вашия код.

Вградени потребителски форми на VBA

Excel VBA като няколко вградени форми, които могат да се използват за комуникация с потребителя.

Кутия за съобщения

Това е най -често използваната форма във VBA. Той просто показва текстово съобщение, евентуално информирайки потребителя, че е въвел невалиден въведен текст или че процесът на VBA е завършил. В най -простата си форма те показват текстов низ, но можете също да добавите икона като въпрос или удивителен знак и да дадете на полето за съобщение различно заглавие.

Това е основен пример. Има само един бутон за щракване и в заглавната лента пише „Microsoft Excel“

Кодът за създаване на това е много ясен:

123 Sub TestMsgBox ()MsgBox "Този процес приключи"End Sub

Можете да използвате различни параметри, за да добавяте бутони, икони и да променяте заглавната лента

123456789 Sub TestMsgBox ()Dim Ret като вариантRet = MsgBox ("Сигурни ли сте?", VbYesNo Или vbQuestion, "Моето приложение")Ако Ret = vbДа Тогава- Вашият процес тукИначеИзход от SubКрай Ако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*", "Изберете файл",, True)За всеки f в MyFileMsgBox fСледващ fEnd Sub

Потребителят държи натиснат клавиша Shift в диалоговия прозорец на файла, за да избере няколко файла.

Цикълът „За всеки“ показва пълния път и име на всеки избран файл

Диалози на Excel по подразбиране

В Excel VBA има колекция диалози, която можете да използвате за показване на всеки стандартен диалогов прозорец на Excel. Недостатъкът е, че не можете да получите достъп до параметрите, които потребителят е избрал, или да промените външния вид на диалоговия прозорец, но тези диалогови прозорци могат да бъдат полезни за насочване на потребителя към стандартна функция на Excel и им позволява да избират конкретни параметри в диалоговия прозорец.

Добър пример за това е да се покаже диалоговият прозорец „Печат“ от VBA:

123 Sub TestPrintDialog ()Приложение.Диалози (xlDialogPrint) .ПокажиEnd Sub

Когато отворите скобите в колекцията Dialogs, ще видите списък с огромен брой константи за вградени диалогови прозорци. Струва си да експериментирате с някои от тези опции във вашия код

Вмъкване на нов потребителски формуляр

Можете да проектирате свои собствени потребителски формуляри, като вмъкнете потребителска форма във Visual Basic Editor (VBE)

Можете да направите това, като изберете Вмъкване | UserForm в лентата с менюта на VBE.

Кликнете върху „UserForm“ и ще се появи нов празен формуляр, готов за развитие

Самата действителна форма (показана като „UserForm1“) изглежда доста малка, но можете да използвате дръжките около нея, за да я увеличите или да я направите още по -малка, като плъзнете дръжките с курсора.

В долния ляв ъгъл на екрана има прозорец със свойства. Тъй като фокусът е директно върху самата форма, тя съдържа всички свойства за формата, специфична за тази форма.

Обърнете внимание, че когато започнете да добавяте контроли, като комбинирани полета и командни бутони, всички тези контроли имат свой собствен набор от свойства и те могат да бъдат много различни в това, което можете да правите с всеки от тях.

Свойствата, които виждате в момента, се отнасят само за самата форма.

Свойството „Име“ е името, използвано за дефиниране на вашия обект на формуляр в кода на VBA. Може да искате да използвате нещо по -смислено за името на обекта, така че когато преглеждате кода си, е очевидно коя форма се използва.

Свойството „Име“ също ще се отрази до прозореца „Проучвател на проекти“ в горния ляв ъгъл на екрана

Ще искате да промените заглавната лента на формуляра си в нещо различно от „UserForm1“ и можете да направите това, като въведете новия си текст в свойството „Caption“

Можете да направите огромен брой промени в начина, по който вашата форма се вижда от потребителя. Можете да променяте цветовете, да добавяте изображения, напр. корпоративно лого, променете позицията, като използвате „Ляво“ и „Горе“, променете размера, като използвате „Височина“ и „Ширина“, променете показалеца на мишката и много други

Всички тези свойства също могат да бъдат променени програмно за всяка контрола, която сте добавили към формуляра си. Например, потребител може да избере от контрола в списъчно поле и може да искате да деактивирате или скриете други контроли въз основа на избора на потребителя

Използване на инструментариума

Ще забележите, че когато щракнете върху самия формуляр, се появява изскачащ прозорец с инструменти. Ако щракнете някъде другаде, напр. панела със свойства, той ще изчезне, но ще се появи отново, когато щракнете върху формуляра.

Кутията с инструменти предоставя истинската механика на дизайна на формуляра. Това ви позволява да добавите към формуляра си нормалните контроли на Windows, с които потребителите са запознати.

Ще забележите, че във формуляра има мрежа от точки. Това е „snapgrid“, така че когато добавите контрола към формуляра, той автоматично ще подравнява позицията към редовете и колоните на точки. Това помага изключително много при подравняването на вашите контроли, така че да не изглеждате дрипави

Ако щракнете върху контрола и след това решите да не я използвате, щракването върху иконата „Стрелка“ в горния ляв ъгъл на кутията с инструменти ще промени курсора ви към нормален.

Можете да добавите допълнителни контроли към инструментариума, като използвате Инструменти | Допълнителни контроли в менюто VBE. Налични са значителен брой от тях, но в зависимост от версиите на Windows и Excel те не винаги работят, така че често се налага експериментиране.

Също така вашите потребители може да нямат достъп до някои от тези допълнителни контроли или да използват по -стари версии на Windows и Excel, което може да причини проблеми. В големите организации, особено ако са глобални, няма такова нещо като стандартен компютър за изграждане, на който да разчитате!

Добавяне на бутон за изход към вашата форма

Команден бутон е лесен за добавяне към формуляра. Това изглежда по същия начин като бутоните, които виждате в други форми на Windows, обикновено като бутон „OK“ или „Отказ“.

Щракнете върху иконата на командния бутон в кутията с инструменти. Това е втората икона отляво в долния ред икони. Вижте изображението по -горе. На него има букви „ab“.

Можете или да задържите бутона на мишката и да плъзнете контролата върху формуляра си, или можете да преместите курсора във формуляра, където той ще се промени на „кръстосан“ курсор и можете да позиционирате и оразмерите бутона

Ако плъзнете контролата във формуляра, ще получите размера на бутона по подразбиране. Преместването на курсора към формуляра ви позволява да промените размера на бутона, като плъзнете курсора „кръст“ във вашата форма

Формулярът ви сега ще изглежда така:

Бутонът ще има текст по подразбиране като надпис, но вие ще искате да го промените според вашите собствени изисквания. Можете да кликнете върху текста в бутона („CommandButton1“) и това ще ви позволи да редактирате директно надписа.

Можете също да го промените в прозореца със свойства (долния ляв ъгъл на екрана). Ще видите свойство, наречено „Надпис“ и можете да редактирате стойността за това. Променете това на „Изход“

Както при свойствата на формуляра, свойството „Име“ определя името, което ще се използва във вашия VBA код. Може да искате да използвате име, което е по -смислено и очевидно в кода ви. Можете да въведете това срещу свойството „Име“.

Можете да позиционирате отново бутона, като го плъзнете около формуляра и можете да го промените, като щракнете върху дръжките на бутоните (бели квадратни кутии) и плъзнете дръжките, за да го увеличите или намалите

Можете също така да преоразмерите бутона, като промените стойностите на височина и ширина в прозореца със свойства

Можете да видите формуляра си в Excel, като щракнете върху зеления триъгълник в лентата с инструменти VBE или натиснете F5

Можете да извикате формуляра си от VBA код в рамките на модул, като използвате метода „Показване“

123 Sub ShowForm ()UserForm1.ShowEnd Sub

Вашият потребителски формуляр всъщност е глобален обект и може да бъде извикан от всяко място в кода ви

В момента вашият команден бутон не прави нищо, защото зад него няма VBA код. Трябва да напишете това сами! Всичко, което може да се случи в момента, е, че можете да кликнете върху „Затвори“ X в горния десен ъгъл на формуляра.

За да добавите VBA код, щракнете двукратно върху бутона във формуляра

Това ще ви отведе до нормалния прозорец с VBA код и ще покаже събитието по подразбиране на щракване.

Използвате метода „Скриване“, за да затворите формуляра и можете също да добавите всеки друг код, например поле за съобщение, за да потвърдите на потребителя какво се е случило.

Имайте предвид, че прозорецът с код има две падащи менюта в горната част. Първият ви позволява да изберете вашите контроли за формуляри, а вторият показва всички събития, които са на ваше разположение, за да добавите код. Очевидното за бутон е събитието „Щракване“, но има и други като „Двойно щракване“ или „Преместване на мишката“

Когато стартирате формуляра си сега, бутонът всъщност прави нещо. Формулярът изчезва и се показва поле със съобщение, потвърждаващо, че формулярът е затворен

Разбира се, можете да увеличите кода за изход. Може да искате да покажете друг формуляр или да предприемете действия по параметрите, които потребителят е въвел във формуляра ви

Добавяне на контрола на етикет към формуляр

Контролите с етикети са за подканване на потребителя какъв вид данни трябва да въведе в контрола във формуляра, напр. текстово поле, падащо меню и т.н. Етикетът няма граници по подразбиране, но те могат да бъдат добавени през прозореца със свойства, ако е необходимо.

Като контрол те се четат само за потребителя и са просто начин за поставяне на текст във формуляра, независимо дали става дума за удебелен заглавие, или за инструкция какво да въведете или изберете.

За да добавите етикет, щракнете върху иконата „A“ в кутията с инструменти (горен ред, втори отляво) и щракнете двукратно върху нея или преместете курсора към формуляра и изберете позиция и размер.

Използвайки свойството „Надпис“ в прозореца със свойства или щраквайки върху контролата с етикети, можете да въведете текста за контролата с етикети.

Обърнете внимание, че текстът ще се увие според размера на контролата за етикети и ако низът от текст е твърде дълъг, той няма да се появи изцяло във формуляра, така че трябва да внимавате за оразмеряването на контролата за етикет.

Използвайки прозореца със свойства, можете да промените външния вид на контролата на етикета, с различни цветове, шрифтове, стил на гърба, напр. ако се наслагва върху изображение и искате то да е прозрачно

Не е необходимо да се създава код за контрол на етикета. Основната цел е да добавите текст към формуляра, така че потребителят да може да види как работят всички останали контроли

Добавяне на текстов контрол към формуляра

Текстов контрол се използва, за да позволи на потребителя да въведе текст, например въвеждане на име или коментари

Текстовата контрола се добавя от инструментариума, като щракнете върху иконата за контрол на текста (горен ред, трета отляво) и щракнете двукратно или плъзнете контролата на място във формуляра.

Текстовият контрол често се бърка с контрола на етикета, но текстовият контрол е този за въвеждане от потребителя

Текстът „Въведете вашето име“ е контрол на етикета, както е описано по -горе, и сега имаме бяло текстово поле, готово за потребителя да въведе нещо в

Използвайки прозореца със свойства, можете да промените цветовете, шрифтовете, специалните ефекти или да използвате символи за парола за текстовото поле. Предлага се огромна гъвкавост

Едно много важно свойство за текстово поле е свойството „MultiLine“. Ако искате потребителят да въведе голямо количество текст в текстовия контрол, напр. коментари, тогава свойството „MultiLine“ трябва да бъде настроено на True.

По подразбиране е False, което означава, че колкото и голямо да е вашето текстово поле, въведеният текст ще остане на един непрекъснат ред и ще се превърти извън текстовото поле. Той няма да се увива в кутията.

Няма изскачащ прозорец, когато щракнете с десния бутон върху текстовото поле, когато се изпълнява, но CTRL+V ще работи за Paste, а CTRL+C ще работи за Cut, ако потребителят иска да изреже и постави текст към и от други приложения

Отново трябва да напишете свой собствен код, за да се справите с текст, който потребителят е въвел. Може да искате да го прехвърлите в клетка в работен лист

Можете да добавите този код към събитието „Промяна“ за текстовото поле

123 Private Sub TextBox1_Change ()Листове ("Sheet1"). Диапазон ("A1"). Стойност = TextBox1.ValueEnd Sub

Можете също така да въведете код за валидиране, за да проверите дали потребителят не въвежда боклуци, което ще има пагубни последици за вашето приложение

Събитието за промяна не е добро за това, защото се извиква всеки път, когато потребителят въведе нов знак. Потребителят може да започне да въвежда низ от текст и незабавно да установи, че е нарушил правилата ви за валидиране, преди да попълни валиден текст.

Използвате събитието „Изход“. Това се задейства, когато потребителят премести фокуса към друга контрола във формуляра, което означава, че потребителят вече не въвежда данни.

123456 Private Sub TextBox1_Exit (ByVal Cancel As MSForms.ReturnBoolean)Ако IsNull (TextBox1.Value) Или Len (TextBox1.Value) <4 ТогаваMsgBox "Името е невалидно", vbCriticalTextBox 1. SetFocusКрай АкоEnd Sub

Когато потребителят кликне върху друга контрола във формуляра, този код тества или нулева стойност в текстовото поле, или по -малко от 4 знака. Ако тестът е верен, тогава се появява съобщение с критична икона, което информира потребителя, че името е невалидно, и фокусът се премества обратно в нарушаващото текстово поле, за да може потребителят да го коригира.

Имайте предвид, че дори ако потребителят кликне върху бутона Изход, първо ще се извърши излизане от текстовото поле, така че това предотвратява излизането на потребителя, без да коригира въведеното

Инициализирайте и активирайте събития във формуляр

Когато VBA за първи път създава и изгражда формуляр, той задейства събитие „Инициализиране“. Въпреки това, тъй като формулярът също се показва на този етап, той също задейства събитие „Активиране“. От този момент нататък всеки път, когато формулярът се използва с помощта на метода „Показване“ или се появява като част от йерархия на формуляри, тогава се задейства събитието „Активиране“, но не и събитието „Инициализиране“

Събитието „Инициализиране“ се случва само веднъж, но събитието „Активиране“ може да се случи много пъти

Във вашия формуляр може да искате да зададете стойности по подразбиране от работния лист в контролите за въвеждане, напр. текстови полета, така че те да се появят при първото използване на формуляра, но потребителят може да презапише настройките по подразбиране и тези нови стойности ще останат на място, докато кодът работи

12345678 Частен подпотребителForm_Initialize ()TextBox1.Value = Листове ("Sheet1"). Диапазон ("A1"). СтойностАко TextBox1.Value = ”” ТогаваTextBox1.Visible = FalseИначеTextBox1.Visible = ВярноКрай АкоEnd Sub

Можете да намерите събитието „Initialize“ във второто падащо меню в прозореца на кода и името на потребителската форма в първото падащо меню.

Този код ще използва стойността в клетка A1 на „Sheet1“ като стойност по подразбиране в текстовото поле, създадено по -рано в тази статия. Когато формулярът се появи за първи път, ще се появи стойността по подразбиране. След това потребителят може да презапише стойността по подразбиране и тя ще бъде запазена. Ако CellA1 е празно, текстовото поле ще бъде скрито, в противен случай ще бъде видимо

Стойността по подразбиране също може да бъде кодирана трудно:

1 TextBox1.Value = „Джон Смит“

Можете също така да се уверите, че стойностите, които потребителят е въвел, се появяват отново, когато потребителят задейства тази форма в рамките на тази конкретна сесия на Excel. VBA кодът може лесно да запише стойностите обратно в клетки в работната книга, като използва събитието „Изход“ на контрола, и да ги инсталира повторно, като използва събитието „Активиране“ във формуляра

123 Private Sub TextBox1_Exit (ByVal Cancel as MSForms.ReturnBoolean)Листове ("Sheet1"). Диапазон ("A10"). Стойност = TextBox1.ValueEnd Sub
123 Private Sub UserForm_Activate ()TextBox1.Value = Листове ("Sheet1"). Диапазон ("A10"). СтойностEnd Sub

Този код ще направи стойностите на потребителя постоянни и също така ще гарантира, че те са запазени с останалата част от работната книга

Запазване на заявлението и формулярите

Когато запазвате работната си книга на Excel, съдържаща вашите формуляри, всички формуляри и техният VBA код също се запазват. Всички стойности, които формулярите притежават, докато се показват, ще бъдат загубени.

Важно е да напишете код, така че когато потребителят излезе от работната книга или от формуляра, стойностите да бъдат записани обратно в клетки в работната книга и така да бъдат запазени.

Модални и немодални форми

Самата форма има свойство „Покажи модален“. Това е зададено по подразбиране на True, но може да бъде променено на False (немодално)

Ако формулярът е модален, това означава, че няма достъп до нито една от функциите на Excel, докато формулярът се показва. Това включва вашия код в прозореца VBE. Можете да видите кода, но курсорът и клавиатурата са деактивирани.

В немодална форма можете да получите достъп до цялата функционалност на Excel, включително прозореца VBE, докато формулярът се показва.

Това е важно от гледна точка на контролирането на поведението на потребителя

Затваряне на формуляр

Колкото и добре да напишете кода си, за да принудите потребителя да слиза по определен маршрут, те лесно могат да го заобиколят, като кликнат върху „Затвори“ X в горния десен ъгъл на формуляра

Можете да предотвратите това да се случи, като промените събитието „QueryClose“ на формуляра

1234 Private Sub UserForm_QueryClose (Отказ като цяло число, CloseMode като цяло число)Отказ = ВярноMsgBox "Това действие е деактивирано"End Sub

Събитието „QueryClose“ се задейства, когато потребителят кликне върху „Затвори“ X на формуляра. Този код отменя действието, така че потребителят е принуден да използва вашия бутон „Изход“ и кода, който имате зад него.

Активиране и деактивиране на контролите

Всички контроли във вашия формуляр имат свойство, наречено „Enabled“, което е зададено на True или False. Ако е невярно, контролата е затъмнена. Може да се види, но не може да се използва.

Има и свойство, наречено „Видимо“, което отново е настроено на True или False.

Можете да напишете код, за да направите или дадена контрола неизползваема, или да я направите напълно невидима за потребителя. Използвайки изявление „Ако“, можете да изберете обстоятелствата, когато трябва да направите това

Например, първоначално можете да деактивирате бутона „Изход“, докато потребителят не въведе стойност в TextBox1 (име)

123 Частен подпотребителForm_Initialize ()CommandButton1.Enabled = FalseEnd Sub
1234567 Private Sub TextBox1_Change ()Ако Len (TextBox1.Value)> 0 ТогаваCommandButton1.Enabled = ВярноИначеCommandButton1.Enabled = FalseКрай АкоEnd Sub

Този код използва формата „Initialize“ събитие, за да деактивира бутона за излизане (Command Button 1), когато формулярът се появи за първи път, и след това използва събитието „Change“ на TextBox1 (име), за да активира бутона Exit, ако нещо е въведено или деактивирано това, ако полето е празно.

Събитието „Промяна“ се задейства всеки път, когато се въведе нов символ или се изтрие от текстовото поле. Ако потребителят се опита да въведе текст, за да активира бутона, и след това изтрие целия текст, бутонът незабавно ще бъде деактивиран

wave wave wave wave wave