Przejdź do głównej zawartości
Pomoc techniczna
Zaloguj się przy użyciu konta Microsoft
Zaloguj się lub utwórz konto.
Witaj,
Wybierz inne konto.
Masz wiele kont
Wybierz konto, za pomocą którego chcesz się zalogować.

Zawartość w tym miejscu może dotyczyć wersji Northwind 2.0 Developer Edition i Starter Edition. 

VBA (Visual Basic for Applications) to język programowania używany we wszystkich produktach pakietu Office. Nauka języka VBA umożliwia pracę ze wszystkimi produktami pakietu Office (nie tylko z programem Access).
Podczas wyszukiwania frazy "how-to" poszukaj konkretnych przykładów programu Access i uwzględnij w wyszukiwaniu program Microsoft Access. Często rozwiązania dla innych produktów pakietu Office będą działać , ale nie ma żadnej gwarancji. Microsoft Access to produkt dla dorosłych; oznacza to, że istnieje wiele przykładów. co jest dla Ciebie doskonałe! 

Oznacza to również, że starsze książki dotyczące programowania w programie Access są nadal opłacalne. Wiele starszych książek jest nadal dostępnych w używanych witrynach książek za ułamek ich oryginalnych kosztów. Zajrzyj do witryny internetowej firmy Microsoft, aby ustalić, które wersje programu Access są nadal obsługiwane, i przejdź do nich.

Zakończenie świadczenia pomocy technicznej dla pakietu Office — wdrażanie pakietu Office | Microsoft Learn  

Poniżej znajdują się linki do dokumentacji programu Access w firmie Microsoft.

Pliki programu Microsoft Access to pliki pakietu Office. Pliki pakietu Office muszą znajdować się w "zaufanej lokalizacji" lub mieć włączoną zawartość. Te elementy są uważane za "bezpieczne", ponieważ zostały utworzone przez Ciebie lub pochodzą z zaufanego źródła. Sprawdzanie, czy są zaufane lokalizacje, odbywa się za każdym razem, gdy otwierasz dowolny plik pakietu Office. W tym miejscu będziemy nazywać to zaufanymi/włączonymi. UWAGA: Jeśli nowa wersja aplikacji zostanie wydana i otwarta z lokalizacji niezau zaufanej, proces włączania zawartości powtórzy się.

Dowiedz się więcej o zaufanych lokalizacjach. 

Makra, funkcje i subs to sposób implementowania logiki biznesowej w bazie danych programu Access. Przed rozpoczęciem ważne jest zrozumienie zakresu i widoczności .


Zdarzenia (takie jak kliknięcie kontrolki) w kontrolkach formularza (np. przyciski, pola tekstowe, etykiety itp.) powodują wyzwalanie innych procesów, takich jak dodawanie, usuwanie rekordów czy otwieranie formularzy. Te procesy można zaimplementować przy użyciu makr lub języka VBA. W programie Northwind Starter Edition są używane głównie makra, a w niektórych językach VBA makra nie umożliwiają wykonywania wymaganych funkcji. Northwind Developer Edition używa przede wszystkim języka VBA. 

Niektóre typy kontrolek mają wbudowanych kreatorów, którzy automatycznie tworzą makro. Na przykład dodanie przycisku polecenia do formularza powoduje otwarcie kreatora z kilkoma opcjami działania tego przycisku. Dodanie pola kombi powoduje otwarcie kreatora, który można skonfigurować w celu znalezienia określonego rekordu w formularzu. 

Okienko nawigacji to główny sposób wyświetlania i uzyskiwania dostępu do wszystkich obiektów bazy danych, który jest domyślnie wyświetlany po lewej stronie okna programu Access. 
Okienko nawigacji Northwind zostało dostosowane. Utworowaliśmy kategorię niestandardową o nazwie Northwind Starter 2.0. Dzięki temu możemy organizować obiekty według obszaru funkcjonalnego.

