Edytor VBA – prywatne i publiczne

W edytorze  VBA każdy moduły własne obiektów ma charakter prywatny. Oznacza to, że wszystkie zapisane w nim funkcje i procedury są dostępne tylko z poziomu VBA.

Moduły ogólne są domyślnie publicznie. Zdefiniowane w nich procedury i funkcje publiczne są widoczne również z poziomu Accessa (m.in. w kreatorze wyrażeń). Funkcje i procedury prywatne mogą być wykorzystane jedynie z poziomu procedur zapisanych w tym samym module. 

Np. taka funkcje w module ogólnym:

Public Function PierwszyNumer()
   'funkcja publiczna
Pierwszy = DFirst(„NumerKatalogowy”, „TabelaKsiazki”, „DataP is null”)
End Function


Private Function OstatniNumer()
   'funkcja prywatna
OstatniNumer = DLast(„NumerKatalogowy”, „TabelaKsiazki”, „DataP is null”)
End Function

W kreatorze wyrażeń wygląda to tak:

kliknij, aby powiększyć

W bazie Biblioteka, w module ModuleFunction  widoczna jest tylko jedna funkcja – zdeklarowana jako Public. Prywatna funkcja OstatniNumer nie jest tu widoczna, może być wykorzystana tylko w obrębie tego samego modułu. 

Przy bardziej rozbudowanych projektach i  wielu procedurach w kodzie może być więcej modułów ogólnych z różnymi procedurami i funkcjami. Nie wszystkie z nich muszą być widoczne i dostępne również bezpośrednio w Accessie, czasem warto je „utajnić”. Wystarczy na początku modułu ogólnego wstawić Option Private Module

kliknij, aby powiekszyć

Od tej pory – wszystkie funkcje i procedury publiczne w takim module będą dostępne z innych modułów, ale nie w Accessie. 
W praktyce zawsze tak robię, porządkując funkcje i procedury i część z nich umieszczając je modułach prywatnych, a część – publicznych. Zmieniam też nazwy modułów, żeby się nie pogubić i utrzymać porządek w kodzie. 
Np. tak:

kliknij, aby powiększyć

 


A tu możesz mi postawić kawę: 

buycoffee.to/marzatela

Zdarzenie formularza: przy zamknięciu

 Przy zamknięciu to jedno ze zdarzeń uruchamiających się automatycznie przy zamykaniu formularza. Dostępne jest w arkuszu właściwości formularza oraz w module VBA formularza. 

W edytorze VBA jest to procedura o nazwie Form_Close. Jest uruchamiana automatycznie przy zamknięciu, niezależnie od sposobu, a jaki formularz jest zamykany: makrem, procedurą VBA czy po prostu przyciskiem Zamknij.
W ramach tej procedury można uruchomić każdą dowolną procedurę, sprawdzić np. czy wszystkie zmiany zostały zapisane, otworzyć inny formularz, tak, żeby  użytkownik nagle nie zobaczył pustego okna bazy Access itp. Możliwości jest sporo, w zależności od potrzeb. 

Trzeba jednak pamiętać o tym, że gdy w formularzu mamy przycisk do zamykania formularza, a jednocześnie jest oprogramowane zdarzenie Form_Close, zadziałają obie procedury. Musimy uważać, żeby nie były sprzeczne z sobą. 

Np.w takich procedurach:

Private Sub Form_Close()
DoCmd.OpenForm „menustart”    ’2 linia
End Sub
Private Sub Zamknij_Click()
DoCmd.Close   ’1 linia
DoCmd.OpenForm „ksiazka”     ’3 linia
End Sub

Po naciśnięciu przycisku Zamknij, uruchomiona zostanie przypisana do niego procedura i wykonana pierwsza linia kodu. Ponieważ do procedura zamykająca formularz, nastąpi przejście do automatycznego zdarzenia formularza czyli Form_Close i wykonana zostanie 2 linia kodu. Potem powrót do procedury Zamknij_Click i trzecia linia kodu. W efekcie zostaną otwarte 2 różne formularze, aktywny będzie formularza „ksiazka”. 

Linki do innych zdarzeń formularza:

Najczęściej używane zdarzenia formularza


A tu możesz mi postawić kawę: 

buycoffee.to/marzatela

Najczęściej używane procedury zdarzeń formularza

Zdarzenia formularza  to makra i procedury, bez których trudno wyobrazić sobie efektywną pracę aplikacji. 
Ja zdecydowanie preferuję korzystanie z procedur VBA. Moim zdaniem jest to zdecydowanie lepsze. Dla tych, którzy mają z tym problem na początek polecam skorzystanie z kreatora makr i przekonwertowanie ich do procedur VBA. W ten sposób również można się wiele nauczyć. 
Warto zajrzeć tu:

Makra

