Procedury - służą do programowania aplikacji bazodanowych w MS Access (programowanie zdarzeniowe):

Na przykład, na formularzu można umieścić zbiór przycisków, po których naciśnięciu użytkownik uzyskuje:

 


Visual Basic for Applications (w skrócie VBA) jest językiem programowania dla aplikacji systemu Microsoft Office będący podzbiorem języka Visual Basic. 

Moduł jest zbiorem deklaracji i definicji procedur języka Visual Basic for Applications przechowywanych razem jako jedna całość. 

Typy zmiennych:

Typy danych dla zmiennych

Access Visual Basic Default
Text String ""
Number Integer, Long, Double, Single 0
Currency Currency 0
Yes/No Boolean False
Date/Time Date 30.12.1899

Specjalny typ danych Visual Basic - Variant - oznacza dowolny typ wartości.

 


Przykład 1

Obliczanie pierwiastka kwadratowego.

Function SquareRoot (X As Double) As Double
 Dim Msg As String
 Select Case Sgn(X) ' Oblicz znak argumentu.
     Case 1 ' OK jeśli dodatni.
            SquareRoot = Sqr(X) 
            Exit Function
     Case 0 ' Powiadom użytkownika jeśli 0.
            Msg = "Przekazana wartość to 0."
     Case -1 ' Powiadom użytkownika jeśli <0.
            Msg = "Niedozwolona liczba."
  End Select
  MsgBox Msg ' Wyświetl komunikat Msg
End Function

W przypadku wywołania funkcji, gdy nie nastąpi przypisanie wartości do nazwy funkcji SquareRoot, system przypisze wartość 0.

 

Przykład 2

Deklaracje i definicje modułu. Opcje:

są zwykle domyślnie przyjmowane przez system.

Option Compare Database 
Option Explicit 

Private licznik As Integer  'Zmienna lokalna
Public pokaż As Integer 'Zmienna globalna
Sub Zeruj() 'Procedura globalna
   licznik = 0
      pokaż = licznik
End Sub

Sub Dodaj() 'Procedura globalna
   licznik = licznik + 1
   pokaż = licznik
   MsgBox licznik, , "LICZNIK"
End Sub

Edytor kodu Visual Basic (Visual Basic Editor) – zawierający środowisko uruchamiania i debuggowania kodu VBA.

? licznik

gdzie licznik jest zmienną, której wartość chcemy wypisać.

 

Na ogół jednej klasie odpowiada dokładnie jeden obiekt tej klasy (obiekt klasy class object).

 

Przykład 3

Sprawdzanie, czy dany formularz jest otwarty w widoku Formularz - rozwiązanie używające standardowej funkcji SysCmd.

Function Otwarty(ByVal Mój As String) As Integer
' SysCmd - czy formularz jest otwarty
   If SysCmd(acSysCmdGetObjectState,acForm,Mój) <> 0 Then
   ' CurrentView - czy jest otwarty w widoku Formularz
      If Forms(Mój).CurrentView <> 0 Then Otwarty = True
   End If
End Function

Formularze są obiektami. Do formularza o nazwie "Pracownicy" można się odwołać w następujący sposób:

Używając dostępu kropkowego możemy odwoływać się do właściwości formularza a także do jego metod jako obiektu. Np:  

Reasumując

Zapis Forms![Pracownicy]![Nazwisko] oznacza także domyśnie wartość pola tekstowego “Nazwisko” czyli konkretne nazwisko – alternatywnie można używać

Forms![Pracownicy]![Nazwisko].Value.

Przy wpisywaniu do pola tekstowego lub listowego bieżącą wartość – jeszcze nie zapisaną do bazy danych – uzyskuje się przy użyciu:

Forms![Pracownicy]![Nazwisko].Text

Przy odczytywaniu wartości Text fokus musi znajdować się na danym polu:

[Nazwisko].SetFocus
MsgBox "Nazwisko = "&[Nazwisko].Text