Czasami potrzebujesz zmiennej, aby istniała po tym, jak obiekt, który ją utworzył, wykracza poza zakres. Zobacz Zakres i widoczność powyżej. Istnieją trzy podstawowe sposoby wykonywania tej czynności: zmienne publiczne, zmienne tymczasowe i przechowywanie wartości w tabeli lokalnej. Wielu deweloperów korzysta z ich kombinacji. Każdy ma swoje wady i zalety.  Więcej informacji o każdej z nich znajdziesz tutaj: 

Zmienna publiczna modułu VBA: 

TempVars: 

Przechowywanie wartości w tabeli lokalnej

  • Zmienne publiczne i tempvars istnieją dla bieżącej sesji i wykraczają poza zakres po zamknięciu aplikacji. Ale co zrobić, jeśli chcesz zachować zmienne specyficzne dla użytkownika w sesjach? Te typy wartości można przechowywać w tabeli lokalnej. W northwind 2.0 jedna taka zmienna jest zapisywana w tabeli o nazwie SystemSettings. Wartość w tabeli to ShowWelcome. Ta wartość informuje program Access, czy ekran powitalny ma być wyświetlany przy każdym logowaniu.

Deweloperzy często muszą przekazywać parametry z jednego formularza do innego lub z formularza do raportu. Te parametry przekazują ważne informacje, które funkcja będzie następnie używać do konfigurowania samej siebie. Istnieje kilka sposobów uzyskiwania informacji z pierwszego formularza przez drugi formularz lub raport. Oto kilka z tych sposobów: 

  1. Drugi formularz może "spojrzeć wstecz" na pierwszy formularz w celu odebrania niektórych wartości, prawdopodobnie w widocznej lub niewidocznej kontrolce.  Na przykład:
    lngCustomerID = Forms!FirstForm!cboCustomerID 

  2. W pierwszej formie można zapisywać wartości w zmiennych globalnych lub w formacie TempVars. Na przykład:
    g_lngUserID = Me.cboUserID 
    TempVars.Add "UserID", Me.cboUserID 

Metoda często stosowana zarówno w wersji Northwind Developer Edition, jak i w naszym życiu zawodowym jest użycie argumentu OpenArgs pliku DoCmd.OpenForm lub OpenReport. Przykład:

DoCmd.OpenForm "frmCompanyDetail", OpenArgs:=StringFormat("CompanyID={0} &CompanyTypeID={1}", Me.VendorID, ctVendor)

Łączymy tu dwie techniki: (1) użycie OpenArgs do przekazania w polach VendorID i VendorType oraz (2) użycie funkcji StringFormat() w celu utworzenia, na przykład tego ciągu: 

CompanyID=5&CompanyTypeID=2 

Ten ciąg wygląda bardzo podobnie do ciągu zapytania używanego w przeglądarce. Zawiera jedną lub więcej par "nazwa/wartość" oddzielonych znakiem handlowego i znakiem: 

name1=value1&name2=value2


Zaletą takiego ciągu jest to, że każda wartość ma nazwę. Porównaj to z prostszym podejściem, w którym można ustawić wartość OpenArgs tylko na wartość "5,2".  W takim przypadku należy podjąć wysiłek, aby dowiedzieć się, co oznacza każda wartość. Nazywanie każdej wartości sprawia, że ciąg zapytania jest "samoopisem", co jest dobrą praktyką programowania.

Na końcu odbioru doCmd.OpenForm jesteśmy zazwyczaj w Form_Open lub Form_Load zdarzenia i chcesz przeanalizować ciąg OpenArgs do jego składników.

W northwind można to zrobić za pomocą funkcji StringToDictionary . Przyjmuje funkcję przypominającą zapytanie i analizuje ją w swoich składnikach. Te składniki są następnie przechowywane w obiekcie Scripting.Dictionary . Należy pamiętać, że w ten sposób należy użyć narzędzi > Odwołań i ustawić odwołanie do środowiska wykonawczego skryptów firmy Microsoft (scrrun.dll).

Funkcje i zalety obiektu Dictionary obejmują następujące elementy:  

  • Kolejność elementów nie jest ważna

  • Proste funkcje dodawania i usuwania elementów kolekcji

  • Funkcje do pętli nad kolekcją, dzięki czemu możesz wiedzieć, co w niej jest

  • Funkcja Exists umożliwiająca sprawdzenie dostępności określonego elementu