W praktyce najczęściej stosowane zdarzenia formularza to: 

    • Przy aktywowaniu
      procedura automatycznie uruchamiana przy otwarciu formularza.
    • Przy deaktywowaniu
      – procedura automatycznie uruchamiana przy deaktywowania formularza
    • Przy otwarciu
      procedura automatycznie uruchamiana przy otwarciu formularza.
    • Przy załadowaniu
      procedura automatycznie uruchamiana przy załadowaniu formularza.
    • Przy zamknięciu
      –  procedura automatycznie uruchamiana przy zamknięciu formularza.
  •  

Kolejne zdarzenia formularza  z linkami do procedur będą się tu  sukcesywnie pojawiać. 
Zapraszam. 


A tu możesz mi postawić kawę: 

buycoffee.to/marzatela

Zamykanie bazy danych

Do zamykania bazy danych kodem VBA służy metoda docmd CloseDatabase.
Metoda Docmd.CloseDatabase nie ma żadnych argumentów – zamyka po prostu aktywną bazę danych.
Jakoś nie przypominam sobie, żeby w swoich projektach kiedyś stosowała tę metodę.


Kurs Access - programowanie w VBA

 

Kwerenda parametryczna w kodzie VBA

Prostą kwerendę parametryczną opisałam tu:
Kwerenda parametryczna
Operator Like

Oczywiście to tylko proste przykłady i dla kwerend bezpośrednio w Accessie. A jak zrobić to w VBA?
Załóżmy, że mamy taki formularz ciągły:

kliknij, aby powiększyć

Jego źródłem rekordów jest kwerenda

SELECT TabelaKsiazki.NumerKatalogowy, TabelaKsiazki.Autor, TabelaKsiazki.Tytul, TabelaKsiazki.Cena, TabelaKsiazki.Dzial, TabelaKsiazki.DataP FROM TabelaKsiazki LEFT JOIN TabelaDzial ON TabelaKsiazki.Dzial = TabelaDzial.IDKat;

W nagłówku formularza jest też niezwiązane pole tekstowe TSzukaj  oraz przycisk polecenia PolecenieSzukaj , pod którym jest procedura VBA.  Załóżmy, że chcemy wyfiltrować rekordy, gdzie w tytule jest zawarty jest tekst wpisany do pola TSzukaj. Taka procedura mogłaby wyglądać tak:

Private Sub PolecenieSzukaj_Click()
Dim MojaKwerenda As String
Dim CoSzukam As String
CoSzukam = Nz(Me.TSzukaj, „”)
If CoSzukam = „” Then
MojaKwerenda = „SELECT TabelaKsiazki.NumerKatalogowy, TabelaKsiazki.Autor, TabelaKsiazki.Tytul, TabelaKsiazki.Cena, TabelaKsiazki.Dzial, TabelaKsiazki.DataP ” & _
„FROM TabelaKsiazki LEFT JOIN TabelaDzial ON TabelaKsiazki.Dzial = TabelaDzial.IDKat;”
Else
MojaKwerenda = „SELECT TabelaKsiazki.NumerKatalogowy, TabelaKsiazki.Autor, TabelaKsiazki.Tytul, TabelaKsiazki.Cena, TabelaKsiazki.Dzial, TabelaKsiazki.DataP ” & _
„FROM TabelaKsiazki LEFT JOIN TabelaDzial ON TabelaKsiazki.Dzial = TabelaDzial.IDKat ” & _
„WHERE TabelaKsiazki.Tytul Like '*” & CoSzukam & „*’;”
End If
Me.RecordSource = MojaKwerenda
Me.Requery
End Sub

We wpisie na blogu, w zależności od przeglądarki,  może to różnie wyglądać, więc na wszelki wypadek zwracam uwagę na łamanie linii w zapisie kodu SQL w edytorze VBA – jest to ciąg tekstowy, więc koniec linii musi być zakończony znakami & _  (pomiędzy znakami jest spacja).

Sam parametr – w tym przypadku prezentowany przez zmienną CoSzukam, też ma swoje wymagania. Jest zapisany w linii kodu:
WHERE TabelaKsiazki.Tytul Like *” & CoSzukam & „*;”
Na czerwono zaznaczyłam znaki apostrofu górnego – sa konieczne, jeśli będąca parametrem zmienna jest typu String czyli tekstowa. Natomiast te gwiazdki – to symbole zastępcze związane z operatorem Like. Oczywiście można użyć innych symboli z listy tam wymienionych. Gdyby na początku nie było gwiazdki – kwerenda zwróciłaby rekordy, gdzie powiązane pole zaczynałoby się dokładnie tym, co jest wpisane w TSzukaj.

Dla wartości wartości typu Data – zamiast apostrofów musi być natomiast znak #. Dla wartości liczbowych – nie ma w ogóle znaków, w które wstawiany jest parametr. Nie stosuje się też tu operatora Like.


Kurs SQL w analizie danych - zaawansowane techniki