Sprawdzenie czy formularz jest otwarty można zrealizować jeszcze w inny sposób – przeglądając kolekcję wszystkich otwartych formularzy i sprawdzając ich nazwy.

Function Otwarty1 (ByVal Mój As String) As Integer
' Zwraca True, jeśli podany formularz jest otwarty w widoku formularz.
   Dim I As Integer
   ' Forms.Count to liczba obiektów w kolekcji Forms
   For I = 0 To Forms.Count - 1
     If Forms(I).Name = Mój Then 
              Otwarty1 = True
        Exit For
     End If
   Next I
End Function

 

Jest możliwość używania kilku kopii jednego formularza (tj. kilku instancji jednej klasy). 
Używając 
    DoCmd.OpenForm "Osoby"
tworzymy pierwszą kopię (instancję). Kolejną kopię tworzymy w następujący sposób:

      Dim Kopia As New Form_Osoby

' Aby je odróżnić, zmieniamy tytuł kopii formularza “Osoby”

      Kopia.Caption = "Kopia: Osoby"

 

Przykład 4

Kolejna procedura specyfikuje reakcję na zdarzenie naciśnięcia lewego przycisku  myszy (obiekt: przycisk “Witaj”, zdarzenie: “Przy kliknięciu”).  

Private Sub Witaj_Click()
   [Pole] = "Witaj w klubie VBA"
End Sub

Przykład 5

Zwróćmy uwagę na procedurę, jaką tworzy kreator przycisków w celu zrealizowania zadania otwarcia formularza o nazwie “Osoby”:

Private Sub Przycisk_Click()
   On Error GoTo Err_Przycisk_Click
   Dim stDocName As String
   Dim stLinkCriteria As String
   stDocName = "Osoby"
   DoCmd.OpenForm stDocName, , , stLinkCriteria
  Exit_Przycisk_Click:
   Exit Sub
  Err_Przycisk_Click:
   MsgBox Err.Description
   Resume Exit_Przycisk_Click
End Sub

W powyższej procedurze można byłoby standardowy tekst błędu Err.Description zastąpić własnym tekstem skierowanym do użytkownika aplikacji:

MsgBox "Błąd aplikacji. Skontaktuj się z administratorem aplikacji"

 

Przykład 6

Otwarcie formularza może być bardziej skomplikowane, aby mogło wystarczyć użycie samego kreatora przycisków np. procedura otwierająca formularz "Uczestnictwo w projektach" w oparciu o wartość znajdującą się w polu [Numer] będącym częścią podformularza przy czym sam przycisk "Projekty" znajduje się w głównym formularzu “Departament”. 

Procedura otwiera formularz "Uczestnictwo w projektach" w celu pokazania uczestnictwa w projektach wybranej aktualnie osoby (w podformularzu):

Private Sub Projekty_Click()
   On Error GoTo Err_Projekty_Click
   Dim stDocName As String
   Dim stLinkCriteria As String
   stDocName = "Uczestnictwo w projektach"
   stLinkCriteria = "Numer=Forms![Departament]![Osoba Subform].Form![Numer]"

   DoCmd.OpenForm stDocName, , , stLinkCriteria
   Forms![Departament].SetFocus
   Forms![Departament]![Osoba Subform].SetFocus

  Exit_Projekty_Click:
   Exit Sub
  Err_Projekty_Click:
   MsgBox Err.Description
   Resume Exit_Projekty_Click
End Sub

 

Przykład 7 Synchronizacja dwóch formularzy

Formularz wyskakujący  "Uczestnictwo w projektach" powinien pokazywać dane o aktualnie rozpatrywanym pracowniku z podformularza w formularzu “Departament”. Uaktualnienie wartości następuje przy pojawieniu się nowego rekordu w podformularzu czyli jako reakcja na zdarzenie “Przy bieżącym”. Przy czym to uaktualnienie ma sens, tylko wtedy gdy użytkownik wcześniej otworzył formularz wyskakujący “Uczestnictwo w projektach” naciskając przycisk “Projekty”. Z kolei naciśnięcie przycisku “Projekty” ma sens tylko wtedy, gdy pole [Numer] w podformularzu jest niepuste.

