Въведение
Microsoft Access включва редица функции, които позволяват на разработчиците на бази данни да създават формуляри за въвеждане на данни, отчети и заявки, които могат да насочват потребителите при запитване на съществуващи данни в базата данни и въвеждане на нови данни. Различни инструменти за създаване на заявки и съветници улесняват този процес на разработка. Дори с тези инструменти обаче може да има ситуации, в които разработчикът би искал да добави още повече функционалност, която все още не е предоставена от инструментите за разработка на MS Access. Например, разработчикът може да пожелае автоматично да коригира лошите данни, преди да бъдат записани в базата данни, да покаже предупреждение, ако бизнес правило е нарушено, да помогне на потребителя да се придвижи от един формуляр за въвеждане на данни до друг или да стартира отчет с някои персонализирани филтри. Начинът за постигане на такова персонализиране е чрез добавяне на код с помощта на езика за програмиране на Visual Basic за приложения.
Visual Basic за приложения (VBA) е езикът за програмиране, използван в семейството софтуерни продукти на Microsoft Office като Excel и Access. Езикът VBA произлиза от „основния“ език, изобретен през 1964 г., който стана популярен на персоналните компютри през 1970-те. Частта „Визуална“ на името е добавена от Microsoft, за да отразява използването на основния език за програмиране в Microsoft Windows.
Има много уроци, които въвеждат основно програмиране. Този урок ще се фокусира върху малка част от функции на езика VBA, използван в MS Access.
Съдържание
- Събития в Microsoft Access
- Пример на VBA код:Уверете се, че имената са в правилен регистър
- Езикът VBA – деклариране и присвояване на променливи, условни изрази и коментари
- Езикът на VBA – функции, методи и примери
- Езикът на VBA – Свойства
- Упражнения за VBA кодиране
- Обработка на грешки във VBA
- Изпълнение на персонализирани SQL заявки във VBA
Следващата страница представя събития в Microsoft Access.
Събития в Microsoft Access
В Access програмният код на VBA е прикачен към формуляри и отчети и може да бъде настроен да се изпълнява в определено време или в реакция на конкретно събитие. Този стил на програмиране понякога се нарича „базирано на събития“ програмиране, което означава, че кодът, който разработчикът пише, ще се изпълнява в отговор на някакво събитие .
Когато формуляр се покаже в изглед на формуляр, той обикновено иска всички съществуващи данни от основните таблици и след това просто ще седи там на празен ход, докато потребителят направи нещо. Например, потребителят може да щракне върху един от бутоните за навигация, за да премине към следващия запис, може да щракне в текстово поле и да започне да въвежда някои нови данни или може да щракне върху бутона Затвори, за да затвори формуляра. Всяко от тези действия води до Събитие случващо се във формата. Всяко щракване на мишката или удар на клавиатурата се обработва като събитие.
В по-голямата си част събитията имат поведение по подразбиране. Щракването върху бутона за навигация „следващ запис“ кара формуляра да се превърти до следващия запис с данни. Въвеждането на буквата „C“, когато курсорът е в текстово поле, води до появата на буквата „C“ в текстовото поле. Натискането на клавиш TAB кара курсора да прескочи към следващото текстово поле (или контрола) във формуляра и т.н. Програмистът може да отмени или подобри това поведение по подразбиране и да вмъкне свой собствен код, който да се изпълнява в отговор на събитието.
VBA програмирането на формуляри за достъп и отчети е фокусирано главно върху писането на код за реагиране на различни събития.
Преди да се потопите в детайлите на събитията, може да бъде поучително да приложите прост пример. За да видите някакъв код в действие, следващият раздел на този урок предоставя насока за добавяне на VBA код към формуляр за въвеждане на данни.
Пример на VBA код:Уверете се, че имената са в правилен регистър
Това, което следва, е сравнително кратък и прост пример за добавяне на VBA код към формуляр за въвеждане на данни в MS Access. Няколко подробности ще бъдат пропуснати за краткост. След този пример, останалата част от урока ще попълни тези подробности.
Този пример използва Клиент формуляр за въвеждане на данни, който беше персонализиран в урока Advanced MS Access Forms. Може да пожелаете да завършите този урок (или поне частите, отнасящи се до формуляра за въвеждане на данни на клиента), преди да продължите.
Когато въвеждаме информация за нови клиенти, бихме искали да се уверим, че имената на клиента са въведени с „правилен регистър“. Това означава, че първата буква на името трябва да е главна буква, а останалата част от името трябва да е с малки букви. Ако потребителят въведе:"joe", ние бихме искали формуляра автоматично да коригира това до правилния регистър на буквите:"Joe".
По отношение на събитията, ние ще добавим код, който е свързан със събитието след актуализация за полето Име във формуляра за клиента. Това означава, че след нещо е променено (актуализирано ) в полето First Name ще се задейства събитието след актуализиране и след това кодът, който ще напишем, ще влезе в действие, за да се увери, че името, което е било въведено, е преобразувано в правилен регистър.
Следните стъпки поставят този код на място.
- Отворете въвеждането на данни за клиента в режим на проектиране.
- Щракнете с десния бутон върху First Name текстово поле и изберете Свойства от изскачащото меню.
- Когато Лист със свойства се показва, щракнете върху раздела Събитие. Това е показано на фигурата по-долу:
Обърнете внимание на списъка със събития, които се показват. Всеки може да бъде програмиран да реагира на конкретното събитие, което се случва с First Name текстово поле.
- Създайте нов манипулатор на събития, като щракнете върху трите точки вдясно от събитието След актуализиране.
- Конструкторът за избор ще се появи прозорец. Изберете Код Builder и след това щракнете върху OK бутон.
- Ще се появи прозорецът за редактиране на VBA код. Имайте предвид, че Access вече е създал подпрограмата за подпрограма, която започва с думите Private Sub и завършва с думите End Sub.
Името на подпрограмата се създава с помощта на името на контролата за формуляри (FirstName) и името на Събитие, на което тази подпрограма ще отговори (AfterUpdate).Редът End Sub е мястото, където тази конкретна подпрограма ще завърши.
- Добавете следния код на празния ред между Private Sub и End Sub.:
FirstName = StrConv(FirstName, vbProperCase)
След като бъде завършен, кодът ще се появи, както следва:
Този нов ред код прави следното:
StrConv е функция, която приема съдържанието на текстовото поле FirstName и го преобразува според втория параметър, който е даден, който е vbProperCase в този пример. След като това преобразуване бъде извършено, резултатът ще бъде присвоен (с помощта на знака за равенство) обратно към текстовото поле FirstName. Това ще презапише всичко, което в момента е в текстовото поле FirstName. Например тази функция ще приеме „sally“, ще го преобразува в „Sally“ и след това ще постави „Sally“ в текстовото поле FirstName.
- Запазете този нов код, като издърпате надолу Файла меню и изберете Запазване .
- Тествайте новия код. Превключете обратно към екрана на Microsoft Access Design Mode. Променете изгледа на изглед на формуляр.
- Придвижете се до празен запис. Щракнете върху полето FirstName и въведете име с всички малки букви:
- Натиснете Tab клавиш, за да преминете към следващото текстово поле. Името на Джо трябва да бъде променено на „Джо“, както е показано по-долу:
- Ако получите грешка, превключете обратно към редактора на VBA код и се уверете, че сте изписали правилно всички части на кода. Може да се наложи да дръпнете надолу Run меню и изберете Нулиране за да спрете да се изпълнява VBA кодът.
Горният пример предостави бърз поглед върху това как човек може да персонализира поведението на формуляр, за да помогне на потребителя да въведе добре форматирани данни в базата данни. Няколко подробности бяха пропуснати по време на този пример и тези подробности ще бъдат обсъдени в останалата част от този урок.
Езикът на VBA
Този раздел представя накратко основните части на езика VBA, както се използва в MS Access. Изчерпателен преглед на VBA е извън обхвата на този урок. Препратки към по-изчерпателни книги и материали са предоставени в края на този урок.
Деклариране на променливи
Апроменлива е име, дадено на заместител, където програмистът може да съхранява някои данни. Например променлива може да се използва за съхраняване на число, докато извършваме някои математически операции върху него или сравняваме стойността му с други променливи. Променливите могат да бъдат декларирани да съдържат стойности от конкретен тип данни като цели числа, низове или дати. За да декларирате нова променлива, използвайте израза Dim. Например, за да декларирате нова променлива с име MyName и го настройте да държи низ (знаци), направете следното:
Dim strMyName като низ
За да декларирате нова променлива с име „AccountBalance“ и да я настроите да съхранява число с десетичен знак, използвайте следното:
Намалете баланса на dblAccountBalance като двойно
Присвояване на стойности
Стойност може да бъде присвоена на променлива или на контрола във формуляра, като се използва знакът за равенство. Например, за да съхраните името „Алекс“ в променливата MyName, използвайте следното:
strMyName =„Алекс“
За да копирате съдържанието на текстовото поле FirstName в променливата MyName, използвайте:
strMyName =[FirstName]
Стойностите също могат да бъдат изчислени, преди да бъдат присвоени. Например, следният израз взема салдото по сметката на текущия клиент от текстовото поле [Баланс], добавя 1% лихва (чрез умножаване на баланса по 1,01) и след това намалява резултата с $10. Накрая резултатът се присвоява на променливата AccountBalance.
dblAccountBalance =( [Баланс] * 1.01 ) – 10.00
Условни изявления
Условният израз използва логически тест, за да определи кои редове код да се изпълняват следващите. Условният оператор If ... Then се използва доста често. Например:
If AccountBalance < 1000 Then MonthlyFee = 10 Else MonthlyFee = 0 End If
Изчислява се логическият израз AccountBalance <1000. Ако този израз е вярно (например ако AccountBalance е $400), тогава се изпълнява следващият ред след Тогава. В този пример MonthlyFee =10.
Ако този израз е False, тогава се изпълнява редът след Else.
Логическият израз може да включва няколко части, които са свързани с булевите оператори ИЛИ, И и НЕ. По-задълбочено обсъждане на булевите изрази може да бъде намерено в този урок по програмиране. Например, да предположим, че се отказваме от месечната такса, ако акаунтът е на по-малко от една година. Да приемем, че имаме AccountAge като възраст на акаунта в месеци. Тогава кодът ще бъде:
If AccountBalance < 1000 AND AccountAge > 12 Then MonthlyFee = 10 Else MonthlyFee = 0 End If
Повече от един ред код могат да се изпълняват в операторите If … Then и If … Тогава операторите могат да бъдат вложени един в друг.
Коментари
Когато програмирате на всеки език за програмиране, е добра практика да включвате коментари, които описват кода. Във VBA може да се включи коментар, като се започне с един кавичък. Като вземем горното като пример, можем да добавим следните коментари:
Повече части от езика VBA са обсъдени на следващата страница.
Език VBA – Продължение
Функции
Езикът VBA има голям брой вградени функции и методи, които могат да се използват за изпълнение на различни задачи като математически функции (sin, cos, tan), функции на низове и много други. Функциите обикновено имат един или повече входни параметри, които се използват от функцията. Например, във функцията Cos(45) „45“ е входният ъгъл, върху който ще работи косинус функцията. Функцията StrConv изисква два входни параметъра:низът за преобразуване и стилът на преобразуване:
StrConv(FirstName, vbProperCase)
Някои удобни функции включват:
MsgBox( подкана, бутони, заглавие) | Показване на изскачащо съобщение с текст на подкана, бутони и заглавие |
StrConv( израз, стил) | Преобразувайте низовия израз в главни, малки или правилни букви |
Ляво (израз, знаци) | Вземете най-левите знаци от низовия израз |
Среда (израз, начало, знаци) | Вземете средния набор от знаци от низовия израз, започващ от началото |
IsNull(израз) | Проверете дали низовият израз (или текстовото поле) няма съдържание (е нула) |
Nz(израз, value_if_null) | Ако изразът е нулев, попълнете стойност по подразбиране |
Сега() | Връща текущата дата и час |
Кръгла (израз, десетични знаци) | Закръгля числовия израз до известен брой десетични знака |
RGB (червен, зелен, син) | Връща цяло число на цвета въз основа на комбинация от червено, зелено и синьо |
Методи
Методите във VBA са като функции, но са свързани с контрола или друг обект във формуляр или отчет.
Някои удобни методи включват:
DoCmd.CancelEvent | Анулира текущото събитие, което се обработва |
DoCmd.Close | Затворете текущия формуляр (или база данни) |
DoCmd.OpenForm | Отваря нов формуляр |
DoCmd.OpenReport | Изпълнете команда на MS Access, като например запазване на нови или актуализирани данни, отмяна на промяна или излизане от формуляр |
.SetFocus | Задайте фокуса върху контролата във формуляра |
.Отмяна | Отмяна на последната промяна или команда |
.Опресняване | Актуализира всички данни, залегнали в основата на формуляр |
.Заявка | Изисква данните, предоставени на формуляр |
.Пребоядисване | Пребоядисва всички контроли във формуляр |
Много повече функции и методи са изброени на този сайт на Microsoft.
Следващият набор от примери използва различни функции и методи в различни комбинации.
Примери
Покажете на потребителя предупреждение, ако салдото по сметката е под $1000
If AccountBalance < 1000 Then MsgBox("Warning: The Account Balance is now less than $1,000.") End If
Ако текстовото поле за име във формуляра има нещо в него, преобразувайте го в правилен регистър на буквите
If Not IsNull( [FirstName] ) Then FirstName = StrConv( [FirstName], vbProperCase ) End If
следващата страница представя свойства на различни обекти.
Свойства
Всеки елемент във формуляр за въвеждане на данни или отчет има набор от свойства свързани с него. Свойствата контролират разположението, цвета, шрифта, фона и други атрибути на външен вид и форматиране на всяка контрола. Например, някои от многото свойства на TextBox включват:
Видим | Определя дали текстовото поле се вижда във формуляра |
Заключено | Определя дали данните в текстовото поле могат да бъдат променени |
Индекс на раздели | Подреждането на всяка контрола, докато потребителят навигира във формуляра чрез натискане на Tab |
Етикет | Идентифицира името на етикета, свързан с текстовото поле |
Ширина, височина, горна и долна позиция | Показва относителната позиция и размера на текстовото поле |
Стил и цвят на фона | Задава стила на фона и цвета на текстовото поле |
Стил и цвят на границата | Задава стила и цвета на рамката около текстовото поле |
Размер на шрифта, тегло, подчертаване, курсив, цвят и подравняване | Задава шрифта и стила |
Полета и разстояние между полетата – Задава полетата и пълнежа около вътрешността на текстовото поле |
Свойствата могат да се задават с помощта на изгледа за проектиране и да се записват с формуляра или отчета. Свойствата могат да се променят и с помощта на VBA код, докато формулярът се изпълнява. За достъп до свойство във VBA използвайте името на контролата, след това точка и след това името на свойството. Например, следният код променя цвета на шрифта на текстовото поле CustomerID на червено:
CustomerID.ForeColor =vbRed
Разделите, които следват, предоставят някои упражнения, които комбинират различни части от езика за програмиране VBA за персонализиране на поведението на различни формуляри за въвеждане на данни.
Упражнения за VBA код
Опитайте следните упражнения, които персонализират формуляри. Обърнете се към предишните раздели за примери за код, който може да бъде адаптиран, за да пасне на текущото упражнение.
Упражнение 1
Променете формуляра CustomerDataEntry, за да добавите два манипулатора на събития AfterUpdate, които ще преобразуват името и фамилията в правилен регистър (Създайте отделен манипулатор за AfterUpdate за всяко текстово поле). Напишете код, за да проверите първо, за да се уверите, че текстовото поле не е нула, преди да се опитате да конвертирате текста.
Упражнение 2
Променете формуляра AccountsDataEntry, за да добавите манипулатор на събитие AfterUpdate, който ще показва предупредително съобщение, ако салдото по сметката е под 5000 $. Също така завъртете цвета на шрифта на текстовото поле Баланс в червено.
Упражнение 3
Променете формуляра за въвеждане на данни за клиента. Създайте подпрограма On Lost Focus, която превръща етикета за текстовото поле FirstName в червено (vbRed), ако потребителят напусне текстовото поле FirstName, без да въвежда нищо. Задайте етикета на син (vbBlue), ако има нещо в текстовото поле. В примера по-долу нищо не беше въведено в текстовото поле FirstName и след това потребителят премести раздела в следващото текстово поле, което доведе до оцветяване на етикета FirstName в червено.
Следващата страница от този урок обсъжда как да се справят с грешките във VBA кода.
Обработка на грешки във VBA
Понякога VBA кодът ще се сблъска с грешка. Например, ако текстовото поле е празно и се опитаме да преобразуваме съдържанието на текстовото поле в правилен регистър на буквите, функцията StrCnv ще се провали. Друг пример е, когато се случи деление на нула. Без обработка на грешки тези проблеми могат да доведат до срив на програмата VBA. Когато възникне грешка, специален код може да влезе в действие, за да се справи с грешката и да продължи обработката на VBA кода.
Двете основни функции за обработка на грешки на VBA са операторът On Error Goto и операторът Resume Next. Тези два кодови оператора на VBA работят заедно, за да предпазят VBA от срив на приложението.
Инструкцията On Error Goto информира VBA какво да прави, когато възникне грешка в подпрограма. Частта Goto на израза препраща към етикет другаде в кода, където VBA ще продължи да работи. След като програмата VBA стигне до етикета, всяка грешка ще се покаже в обект, наречен Err. Свойството Err.Description ще съдържа текстово описание на последната срещана грешка. Инструкцията Resume Next ще накара програмата VBA да продължи да работи от момента след възникване на грешката.
Следващият пример разгръща рутината FirstName_AfterUpdate, въведена в началото на този урок. Сега програмата VBA може да обработва всякакви грешки, които могат да възникнат в програмата.
Private Sub FirstName_AfterUpdate ' Subroutine to convert the FirstName of the customer to Proper Case On Error Goto FirstName_AfterUpdate_Error_Handler FirstName = StrConv(FirstName, vbProperCase) ' If the conversion was successful, exit this subroutine Exit Sub FirstName_AfterUpdate_Error_Handler: ' If there is an error show the description of the error MsgBox Err.Description ' Resume with the next statement In the subroutine Resume Next End Sub
следващият раздел на този урок обсъжда как да включите SQL код във VBA.
Изпълнение на персонализирани SQL заявки във VBA
Структурираният език за заявки (SQL) е езикът за програмиране, използван в релационни бази данни като MS Access, SQL Server, Oracle и много други. SQL изразите могат да се използват за вмъкване, актуализиране, изтриване и извличане (избиране) на записи с данни от таблици (сред много други способности). Прост пример за SQL израз би бил:
SELECT customerid, firstname, lastname FROM customer
SQL кодът може да бъде написан във VBA и да се изпълнява в подходящ момент. Например, VBA подпрограма може да бъде написана за запитване на таблицата Customer за намиране на най-високия CustomerID. След това бихме могли да добавим 1 към това число, за да постигнем нов, неизползван, CustomerID за нов запис.
Общите стъпки за изпълнение на този тип задачи са:
Създайте SQL израз
Изпълнете SQL изявлението, като използвате връзката с отворена база данни (наречена CurrentDb във VBA)
Извлечете получените записи и използвайте извлечените данни
За да създадете тази VBA подпрограма, отворете формуляра CustomerDataEntry и вземете свойствата на полето CustomerID. В раздела събития щракнете върху трите точки вдясно от събитието On Dbl Click. Изберете Code builder и мъничето ще бъде създадено, както следва:
Private Sub CustomerID_DblClick(Cancel As Integer) End Sub
Добавете следния код:
Private Sub CustomerID_DblClick(Cancel As Integer) ' Create a new CustomerID when user double-clicks in the CustomerID field On Error GoTo ErrorHandler Dim rstResults As Recordset ' This will hold the set of result records Dim strSQL As String ' This variable will hold the text of the SQL Statement ' If there is nothing in the CustomerID text box If IsNull(CustomerID) Then ' Make the SQL statement strSQL = "SELECT MAX(customerid) + 1 AS NewID FROM customer" ' Run the SQL query against the current database Set rstResults = CurrentDb.OpenRecordset(strSQL) ' If at least 1 record is returned If rstResults.EOF = False Then ' Assign the NewID to the CustomerID field CustomerID = rstResults!NewID End If rstResults.Close ' Close up the result set Set rstResults = Nothing ' Empty out the result set End If Exit Sub ErrorHandler: Set rstResults = Nothing End Sub
Кодът ще изглежда по следния начин, след като всичко е на мястото си:
Запазете файла и след това вижте формуляра CustomerDataEntry. Придвижете се до нов запис и след това щракнете двукратно в полето CustomerID. Нов CustomerID трябва да бъде създаден автоматично.