Użycie obiektu słownika jest wyświetlane w całym obszarze Northwind. Na przykład zdarzenie Form_Load w dzienniku frmGenericDialog.

Makra utworzone za pomocą Kreatorów kontrolek w programie Access rzadko zawierają obsługę błędów. Język VBA utworzony za pomocą Kreatorów kontrolek może być ograniczony do ogólnego pliku MsgBox Err.Description.

W northwind 2.0 pokażemy, jak to zrobić lepiej podczas korzystania z kodu VBA. Zaimplementowaliśmy tak zwaną globalną obsługę błędów. Błędy występujące w dowolnej procedurze wywołują funkcję na poziomie globalnym w celu wyświetlenia błędu. Dużą zaletą jest to, że obsługa błędów jest spójna. Jeśli komunikat wymaga zmiany (np. w celu wyświetlenia numeru błędu lub zarejestrowania błędu w pliku), należy to zrobić tylko w jednym miejscu. 

clsErrorHandler to moduł klasy, który implementuje kod obsługi błędów. Moduł klasy przechowuje wszystkie główne i pomocne funkcje razem w jednej jednostce, w ten sposób hermetyzując kod.

Makro AutoExec wywołuje funkcję Uruchamianie w menu modStartup. W wersji Starter funkcja tworzy wystąpienie clsErrorHandler i zapisuje je jako zmienną globalną dostępną do użycia w całej aplikacji. W wersji Dev używana jest klasa statyczna — zobacz komentarze u góry modułu klasy.

W rzeczywistości kod obsługi błędów w procedurach jest tak spójny, że udało nam się utworzyć go wszystkie w czasie krótszym niż pięć minut przy użyciu określonego kodu VBA, który wyposażył każdą procedurę we właściwą procedurę obsługi błędów. (Kod nieuwzględniany w szablonie). Zarówno wersje szablonów Northwind 2.0 Starter, jak i Developer zostały początkowo wyposażone w takie podejście do obsługi błędów. 
'

ULEPSZONA OBSŁUGA BŁĘDÓW

Począwszy od wersji 2.2 wersji Northwind Developer Edition, program obsługi błędów został ulepszony dzięki opiniom społeczności programu Access. Wersja Starter pozostaje bez zmian. 

W istocie program obsługi błędów w poprzedniej wersji (2.0 — wydanej w kwietniu 2023 r.) to:

Public Sub HandleError(…)
    MsgBox Err.Description
End Sub


W wersji 2.2 jest uaktualniona do:

Public Sub HandleError (…, Optional ByVal IsEventProcedure As Boolean = False)
    If Not IsEventProcedure Then
        Err.Raise lngError, strErrSource
    End If
    MsgBox Err.Description
End Sub


Aby zrozumieć, dlaczego ta zmiana została wprowadzona, najpierw opiszmy, co powoduje uruchomienie kodu:

  • Makro AutoExec wywołuje procedurę uruchamiania, która wykonuje niektóre inicjowania przed otwarciem pierwszego formularza.

  • Użytkownik wchodzi w interakcję z aplikacją, na przykład otwierając formularz lub klikając przycisk, powodując wywołanie procedur zdarzeń, takich jak Form_Load i cmdPrintInvoice_Click.
    '

Oprócz procedur zdarzeń aplikacje mają podprogramy i funkcje — głównie w modułach — i ten kod jest wywoływany z procedur zdarzeń. Są one nazywane procedurami "standardowymi".

W wersji 2.0 programu Northwind standardowe procedury obsługiwały własne błędy z wiadomościami, ale w jakiś sposób nie powiadamiały procedury zdarzenia wywołującego o wystąpieniu błędu. Może to być złe, jeśli procedura zdarzenia ma kolejny kod, który powinien zostać uruchomiony niezależnie od poprzedniego błędu obsługiwanej przez wywołaną procedurę. Oczywiście, możemy zastąpić podprogram funkcją, która zwraca sukces lub porażkę, i odpowiednio zakoduj procedurę zdarzenia, ale nie zawsze jest to możliwe.