W poniższej procedurze występują dwie nowe właściwości, których wartościami są obiekty:

Private Sub Form_Current()
   On Error GoTo Err_Form_Current

   If IsNull(Me![Numer]) Then
      Me.Parent![Projekty].Enabled = False
   Else
      Me.Parent![Projekty].Enabled = True
   End If

   Dim Projekt As String
   Projekt = "[Numer]=Forms![Departament]![Osoba Subform].Form![Numer]"
   If Otwarty("Uczestnictwo w projektach") Then
      DoCmd.OpenForm "Uczestnictwo w projektach", , , Projekt
      Forms![Departament].SetFocus
      Forms![Departament]![Osoba Subform].SetFocus
  End If

  Exit_Form_Current:
   Exit Sub
  Err_Form_Current:
   MsgBox Err.Description
   Resume Exit_Form_Current
End Sub

Uaktualnienie formularza wyskakującego jest konieczne nie tylko, gdy fokus w podformularzu przejdzie do nowego rekordu, ale również gdy w bieżącym rekordzie zmieni się wartość [Numer]. Realizuje to procedura zdarzenia “Po aktualizacji” dla pola [Numer] - jej kod jest analogiczny do procedury zdarzenia "Przy bieżącym".

 


Zdarzenia dla obiektów interfejsu użytkownika (formularzy, raportów, elementów dialogowych)

Private Sub Form_Open(Cancel As Integer)
Dim strPass as String
strPassword = InputBox("Please enter the password: ")
 If strPass<>"IloveVB" Then
   MsgBox "Incorrect password"
   Cancel = True
 End If
End Sub

  

Private Sub Form_Load()
   Dim StrName As String
   MsgBox "Formularz wita!"
End Sub

 

Private Sub Form_Current()
   Forms!Pracownik.Caption = Me![Nazwisko]
End Sub

 

Private Sub Form_Delete(Cancel As Integer)
If MsgBox("Czy na pewno usunąć?", vbYesNo) = vbNo Then Cancel = True
End Sub

  

Private Sub cmdClickMe_Click()
   MsgBox "You clicked me."
End Sub

 

Private Sub Nazwisko_GotFocus()
   [lblNazwisko].Caption = "Rozpatrywany w tej chwili klient"
End Sub

 

Private Sub txtPass_Exit(Cancel As Integer)
     If Len(txtPass) < 8 Then
        MsgBox "Enter 8 or more characters."
        Cancel = True
   End If

End Sub

- bez wstrzymywania wyjścia: 

Private Sub txtPass_LostFocus()
   If Len(txtPass) < 8 Then
     MsgBox "Enter 8 or more characters."
   End If
End Sub

 


Funkcja DLookUp

Funkcja DLookUp umożliwia sprowadzenie z bazy danych pojedynczej wartości. Np.

=DLookUp("[Nazwa]";"Departament";"[Id]=Forms![Osoba]![Id]")

Ten sam efekt można byłoby uzyskać opierając formularz na kwerendzie złączającej zamiast na tabeli.

 

Za pomocą funkcji DLookUp można do pola formularza wprowadzać wartości obliczane przez kwerendę wybierającą - wystarczy najpierw zdefiniować taką kwerendę np. Zap_max    jako  

SELECT IIf(IsNull(Max([Numer])),1,Max([Numer])+1) AS Maks FROM Osoba;

a następnie użyć kwerendy jako źródła dla pola na formularzu:

=DLookUp("[Maks]"; "Zap_max")

Metodę tę można zastosować więc do generowania jednoznacznych numerów dla kluczy.