Wprowadzenie
Program Microsoft Access zawiera szereg funkcji umożliwiających programistom baz danych tworzenie formularzy wprowadzania danych, raportów i zapytań, które mogą pomóc użytkownikom w wyszukiwaniu istniejących danych w bazie danych i wprowadzaniu nowych danych. Różne narzędzia do tworzenia zapytań i kreatorów ułatwiają ten proces rozwoju. Jednak nawet w przypadku tych narzędzi mogą wystąpić sytuacje, w których programista chciałby dodać jeszcze więcej funkcji, których nie zapewniają jeszcze narzędzia programistyczne MS Access. Na przykład programista może chcieć automatycznie poprawiać złe dane przed ich zapisaniem w bazie danych, wyświetlać alert w przypadku naruszenia reguły biznesowej, pomagać użytkownikowi nawigować z jednego formularza wprowadzania danych do drugiego lub uruchamiać raport z niektórymi niestandardowymi filtrami. Sposobem na osiągnięcie takiego dostosowania jest dodanie kodu przy użyciu języka programowania Visual Basic for Applications.
Visual Basic for Applications (VBA) to język programowania używany w produktach z rodziny Microsoft Office, takich jak Excel i Access. Język VBA wywodzi się z języka „Basic” wynalezionego w 1964 roku, który stał się popularny na komputerach osobistych w latach siedemdziesiątych. „Wizualna” część nazwy została dodana przez firmę Microsoft, aby odzwierciedlić użycie języka programowania Basic w systemie Microsoft Windows.
Istnieje wiele samouczków, które wprowadzają programowanie w Basic. Ten samouczek skupi się na małym podzbiorze funkcji języka VBA używanego w MS Access.
Zawartość
- Wydarzenia w programie Microsoft Access
- Przykład kodu VBA:upewnianie się, że nazwy są we właściwym przypadku
- Język VBA – deklarowanie i przypisywanie do zmiennych, instrukcji warunkowych i komentarzy
- Język VBA – funkcje, metody i przykłady
- Język VBA – właściwości
- Ćwiczenia z kodowania VBA
- Obsługa błędów w VBA
- Uruchamianie niestandardowych zapytań SQL w VBA
Następna strona przedstawia wydarzenia w Microsoft Access.
Wydarzenia w programie Microsoft Access
W programie Access kod programowania VBA jest dołączony do formularzy i raportów i można go skonfigurować tak, aby uruchamiał się w określonym czasie lub w reakcji na określone zdarzenie. Ten styl programowania jest czasami określany jako programowanie „oparte na zdarzeniach”, co oznacza, że kod napisany przez programistę zostanie uruchomiony w odpowiedzi na pewne zdarzenie .
Gdy formularz jest wyświetlany w widoku formularza, zwykle wysyła zapytanie o wszelkie istniejące dane z tabel bazowych, a następnie po prostu siedzi bezczynnie, dopóki użytkownik czegoś nie zrobi. Na przykład użytkownik może kliknąć jeden z przycisków nawigacyjnych, aby przejść do następnego rekordu, kliknąć pole tekstowe i rozpocząć wpisywanie nowych danych lub kliknąć przycisk Zamknij, aby zamknąć formularz. Każde z tych działań skutkuje Zdarzeniem dzieje się w formie. Każde kliknięcie myszą lub naciśnięcie klawiatury jest traktowane jako zdarzenie.
W większości zdarzenia mają zachowanie domyślne. Kliknięcie przycisku nawigacyjnego „następny rekord” powoduje przewinięcie formularza do następnego rekordu danych. Wpisanie litery „C”, gdy kursor znajduje się w polu tekstowym, powoduje pojawienie się litery „C” w polu tekstowym. Naciśnięcie klawisza TAB powoduje, że kursor przeskakuje do następnego pola tekstowego (lub kontrolki) w formularzu i tak dalej. Programista może zmienić lub ulepszyć to domyślne zachowanie i wstawić własny kod, który zostanie uruchomiony w odpowiedzi na zdarzenie.
Programowanie VBA w formularzach dostępu i raportach koncentruje się głównie na pisaniu kodu odpowiadającego na różne zdarzenia.
Zanim zagłębimy się w szczegóły wydarzeń, pouczające może być zaimplementowanie prostego przykładu. Aby zobaczyć, jak działa kod, następna sekcja tego samouczka zawiera przewodnik dotyczący dodawania kodu VBA do formularza wprowadzania danych.
Przykład kodu VBA:upewnianie się, że nazwy są we właściwym przypadku
Poniżej znajduje się stosunkowo krótki i prosty przykład dodania kodu VBA do formularza wprowadzania danych w MS Access. Kilka szczegółów zostanie pominiętych dla celów zwięzłości. Po tym przykładzie reszta samouczka wypełni te szczegóły.
W tym przykładzie użyto Klienta formularz wprowadzania danych, który został dostosowany w samouczku Zaawansowane formularze MS Access. Możesz chcieć ukończyć ten samouczek (lub przynajmniej części dotyczące formularza wprowadzania danych Klienta) przed kontynuowaniem.
Wprowadzając nowe informacje o kliencie, chcielibyśmy upewnić się, że nazwy klientów są wpisane „właściwym przypadkiem”. Oznacza to, że pierwsza litera nazwy powinna być wielką literą, a reszta nazwy powinna być pisana małymi literami. Jeśli użytkownik wpisze:„Jan” chcielibyśmy, aby formularz automatycznie poprawił to na poprawną wielkość liter:„Jan”.
Jeśli chodzi o zdarzenia, dodamy kod, który jest połączony ze zdarzeniem After Update dla pola Imię w formularzu klienta. Oznacza to, że po coś zostało zmienione (zaktualizowane ) w polu Imię zostanie wyzwolone zdarzenie After Update, a następnie kod, który napiszemy, przejdzie do działania, aby upewnić się, że wpisana nazwa została przekonwertowana na poprawną wielkość liter.
Poniższe kroki umieszczają ten kod na swoim miejscu.
- Otwórz wpis danych klienta dla w trybie projektowania.
- Kliknij prawym przyciskiem myszy Imię pole tekstowe i wybierz Właściwości z wyskakującego menu.
- Kiedy Arkusz właściwości jest wyświetlany, kliknij zakładkę Zdarzenie. Pokazuje to poniższy rysunek:
Zwróć uwagę na listę wyświetlanych zdarzeń. Każdy z nich można zaprogramować tak, aby odpowiadał na określone zdarzenie, które dzieje się z Imieniem pole tekstowe.
- Utwórz nową procedurę obsługi zdarzeń, klikając trzy kropki po prawej stronie zdarzenia After Update.
- Wybierz Konstruktora pojawi się okno. Wybierz Konstruktor kodu a następnie kliknij OK przycisk.
- Pojawi się okno edycji kodu VBA. Zauważ, że program Access utworzył już skrót podprogramu, który zaczyna się od słów Private Sub i kończy słowami End Sub.
Nazwa podprogramu jest tworzona przy użyciu nazwy kontrolki formularzy (FirstName) i nazwy Zdarzenie, na które odpowie ten podprogram (po aktualizacji).Linia End Sub to miejsce, w którym kończy się ten konkretny podprogram.
- Dodaj następujący kod w pustym wierszu pomiędzy Private Sub i End Sub.:
FirstName = StrConv(FirstName, vbProperCase)
Po zakończeniu kod będzie wyglądał następująco:
Ta nowa linia kodu wykonuje następujące czynności:
StrConv to funkcja, która pobiera zawartość pola tekstowego FirstName i konwertuje je zgodnie z drugim podanym parametrem, którym w tym przykładzie jest vbProperCase. Po wykonaniu tej konwersji wynik zostanie przypisany (za pomocą znaku równości) z powrotem do pola tekstowego FirstName. To nadpisze wszystko, co jest aktualnie w polu tekstowym FirstName. Na przykład ta funkcja pobierze „sally”, przekonwertuje je na „Sally”, a następnie umieści „Sally” w polu tekstowym FirstName.
- Zapisz ten nowy kod, przeciągając Plik menu i wybierając Zapisz .
- Przetestuj nowy kod. Przełącz się z powrotem na ekran trybu projektowania programu Microsoft Access. Zmień widok na Widok formularza.
- Przejdź do pustego rekordu. Kliknij pole Imię i wpisz imię małymi literami:
- Naciśnij kartę klawisz, aby przejść do następnego pola tekstowego. Imię Joe powinno zostać zmienione na "Joe", jak pokazano poniżej:
- Jeśli pojawi się błąd, przełącz się z powrotem do edytora kodu VBA i upewnij się, że poprawnie wpisałeś wszystkie części kodu. Może być konieczne pociągnięcie Bieg menu i wybierz Resetuj w celu zatrzymania działania kodu VBA.
Powyższy przykład dostarczył szybkiego spojrzenia na to, jak można dostosować zachowanie formularza, aby pomóc użytkownikowi wprowadzić ładnie sformatowane dane do bazy danych. Kilka szczegółów zostało pominiętych w tym przykładzie i zostaną one omówione w dalszej części tego samouczka.
Język VBA
Ta sekcja pokrótce przedstawia główne części języka VBA używanego w MS Access. Kompleksowy przegląd VBA wykracza poza zakres tego samouczka. Odniesienia do bardziej kompleksowych książek i materiałów znajdują się na końcu tego samouczka.
Deklarowanie zmiennych
zmienna to nazwa nadana symbolowi zastępczemu, w którym programista może przechowywać pewne dane. Na przykład zmienna może służyć do przechowywania liczby, podczas gdy wykonujemy na niej pewne operacje matematyczne lub porównujemy jej wartość z innymi zmiennymi. Zmienne można zadeklarować do przechowywania wartości określonego typu danych takie jak liczby całkowite, ciągi znaków lub daty. Aby zadeklarować nową zmienną, użyj instrukcji Dim. Na przykład, aby zadeklarować nową zmienną o nazwie MyName i skonfiguruj go tak, aby zawierał ciąg (znaki), wykonaj następujące czynności:
Dim strMyName As String
Aby zadeklarować nową zmienną o nazwie „AccountBalance” i ustawić ją do przechowywania liczby z ułamkiem dziesiętnym, użyj następującego:
Dim dblAccountBalance jako Double
Przypisywanie wartości
Wartość można przypisać do zmiennej lub kontrolki w formularzu za pomocą znaku równości. Na przykład, aby zapisać imię „Alex” w zmiennej MyName, użyj następującego:
strMyName =„Alex”
Aby skopiować zawartość pola tekstowego FirstName do zmiennej MyName, użyj:
strMyName =[Imię]
Wartości można również obliczyć przed przypisaniem. Na przykład poniższe wyrażenie pobiera saldo konta bieżącego klienta z pola tekstowego [Saldo], dodaje 1% odsetek (poprzez pomnożenie salda przez 1,01), a następnie zmniejsza wynik o 10 USD. Na koniec wynik jest przypisywany do zmiennej AccountBalance.
dblAccountBalance =( [Saldo] * 1,01 ) – 10,00
Oświadczenia warunkowe
Instrukcja warunkowa używa testu logicznego w celu określenia, które wiersze kodu mają zostać uruchomione w następnej kolejności. Instrukcja warunkowa If … Then jest dość często używana. Na przykład:
If AccountBalance < 1000 Then MonthlyFee = 10 Else MonthlyFee = 0 End If
Wyrażenie logiczne AccountBalance <1000 jest oceniane. Jeśli to wyrażenie jest prawdziwe (na przykład, jeśli saldo konta wynosi 400 USD), uruchamiany jest następny wiersz po Then. W tym przykładzie opłata miesięczna =10.
Jeśli to wyrażenie ma wartość False, uruchamiany jest wiersz po Else.
Wyrażenie logiczne może zawierać kilka części, które są połączone operatorami boolowskimi OR, AND i NOT. Dokładniejsze omówienie wyrażeń logicznych można znaleźć w tym samouczku programowania. Załóżmy na przykład, że rezygnujemy z opłaty miesięcznej, jeśli konto ma mniej niż rok. Załóżmy, że mamy AccountAge jako wiek konta w miesiącach. Wtedy kod będzie wyglądał następująco:
If AccountBalance < 1000 AND AccountAge > 12 Then MonthlyFee = 10 Else MonthlyFee = 0 End If
W instrukcji If … Then można uruchomić więcej niż jeden wiersz kodu i instrukcje If … Then mogą być zagnieżdżone w sobie.
Komentarze
Podczas programowania w dowolnym języku programowania dobrą praktyką jest dołączenie komentarzy opisujących kod. W VBA komentarz można dołączyć, zaczynając od pojedynczego cudzysłowu. Biorąc powyższe jako przykład, możemy dodać następujące komentarze:
Więcej części języka VBA omówiono na następnej stronie.
Język VBA – ciąg dalszy
Funkcje
Język VBA ma dużą liczbę wbudowanych funkcji i metod, które można wykorzystać do wykonywania różnych zadań, takich jak funkcje matematyczne (sin, cos, tan), funkcje łańcuchowe i wiele innych. Funkcje zazwyczaj mają jeden lub więcej parametrów wejściowych, które są używane przez funkcję. Na przykład w funkcji Cos(45) „45” jest kątem wejściowym, na którym będzie działać funkcja cosinus. Funkcja StrConv wymaga dwóch parametrów wejściowych:ciągu do konwersji i stylu konwersji:
StrConv(Imię, vbProperCase)
Niektóre przydatne funkcje obejmują:
MsgBox (monit, przyciski, tytuł) | Wyświetl wyskakujące okienko z tekstem zachęty, przyciskami i tytułem |
StrConv(wyrażenie, styl) | Konwertuj wyrażenie tekstowe na wielkie, małe lub poprawne litery |
Lewo (wyrażenie, znaki) | Weź skrajne lewe znaki z wyrażenia łańcuchowego |
Mid(wyrażenie, początek, znaki) | Weź środkowy zestaw znaków z wyrażenia łańcuchowego, zaczynając od początku |
IsNull( wyrażenie) | Sprawdź, czy wyrażenie tekstowe (lub pole tekstowe) nie zawiera treści (jest puste) |
Nz(wyrażenie, wartość_jeśli_null) | Jeśli wyrażenie jest puste, wpisz wartość domyślną |
Teraz() | Zwraca bieżącą datę i godzinę |
Zaokrąglony(wyrażenie, ułamki dziesiętne) | Zaokrągla wyrażenie liczbowe do pewnej liczby miejsc po przecinku |
RGB (czerwony, zielony, niebieski) | Zwraca liczbę całkowitą koloru na podstawie kombinacji czerwonego, zielonego i niebieskiego |
Metody
Metody w VBA są jak funkcje, ale są połączone z kontrolką lub innym obiektem w formularzu lub raporcie.
Niektóre przydatne metody obejmują:
DoCmd.CancelEvent | Anuluje bieżące obsługiwane zdarzenie |
DoCmd.Zamknij | Zamknij bieżący formularz (lub bazę danych) |
DoCmd.OpenForm | Otwiera nowy formularz |
DoCmd.OpenReport | Uruchom polecenie MS Access, takie jak zapisanie nowych lub zaktualizowanych danych, cofnięcie zmiany lub wyjście z formularza |
.SetFocus | Ustaw fokus na kontrolce w formularzu |
.Cofnij | Cofnij ostatnią zmianę lub polecenie |
.Odśwież | Aktualizuje wszystkie dane stanowiące podstawę formularza |
. Zapytanie | Wymaga danych dostarczonych do formularza |
.Odśwież | Odświeża wszystkie kontrolki w formularzu |
Wiele innych funkcji i metod jest wymienionych na tej stronie firmy Microsoft.
Poniższy zestaw przykładów wykorzystuje różne funkcje i metody w różnych kombinacjach.
Przykłady
Pokaż użytkownikowi ostrzeżenie, jeśli saldo konta jest poniżej 1000 USD
If AccountBalance < 1000 Then MsgBox("Warning: The Account Balance is now less than $1,000.") End If
Jeśli pole tekstowe Imię w formularzu coś zawiera, przekonwertuj to na poprawną wielkość liter
If Not IsNull( [FirstName] ) Then FirstName = StrConv( [FirstName], vbProperCase ) End If
następna strona przedstawia właściwości różnych obiektów.
Właściwości
Każdy element w formularzu wprowadzania danych lub raporcie ma zestaw właściwości powiązany z tym. Właściwości kontrolują położenie, kolor, czcionkę, tło i inne atrybuty wyglądu i formatowania każdej kontrolki. Na przykład niektóre z wielu właściwości TextBox obejmują:
Widoczny | Określa, czy pole tekstowe jest widoczne w formularzu |
Zablokowane | Określa, czy dane w polu tekstowym można zmienić |
Indeks kart | Kolejność każdej kontrolki, gdy użytkownik porusza się po formularzu, naciskając Tab |
Etykieta | Identyfikuje nazwę etykiety powiązanej z polem tekstowym |
Szerokość, wysokość, górna i dolna pozycja | Wskazuje względną pozycję i rozmiar pola tekstowego |
Styl i kolor tła | Ustawia styl tła i kolor pola tekstowego |
Styl i kolor obramowania | Ustawia styl i kolor obramowania wokół pola tekstowego |
Rozmiar czcionki, grubość, podkreślenie, kursywa, kolor i wyrównanie | Ustawia czcionkę i styl |
Marginesy i odstępy dopełnienia – Ustawia marginesy i dopełnienie wokół wnętrza pola tekstowego |
Właściwości można ustawić za pomocą widoku projektu i zapisać z formularzem lub raportem. Właściwości można również zmienić za pomocą kodu VBA, gdy formularz jest uruchomiony. Aby uzyskać dostęp do właściwości w VBA, użyj nazwy kontrolki, kropki, a następnie nazwy właściwości. Na przykład poniższy kod zmienia kolor czcionki pola tekstowego CustomerID na czerwony:
IDKlienta.ForeColor =vbRed
Poniższe sekcje zawierają ćwiczenia, które łączą różne części języka programowania VBA w celu dostosowania zachowania różnych formularzy wprowadzania danych.
Ćwiczenia z kodu VBA
Wypróbuj następujące ćwiczenia, które dostosowują formularze. Wróć do poprzednich sekcji, aby znaleźć przykłady kodu, który można dostosować do bieżącego ćwiczenia.
Ćwiczenie 1
Zmodyfikuj formularz CustomerDataEntry, aby dodać dwie procedury obsługi zdarzeń AfterUpdate, które przekonwertują imię i nazwisko na poprawną wielkość liter (utwórz osobną procedurę obsługi AfterUpdate dla każdego pola tekstowego). Napisz kod, aby najpierw sprawdzić, czy pole tekstowe nie jest puste przed próbą konwersji tekstu.
Ćwiczenie 2
Zmodyfikuj formularz AccountsDataEntry, aby dodać procedurę obsługi zdarzeń AfterUpdate, która będzie wyświetlać okno komunikatu ostrzegawczego, jeśli saldo konta jest poniżej 5000 USD. Zmień także kolor czcionki pola tekstowego Balans na czerwony.
Ćwiczenie 3
Zmodyfikuj formularz wprowadzania danych klienta. Utwórz podprocedurę On Lost Focus, która zmienia etykietę pola tekstowego FirstName na kolor czerwony (vbRed), jeśli użytkownik opuści pole tekstowe FirstName bez wpisywania czegokolwiek. Ustaw etykietę na niebieską (vbBlue), jeśli coś jest w polu tekstowym. W poniższym przykładzie nic nie zostało wpisane w polu tekstowym FirstName, a następnie użytkownik przeszedł na następne pole tekstowe, co spowodowało, że etykieta FirstName zmieniła kolor na czerwony.
Na następnej stronie tego samouczka omówiono sposób obsługi błędów w kodzie VBA.
Obsługa błędów w VBA
Czasami kod VBA napotka błąd. Na przykład, jeśli pole tekstowe jest puste i próbujemy przekonwertować zawartość pola tekstowego na poprawną wielkość liter, funkcja StrCnv nie powiedzie się. Innym przykładem jest dzielenie przez zero. Bez obsługi błędów te problemy mogą spowodować awarię programu VBA. Gdy wystąpi błąd, specjalny kod może uruchomić się, aby obsłużyć błąd i kontynuować przetwarzanie kodu VBA.
Dwie główne funkcje obsługi błędów w języku VBA to instrukcja On Error Goto i instrukcja Resume Next. Te dwie instrukcje kodu VBA współpracują ze sobą, aby uniemożliwić VBA awarię aplikacji.
Instrukcja On Error Goto informuje VBA o tym, co zrobić, gdy w podprogramie wystąpi błąd. Część instrukcji Goto odwołuje się do etykiety w innym miejscu kodu, w którym VBA będzie nadal działać. Gdy program VBA dotrze do etykiety, każdy błąd pojawi się w obiekcie o nazwie Err. Właściwość Err.Description będzie zawierać opis tekstowy ostatniego napotkanego błędu. Instrukcja Resume Next spowoduje, że program VBA będzie kontynuował działanie od punktu po wystąpieniu błędu.
Poniższy przykład rozwija procedurę FirstName_AfterUpdate wprowadzoną na początku tego samouczka. Teraz program VBA może obsłużyć wszelkie błędy, które mogą wystąpić w programie.
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
w następnej sekcji tego samouczka omówiono, jak dołączyć kod SQL do VBA.
Uruchamianie niestandardowych zapytań SQL w VBA
Structured Query Language (SQL) to język programowania używany w relacyjnych bazach danych, takich jak MS Access, SQL Server, Oracle i wielu innych. Za pomocą instrukcji SQL można wstawiać, aktualizować, usuwać i pobierać (wybierać) rekordy danych z tabel (wśród wielu innych możliwości). Prosty przykład instrukcji SQL to:
SELECT customerid, firstname, lastname FROM customer
Kod SQL można napisać w VBA i uruchomić w odpowiednim czasie. Na przykład można napisać podprogram VBA w celu odpytywania tabeli Customer w celu znalezienia najwyższego identyfikatora klienta. Następnie moglibyśmy dodać 1 do tej liczby, aby uzyskać nowy, nieużywany identyfikator klienta dla nowego rekordu.
Ogólne kroki do wykonania tego typu zadań to:
Utwórz instrukcję SQL
Uruchom instrukcję SQL, używając otwartego połączenia z bazą danych (o nazwie CurrentDb w VBA)
Odzyskaj wynikowe rekordy i użyj pobranych danych
Aby utworzyć ten podprogram VBA, otwórz formularz CustomerDataEntry i uzyskaj właściwości pola CustomerID. Na karcie Zdarzenia kliknij trzy kropki po prawej stronie zdarzenia Kliknięcie dwukrotne. Wybierz narzędzie do tworzenia kodu, a kod pośredniczący zostanie utworzony w następujący sposób:
Private Sub CustomerID_DblClick(Cancel As Integer) End Sub
Dodaj następujący kod:
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
Po umieszczeniu kod będzie wyglądał następująco:
Zapisz plik, a następnie wyświetl formularz CustomerDataEntry. Przejdź do nowego rekordu, a następnie kliknij dwukrotnie w polu CustomerID. Nowy identyfikator klienta powinien zostać utworzony automatycznie.