W programie Northwind w wersji 2.2 standardowe procedury nie obsługują komunikatów o błędach, lecz za pomocą błędu Err.Raise zgłoś je z powrotem do procedury zdarzenia wywołującego. Następnie w procedurze zdarzenia wywołującego jest wyświetlany podniesiony błąd i zostaje wznowiony o Exit_Handler. Jest to lepsze, ponieważ pozwala procedurze wywoływania zakończyć się z wdziękiem.

Aby użyć kodu northwind w wersji 2.2, procedury zdarzeń muszą przejść do HandleError trzeci argument wskazujący, że wywołujący jest procedurą zdarzenia. W tym celu zaktualizowano wersję Northwind Dev Edition.

Jeszcze bardziej zaawansowany moduł obsługi błędów obsługuje procedury "wypychania i pojawiania się" na "stosie" (tablicy). Pierwszym elementem zawsze byłaby procedura zdarzenia, więc dodatkowy argument nie jest potrzebny. Ta implementacja wykracza poza cele Northwind Dev Edition.

Mru lub Ostatnio używane to lista ostatnio używanych zamówień i zamówień zakupu. Możesz wrócić do tych często używanych elementów, aby umieścić je w następnym statusie. Listy mru są często widoczne w produktach pakietu Office jako lista ostatnio używanych plików, które można ponownie otworzyć.

w wersji Northwind Dev, aby zaimplementować funkcję MRU (która nie istnieje w wersji Starter), należy najpierw ustalić następujące elementy: 

  1. Tabela do przechowywania informacji mru.

  2. Kod, aby zaktualizować tabelę przy otwarciu zamówienia zakupu lub zamówienia zakupu.

  3. Kod do zaktualizowania listy rozwijanej MRU na wstążce.

  4. Kod umożliwiający załadowanie elementu, gdy na wstążce wybrano element MRU.

Przyjrzyjmy się każdemu z nich bardziej szczegółowo. 


1. Tabela do przechowywania informacji MRU.

Projekt tabeli MRU warto przejrzeć, zwłaszcza jego indeksy. Należy pamiętać, że istnieje zduplikowany indeks SortIdx ułatwiający szybkie sortowanie elementów MRU na liście rozwijanej wstążki, a także unikatowy indeks wymuszający regułę biznesową, która dla każdego użytkownika może wystąpić tylko raz. Na przykład dwukrotne otwarcie tej samej kolejności nie powoduje utworzenia dwóch rekordów w tabeli MRU.


Tabela korzysta z faktu, że wszystkie pola klucza podstawowego związane z MRU w bazie danych są typu Autonumerowanie, dzięki czemu typ danych Liczba całkowita długa może być używany dla funkcji PKValue.

2. Kod, aby zaktualizować tabelę po otwarciu zamówienia lub O.O.

W nw2 zdecydowaliśmy się dodać do listy MRU tylko wtedy, gdy nowy rekord został utworzony, a nie wtedy, gdy istniejący został zaktualizowany ponownie. Z pewnością moglibyśmy przenieść połączenie AddToMRU z Form_AfterInsert do Form_AfterUpdate w celu obsługi tego.

Procedury AddToMRU i DeleteFromMRU są implementowane w modGlobal, który jest modułem standardowym, którego procedury publiczne są widoczne z dowolnej formy.

AddToMRU (jak sama nazwa wskazuje) dodaje nowy element do tabeli MRU, a następnie opcjonalnie przycina go z powrotem, usuwając najstarszy rekord, jeśli urósł poza maksymalny rozmiar (MAX_MRU_COUNT). Ostatni krok jest prawdopodobnie najmniej znany deweloperom programu Access: lista rozwijana wstążki musi zostać odświeżona i można to osiągnąć, wywołując wywołanie InvalidateControl. Jest to sygnał dla wstążki, aby ponownie uruchomić proces inicjowania. 

3. Kod do zaktualizowania listy rozwijanej MRU na wstążce. 

Podczas uruchamiania i po wywołaniu invalidateControl jest wykonywany złożony zestaw funkcji w celu wypełnienia wstążki.  Poniższe procedury są nazywane przez język XML Wstążki w tabeli uSysRibbons , który częściowo mówi:

<group id="gCurrentStatus" label="MRU">
    <box id="bxMRU" boxStyle="vertical">
        <dropDown id="ddMRU"
                  getItemCount="ddMRU_GetItemCount"
                  getItemLabel="ddMRU_GetItemLabel"
                  getSelectedItemIndex="ddMRU_GetSelectedItemIndex"
                  getItemID="ddMRU_GetItemID"
                  onAction="ddMRU_OnAction"
                  screentip="Most Recently Used Objects">
        </dropDown>
    </box>
</group>

Te cztery funkcje wywołania zwrotnego wypełniają listę rozwijaną. Należy pamiętać, że jest to bardzo ten sam pomysł, jak opisano tutaj dla standardowych comboboxes.

Jeśli usuniesz wiersze Debug.Print w modRibbonCallback i uruchomisz ponownie aplikację, w oknie bezpośrednim zostanie wyświetlona następująca sekwencja: 

ddMRU_GetItemCount    ddMRU    6 
ddMRU_GetItemLabel    ddMRU    0      Order 60, Proseware, Inc.
ddMRU_GetItemID       ddMRU    0       2 
ddMRU_GetItemLabel    ddMRU    1      Order 62, Best For You Organics Company
ddMRU_GetItemID       ddMRU    1       4 
ddMRU_GetItemLabel    ddMRU    2      Order 63, Wide World Importers
ddMRU_GetItemID       ddMRU    2       5 
ddMRU_GetItemLabel    ddMRU    3      Order 66, Proseware, Inc.
ddMRU_GetItemID       ddMRU    3       8 
ddMRU_GetItemLabel    ddMRU    4      Order 67, Best For You Organics Company
ddMRU_GetItemID       ddMRU    4       9 
ddMRU_GetItemLabel    ddMRU    5      Order 68, Adatum Corporation
ddMRU_GetItemID       ddMRU    5       10 
ddMRU_GetSelectedItemIndex  ddMRU    0


Widać tutaj, że program Access najpierw wywoływa procedurę, która zwraca liczbę elementów do załadowania w argumacie ByRef ddMRU_GetItemCount. Jest to również czas, kiedy otwieramy zapytanie w tabeli MRU i zapisujemy je w pamięci podręcznej, ponieważ będzie ono używane kilka razy. 

Następnie wstążka wielokrotnie wywołuje dwie procedury w celu uzyskania wartości Identyfikator i Etykieta dla listy rozwijanej z dwiema kolumnami. 

Na koniec wywołuje procedurę wyłączania tego, który element powinien zostać wybrany. (W naszym przypadku jest to pierwszy). 

4. Kod do ładowania elementu, gdy element MRU jest wybrany ze wstążki.

Podobnie jak w przypadku każdego innego elementu wstążki właściwość OnAction w języku XML Wstążki określa funkcję wywołania zwrotnego, która ma zostać użyta do wykonania akcji:

onAction="ddMRU_OnAction"

Ta procedura jest implementowana w modRibbonCallback. Ponownie używa już otwartego zestawu rekordów do znalezienia rekordu z wybranym elementem, a następnie, w zależności od wymaganej nazwy tabeli, otwiera odpowiedni formularz, przechodząc do załadowanej wartości PK.

Potrzebujesz dalszej pomocy?

Chcesz uzyskać więcej opcji?

Poznaj korzyści z subskrypcji, przeglądaj kursy szkoleniowe, dowiedz się, jak zabezpieczyć urządzenie i nie tylko.

Społeczności pomagają zadawać i odpowiadać na pytania, przekazywać opinie i słuchać ekspertów z bogatą wiedzą.

Czy te informacje były pomocne?

Jaka jest jakość języka?
Co wpłynęło na Twoje wrażenia?
Jeśli naciśniesz pozycję „Wyślij”, Twoja opinia zostanie użyta do ulepszania produktów i usług firmy Microsoft. Twój administrator IT będzie mógł gromadzić te dane. Oświadczenie o ochronie prywatności.

Dziękujemy za opinię!

×