czym są i jak działają moduły (61 str)


Instrukcja For Each stosowana do kolekcji

Obiekty typu Recordset

Lista z możliwością wyboru jednoczesnego wielu elementów

Współdzielenie danych z innym aplikacjami

Moduły: Czym są i jak działają

Co to jest moduł?

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

Procedura jest jednostką kodu języka Visual Basic for Applications. Procedura zawiera szereg instrukcji i metod, które wykonują określone operacje lub służą do obliczania wartości.

Istnieją dwa podstawowe typy modułów: moduły klasy i moduły standardowe. Każda procedura w module może być procedurą typu Function lub procedurą typu Sub.

Moduły klasy

moduł klasy

Moduł, który może zawierać definicję nowego obiektu. Kiedy użytkownik tworzy nową instancję klasy, tworzy on nowy obiekt. Wszelkie procedury zdefiniowane w tym module stają się właściwościami i metodami tego obiektu.

W programie Microsoft Access moduły klas istnieją zarówno niezależnie, jak i w powiązaniu z formularzami i raportami.

Moduły formularza i moduły raportu są modułami klasy związanymi z określonym formularzem lub raportem. Moduły formularza i raportu często zawierają procedury zdarzeń, które są uruchamiane w odpowiedzi na zdarzenie formularza lub raportu. Procedur zdarzeń można używać do sterowania działaniem formularzy i raportów oraz ich odpowiedziami na akcje użytkownika, takie jak np. kliknięcie przyciskiem myszy przycisku polecenia.

FORMULARZ

RAPORT

MODUŁ

Moduł formularza

Moduł raportu

procedura

procedura

procedura

procedura

procedura

procedura

procedura

procedura

procedura

procedura

W dwóch pierwszych kolumnach mamy moduły klas, które są zlokalizowane wewnątrz formularza lub raportu.

Natomiast w trzeciej kolumnie mamy do czynienia z modułami standardowymi.

moduł standardowy

Moduł standardowy

Moduły standardowe zawierają ogólne procedury, które nie są związane z żadnym innym obiektem, oraz często używane procedury, które można uruchamiać z dowolnego miejsca w bazie danych.

Listę modułów standardowych w bazie danych można obejrzeć klikając kartę Moduły w oknie bazy danych. Lista modułów formularzy, raportów oraz modułów standardowych jest również wyświetlana w Przeglądarce obiektów.

Moduł, w którym można umieścić procedury Sub i Function, które mają być dostępne dla innych procedur w bazie danych.

Istnieją dwa rodzaje procedur:

Każdy formularz i raport w bazie danych posiada wbudowany moduł formularza lub moduł raportu, który zawiera szablony procedur. Można dodać kod uruchamiany w odpowiedzi na zdarzenia występujące w formularzu, raporcie lub formantach formularza czy raportu. Kiedy program Microsoft Access rozpoznaje wystąpienie zdarzenia w formularzu, raporcie lub formancie, automatycznie uruchamia procedurę zdarzenia dla danego obiektu lub zdarzenia. Można na przykład napisać procedurę ustawiającą fokus w polu tekstowym "Nazwisko żony/męża" uruchamianą w momencie zaznaczenia przez użytkownika pola wyboru "Żonaty/zamężna".

Wskazówka Wiele kreatorów (na przykład Kreator przycisków poleceń) tworzących obiekty tworzy również procedury zdarzeń dla tych obiektów. Zapoznanie się z tymi procedurami zdarzeń ułatwia zrozumienie sposobu działania procedur.

Ponieważ funkcje zwracają wartości, są używane w wyrażeniach. Wyrażenia zawierające funkcje są często wykorzystywane w programie Microsoft Access, na przykład w instrukcjach i metodach języka Visual Basic, w wielu ustawieniach właściwości czy w wyrażeniach kryteriów w filtrach i kwerendach.

Gdy użytkownik po raz pierwszy tworzy procedurę zdarzenia dla formularza lub raportu, program Microsoft Access automatycznie tworzy związany z nią moduł formularza lub raportu. Aby zobaczyć kod modułu dla formularza lub raportu, należy kliknąć przycisk Kod na pasku narzędzi w widoku "Projekt" formularza lub raportu.

Uwaga Aby użyć funkcji jako ustawienia właściwości, ta funkcja musi znajdować się w mudule formularza lub raportu lub w module standardowym. Nie można użyć funkcji w module klasy, która nie jest związana z formularzem lub raportem, jako ustawienia właściwości formularza lub raportu.

Zarówno procedury typu Sub, jak i procedury typu Function mogą akceptować argumenty. Aby uzyskać więcej informacji na temat użycia argumentów w języku Visual Basic, należy kliknąć .

Używanie argumentów w języku Visual Basic

Argument dostarcza dodatkowych informacji procedurze, instrukcji lub metodzie. Przy tworzeniu procedury typu Function lub procedury typu Sub, deklarowane są argumenty, dzięki którym procedura przy wywoływaniu otrzymuje odpowiednie informacje.

Przy wywoływaniu procedury posiadającej argumenty, należy określić argumenty, które mają zostać jej przekazane. Argumenty określa się również dla wielu instrukcji i metod.

Otwarcie procedury zdarzenia Click przycisku

Jeżeli do tworzenia przycisku poleceń zostanie wykorzystany Kreator przycisków z reguły wtedy jest umieszczana procedura w module formularza.

Dostęp do procedury zapisanej w module formularza;

Kod zapisany jest wykonywany automatycznie jeżeli klikniemy na danym przycisku.

jednym z najważniejszych elementów tej procedury jest poniższa linijka, która nakazuje programowi Access przejść do nowego rekordu;

DoCmd.GoToRecord , , acNewRec

Wyjaśnienie pozostałej części kodu;

Modyfikowanie przycisku polecenia utworzonego przez kreatora

Dodawanie przycisku klawisza do przycisku polecenia - oznacza to iż polecenie będzie realizowane po naciśnięciu określonego klawisza.

Przy tworzeniu przycisku polecenia z użyciem kreatora nie jest mu przypisany klawisz. Realizacja tego przebiega w następujących krokach;

Dodawanie linii kodu do procedury zdarzenia przenoszącej fokus

Tworzymy polecenie, którego zadaniem jest przerzucenie nas do nowego rekordu z jednoczesnym ustawieniem kursora na pierwszym polu. Jeżeli wykorzystamy kreatora zdarzeń do utworzenia polecenia przejścia do nowego rekordu to nie oznacza, to iż kursor będzie ustawiony na pierwszym polu nowego rekordu (fokus nie będzie związany z pierwszym polem). Mówimy, że fokus nadal pozostaje na przycisku polecenia.

Poniżej przedstawiona jest procedura postępowania, która prowadzi do stworzenia kodu, który przeniesie nas do nowego rekordu i ustawi fokus na pierwszym polu (kursor na pierwszym --> polu[Author:W M ] ).

Ustawianie formularza tylko do odczytu - bez wykorzystywaniu kodu Visual Basic

Realizujemy to poprzez zmiany właściwości formularza. Sposób postępowania jest następujący;

Tworzenie przycisku polecenia bez pomocy kreatora

Tworzenie przycisku umożliwiającego edycję rekordu. Przed chwilą zablokowaliśmy możliwość edycji w formularzu.

Tworzenie procedury obsługującej zdarzenie Click dla tego przycisku;

Umieszczanie komentarza w procedurze

Jak dopisać komentarz do procedury będącej w module klas;

Tworzenie pola kombi wyszukującego rekordy

Podstawową metodą wyszukiwania rekordu w formularzu jest wykorzystanie opcji znajdź dostępnej z menu lub przy użyciu kombinacji klawiszy Ctrl + F. nie jest to wygodny sposób wyszukiwania informacji. W formularzu utworzymy pole typu kombi pozwalające nam wyszukiwać informacje. Procedura tworzenia;

Zmiana listy pola kombi

Zbudowaliśmy przy pomocy kreatora pole kombi i jako rozwijaną listę uzyskujemy dwie kolumny. Naszym celem jest połączenie informacji pochodzących z tych dwóch kolumn (nazwisko i imię). Poniższa procedura wyjaśnia jak to można osiągnąć;

Dodawanie kodu synchronizacji - zgodność informacji w polu kombi z informacjami pochodzącymi z danego rekordu

Utworzone pole kombi spełnia nasze oczekiwania. Jednak dostrzegamy pewną jego wadę, polegającą na niezgodności informacji zawartych w polu kombi z pozostałymi informacjami wyświetlanymi na formularzu. Zjawisko to ma miejsce wtedy gdy przechodzimy do innych rekordów bazy danych bez wykorzystywania pola kombi. Takie zachowanie należy tłumaczyć faktem, iż pole te nie jest formantem związanym. Jak rozwiązać problem aktualizacji danych w polu kombi.

Rozpoznanie kodu Visual Basic, który został dopisany przez kreatora podczas tworzenia pola kombi do wyszukiwania rekordów

Poniższy fragment wymaga wyjaśnienia:
Sub Kombi26_AfterUpdate()

' Znajdź rekord, który pasuje do formantu.

Me.RecordsetClone.FindFirst "[Numer szczegółowy kursu] = '" & Me![Kombi26] & "'"

Me.Bookmark = Me.RecordsetClone.Bookmark

End Sub

To należy rozszyfrować

Kod synchronizacji dla pól kombi

0x08 graphic
Często podczas wypełniania formularza wybór dokonany w jednym polu typu lista lub kombi przesądza o możliwościach wyboru w innym polu kombi czyli lista. Zrealizowanie tego zadania wymaga wprowadzenia kodu w Visual Basicu

W przedstawionym powyżej przykładzie wybór kategorii przesądza o możliwościach w polu produkty.

Rozwiązanie problemu przedstawimy dla przypadku gdy typ źródła dla drugiego pola lista (ewentualnie pola kombi) jest kwerenda.

Sposób postępowania;

Requery, metoda (obiekty Control i Form)

Metoda Requery aktualizuje dane określonego formularza lub formantu znajdującego się na aktywnym formularzu, przez ponowienie kwerendy źródła danych dla tego formularza lub formantu.

Składnia

[obiekt.]Requery

Dla metody Requery używany jest następujący argument.

Argument Opis

obiekt Obiekt Form lub Control reprezentujący formularz lub formant przeznaczony do aktualizacji. Jeśli argument ten jest pusty wykonywana jest kwerenda źródła danych aktywnego obiektu.

Uwagi

Tą metodę należy stosować, aby zapewnić, że formularz lub formant wyświetla najświeższe dane.

Metoda Requery wykonuje jedną z poniższych czynności:

Do formantów opartych na kwerendzie lub tabeli należą:

Jeśli jako argument obiekt zostanie określony inny typ formantu, ponawiana jest kwerenda źródła rekordów formularza.

Jeśli formant określony przez argument obiekt nie jest związany z polem tabeli ani kwerendy, metoda Requery wymusza obliczenie formantu.

Jeśli argument obiekt jest pusty, metoda Requery wykonuje ponowną kwerendą źródła danych formularza lub formantu, który ma fokus. Jeśli formant, który ma fokus ma źródło rekordów lub źródło wierszy, zostanie ponowiona kwerenda. Jeśli nie, dane zostaną po prostu odświeżone.

Jeśli formant podformularza ma fokus, metoda ponawia kwerendę źródła rekordów tylko dla podformularza, a nie dla formularza głównego.

Uwagi

Filtrowanie danych

W programie Access dostępne są trzy metody filtrowania rekordów

Chcemy dopisać kod, którego zadaniem będzie wyświetlanie komunikatu ułatwiający działanie użytkownikowi w obszarze filtrów

Pierwsza procedura będzie związana z komunikatem pojawiającym się w momencie uruchomienia procedury filtrowania według formularza;

Kolejny kod będzie wykorzystywał instrukcję warunkową

Chcemy aby powyższy komunikat pojawiał się tylko wtedy gdy użytkownik zastosuję opcję filtrowania według formularza. Do sprawdzania, które polecenie uruchomiło zdarzenie Filter wykorzystamy argument FilterType procedury zdarzenia Filter.

Poprzednio wprowadzony kod modyfikujemy nowym kodem;

If FilterType = acFilterbyForm

Then

MsgBox („Wybierz wartości w polach”)

End If

Jeżeli użytkownik wybrał opcję filtrowania według formularza to na ekranie pojawi komunikat w oknie.

Kilka słów na temat filtrowania

Podczas filtrowania danych za pomocą standardowych poleceń Access nadaje nowe wartości dwóm właściwościom Filter oraz FilterOn.

W pierwszej przechowywana jest informacja o kryteriach filtrowania, natomiast druga informuje czy filtr jest aktualnie zastosowany.

Okno analizy programu jako narzędzie służące do przeglądania i ustalania właściwości

Dostęp do okna analizy programu jest realizowany w następujących krokach;

Okno analizy programu podzielone jest na dwie części. My będziemy wykorzystywać dolną część okna. Kilka poniższych przykładów da obraz wykorzystania okna analizy programu.

  1. Wpisujemy w nim Beep i naciskamy Enter - efekt komputer wydaje dźwięk

  2. Wpisujemy ?1+1 - uzyskujemy 2

  3. Wpisujemy ?Forms.Kontakty.Filter - to uzyskujemy ((Kontakty.Miasto=”Kraków”)) jest to informacja zawarta we właściwości Filter obiektu jakim jest formularz

  4. Wpisujemy --> ?Forms!Kontakty.FilterOn [Author:W M ] - uzyskujemy w zależności od tego czy filtr jest uruchomiony czy też nie albo wartość True lub False.

  5. Okno analizatora programu możemy wykorzystać do zmiany właściwości czyli możemy je ustawiać Forms.Kontakty.FilterOn = False - tym sposobem wyłączyliśmy filtr w formularzu (nadal jesteśmy na poziomie modułów klas - czyli modułów związanych z formularzami

Tworzenie grupy opcji w celu filtrowania danych

Wpierw opiszemy procedurę tworzenia grupy opcji z wykorzystaniem przybornika;

Dopiero teraz przystępujemy do tworzenia procedury zdarzenia, obsługującej grupę opcji.

Chcemy wykorzystać grupę opcji do wyboru przez użytkownika sposobu filtrowania. Sposób postępowania;

Dopracowywanie programu

Jak zareaguje nasz formularz gdy użytkownik uruchomi opcję filtrowania według wyboru, gdy było podświetlone pole miasto, w którym była wartość Warszawa. Odfiltrowane zostaną rekordy spełniające to kryterium a w grupach opcji filtrowania na formularzu będzie zaznaczone kryterium nie przystające do widocznych rekordów. Zatem chcielibyśmy zbudować program, który uwzględni fakt zmiany kryterium filtrowania dokonany przez użytkownika. Oznacza, to iż grupa opcji (w naszym przypadku opcja filtrowania - czyli formant) powinna mieć nadaną wartość Null. Natomiast usunięcie filtra powinno powodować nadanie grupie opcji wartości 1 co odpowiadałoby opcji filtrowania wyszukiwania wszystkich rekordów. Cel mamy postawiony a oto jego realizacja;

Wyjaśnienie powyższego kodu;

  1. jeżeli zdarzenie ApplyFilter , a ściślej jego argument ApplyType ma wartość odpowiadającą stałej acShowAllRecords to przechodzimy do wykonania poleceń występujących po słowie kluczowym Then. Ta wartość argumentu oznacza, iż dostępne są wszystkie rekordy. Grupie opcji zostanie przyporządkowana wartość 1.

  2. Jeżeli pierwszy warunek nie jest spełniony a wartość kryterium filtrowania jest różna od prezentowanego przykładu (miasto - Kraków), to grupie opcji zostanie przyporządkowana wartość Null co oznacza, iż żadna z dwóch opcji filtrowania nie została wybrana. Na formularzu żadna z opcji w związku z tym nie jest zaznaczona.

Pisanie własnej funkcji

Tworzenie procedur ogólnych w module standardowym

Każdy moduł może zawierać szereg procedur. Jeżeli procedura jest funkcją to staje się ona dostępna przy tworzeniu wyrażeń.

Sposób tworzenia procedury w module standardowym:

Tworzenie procedury Sub

Sposób tworzenia procedury w oknie modułu standardowego przebiega podobnie jak pisanie procedury obsługującej jakieś zdarzenie w oknie moduł formularza lub raportu.

Sposób krok po kroku:

Przykład stosowania argumentów w procedurze;

Tworzenie funkcji

Napisana procedura wykonuje dobrze swoje zdanie, ale nie informuje aplikacji o jego wyniku. Jest to jednak poprawny sposób działania procedury. Innym rodzajem procedury ogólnej jest funkcja, która zwraca wartość. Poprzednio wykorzystywaliśmy instrukcję MsgBox do stworzenia procedury typu Sub, a teraz wykorzystamy ją do stworzenia funkcji Potwierdzenie;

Procedury ogólne w formularzu

Mając zdefiniowane procedury ogólne spróbujemy je wykorzystać w modułach formularzy. Będziemy modyfikować następujący kod:

Private Sub Form_BeforeUpdate(Cancel As Integer) `Jeżeli użytkownik wpisał adres, to sprawdź, czy wpisał kod pocztowy

Dim strKomunikat As String

Dim intOpcje As Integer

Dim bytWybór As Byte

If Not IsNull(Adres) And IsNull(KodPocztowy) Then

strKomunikat = „Nie podałeś kodu pocztowego. Czy mimo to zapisać rekord ?”

intOpcje = vbQuestion + vbOkCancel

bytWybor = MsgBox(strKomunikat, intOpcje)

If bytWybór = vbCancel Then

KodPocztowy.SetFocus

Cancel = True

End If

End If

End Sub

W powyższym przykładzie wykorzystano funkcję IsNull, która zwraca wartość Boolean wskazującą, czy wyrażenie nie zawiera danych (ma wartość Null).

Składnia

IsNull(wyrażenie)

Obowiązkowy argument wyrażenie typu Variant zawiera wyrażenie numeryczne lub wyrażenie znakowe.

Użycie

IsNull zwraca True, jeśli wyrażenie ma wartość Null; w przeciwnym przypadku funkcja IsNull zwraca False. Jeśli wyrażenie zawiera więcej niż jedną zmienną, wartość Null w dowolnej składowej powoduje zwrócenie przez funkcję wartości True.

Wartość Null wskazuje, że zmienna typu Variant nie zawiera poprawnych danych. Wartość Null nie jest tym samym co wartość Empty, która oznacza, iż zmienna nie została jeszcze zainicjowana. Nie jest to również to samo co ciąg znaków o długości zerowej (""), nazywany czasem ciągiem pustym.

Ważne - Do sprawdzenia, czy wyrażenie zawiera wartość Null, należy stosować funkcję IsNull. Wyrażenia, które w pewnych warunkach wydają się mieć wartość True, jak np. If Var = Null albo If Var <> Null, mają zawsze wartość False. Wynika to z tego, iż dowolne wyrażenie zawierające wartość Null ma wartość Null, czyli False.

Wyjaśnienia powyższego kodu;

Pierwsze trzy linie po nagłówku procedury - to deklaracja zmiennych

W kolejnym wierszu mamy instrukcję warunkową czy został wprowadzony kod pocztowy. W przypadku jego braku pojawia się okno z komunikatem i dwoma przyciskami. Po dokonanym wyborze funkcja MsgBox zwraca wartość, która jest zapisywana w zmiennej bytWybór. Funkcja MsgBox zwraca liczbę reprezentującą przycisk, który kliknął użytkownik.

Jeżeli użytkownik wybierze przycisk Anuluj wtedy kolejny warunek instrukcji If jest spełniony, a zatem wykonywane jest polecenie ustawienia fokusa w polu kodu pocztowego i poprzez przyporządkowanie Cancel wartości true powoduje anulowanie --> zdarzenia[Author:W M ] .

W przypadku gdy użytkownik wybierze przycisk OK., rekord zostanie zapisany.

Wykorzystamy wprowadzoną funkcję Potwierdzenie oraz dokonujemy następujących zmian

deklarujemy nową zmienną

Dim blnOK As Boolean

trzy podkreślone wiersze w poprzednim programie zastępujemy następującą linią

blnOK = Potwierdzenie(„Nie wpisałeś kodu pocztowego. Czy mimo to zapisać rekord ?”)

w kolejnym wierszu (w instrukcji warunkowej) dokonujemy następującej korekty

If Not blnOK Then

Ta linijka kodu sprawdza czy użytkownik wybrał OK. czy Cancel. Realizuje ona to w nieco inny sposób, gdyż mamy tutaj do czynienia z innym typem zmiennych. Zmienna blnOK jest typu (tak/nie). Powyższy warunek będzie spełniony jeżeli, użytkownik wybierze przycisk Anuluj.

Sądzę iż poprawny byłby zapis w następującej postaci

If blnOK = True Then należy to sprawdzić

Tworzenie funkcji ogólnych w module formularza

Dotychczas tworzyliśmy funkcje ogólne na poziomie modułu standardowego. Jednak czasami stajemy przed zadaniem utworzenia funkcji, którą chcemy używać tylko w obrębie jednego formularza. Tworzenie jej na poziomie modułu standardowego jest niecelowe (problem ze zmiennymi). Lepszym rozwiązaniem jest utworzenie funkcji na poziomie modułu formularza.

Utworzymy procedurę - funkcję, która łączy w jeden łańcuch Nazwisko imię. Realizacja przebiega w następujący sposób:

Możemy to dokonać również poprzez wykorzystanie ikony Wstaw procedurę.

Funkcję tą możemy wykorzystać przy tworzeniu pola typu wyrażenie w formularzu lub raporcie. Dokonujemy tego w oknie właściwości pola tekstowe. Modyfikacji dokonujemy w zakładce dane w wierszu źródło formantu wpisujemy nazwę funkcji, którą chcemy wykorzystać.

Przykład innej funkcji

Public Function PelenAdres() As String

If IsNull (Nazwisko) Or IsNull (Adres) Then

PelenAdres = „

Else

PelenAdres = Imie_i_Nazwisko & vbNewLine _

Adres & vbNewLine & _

KodPocztowy & „ „ & Miasto

End If

End Function

Stworzona funkcja ma charakter publiczny a przy jej budowie wykorzystano funkcję zdefiniowaną w module formularza o charakterze prywatnym. Jakie występują miedzy nimi różnice. Funkcja PelenAdres da się uruchomić w oknie Analizy programu ale pod warunkiem, iż w tle jest otwarty formularz w postaci udostępniającej dane. Natomiast w przypadku funkcji typu Private tego nie możemy zrobić. Jeżeli natomiast zagnieździmy tą funkcję w funkcji o charakterze publicznym ograniczenie funkcji Private przestaje działać.

Sprawdzanie kodu i usuwanie błędu

Otwieramy okno modułu, które zostało wybrane z zakładki moduły okna baz danych.

Przeglądanie kodu linijka po linijce jest zarówno możliwe dla modułów umieszczonych w formularzach jak i modułów będących oddzielnymi obiektami baz danych. Prześledzimy to dla modułu umieszczonego na zakładce moduły bazy danych

Sprawdzimy teraz efekt wprowadzenia punktu przerwania w kodzie

W tym przykładzie przemieszczaliśmy się w ramach tej samej procedury. Z reguły program składa się z większej liczby procedur, które są wywoływane podczas jego realizacji. Interesuje mnie problem przemieszczania się między procedurami (podczas procesu śledzenia).

Przeanalizujemy to na module formularza (poprzednio zajmowaliśmy się modułem jako oddzielnym obiektem - nie wiem czy nie popełniłem jakiegoś błędu pojęciowego)

Sposób postępowania:

Monitorowanie zmiennych i innych wartości

Podczas realizacji aplikacji chcemy mieć dostęp do wartości zmiennych zanim uznamy ją za prawidłowo działającą. W celu uzyskania dostępu do wartości zmiennych postępujemy w następujący sposób;

Inne techniki monitorowania kodu

Ustalenie wyrażenia czujki w okienku czujki

W okienku zmiennych lokalnych są widoczne są jedynie zmienne i obiekty w bieżącej procedurze. Istnieje czasami konieczność przeglądania wartości zmiennych i obiektów spoza bieżącej procedury na przykład zmiennych w całej aplikacji. W tym przypadku stosujemy polecenie Dodaj czujkę lub Szybka czujka (jakie są różnice pomiędzy tymi poleceniami czy w tym drugim przypadku najpierw trzeba zaznaczyć fragment kodu lub ustawić kursor w odpowiednim wierszu kodu ). Gdy ustalimy co chcemy oglądać to możemy w oknie analizy wykorzystać zakładkę czujka.

Wysyłanie wartości lub komunikatów do okna Analizy programu

Jeżeli w linii kodu wpiszemy:

Debug.Print „Funkcja Potwierdzenie zwróciła wartość”: blnOK - w tym przypadku blnOK jest nazwą zmiennej

Jeżeli uruchomimy procedurę w oknie Analizy Programu na ekranie zostanie wyświetlony komunikat informujący jaka jest wartość zmiennej. Ten sposób jest alternatywą dla metody związanej z wprowadzeniem punktu przerwania.

Reagowanie na błędy oraz nieoczekiwane sytuacje

Zastępowanie standardowych komunikatów o błędach (na poziomie formularzy)

Za każdym razem, gdy pojawia się błąd wywoływane zostaje zdarzenie Error. Zatem istnieje możliwość umieszczenia kodu czyli procedury obsługującej to zdarzenie. Z reguły wyświetla ona komunikat informujący jak wyjść z opresji. Jednak przedtem musimy wiedzieć jak rodzaj błędu został popełniony. Procedura zdarzenia Error wyposażona jest w argument DataErr, zawierający numer aktualnie występującego błędu. Na podstawie tego numeru będziemy musieli przewidzieć określone działanie.

Pierwszym krokiem naszego działania, będzie rozpoznanie argumentu danego błędu - czyli poznanie DataErr.

Pole kombi właściwości

RowSourceType, RowSource, właściwości

Właściwości RowSourceType (TypŹródłaWierszy) i RowSource (ŹródłoWierszy) można użyć razem, aby określić, w jaki sposób program Microsoft Access ma dostarczać danych dla pola listy, pola kombi lub niezwiązanego obiektu OLE, takiego jak wykres. Na przykład, aby wyświetlić w liście wiersze danych z kwerendy o nazwie "CustomerList", należy przypisać właściwości RowSourceType listy wartość "Tabela/Kwerenda", a jego właściwości RowSource kwerendę o nazwie "CustomerList".

Ustawienie

Dla właściwości RowSourceType używane są następujące ustawienia:

  1. Tabela/Kwerenda - (Ustawienie domyślne) Dane pochodzą z tabeli, kwerendy lub instrukcji SQL, zależnie od wartości właściwości RowSource.

  2. Lista wartości - Dane stanowi lista elementów określonych przez wartość właściwości RowSource.

  3. Lista pól - Dane stanowi lista nazw pól z tabeli, kwerendy lub instrukcji języka SQL określonych przez wartość właściwości RowSource.

Uwaga Właściwość RowSourceType można również ustawić za pomocą funkcji zdefiniowanej przez użytkownika. W tym przypadku dane stanowi tablica wartości zdefiniowana przez użytkownika. Nazwę funkcji wprowadza się bez poprzedzającego znaku równości (=) i bez nawiasów na końcu. Aby poinformować program Microsoft Access, jak ma być wypełniany formant, należy dostarczyć określone argumenty kodowania.

Wartość właściwości RowSource zależy od wartości właściwości RowSourceType.

Dla takiej wartości RowSourceType Należy wprowadzić taką wartość RowSource

Uwaga Jeśli wartością właściwości RowSourceType jest funkcja zdefiniowana przez użytkownika, wartość właściwości RowSource może pozostać nieokreślona.

Właściwości RowSourceType i RowSource można ustawić używając arkusza właściwości formantu, makra lub języka Visual Basic.

Dla pól tabeli, właściwości te można ustawić na karcie Odnośnik w sekcji "Właściwości pól" w widoku "Projekt" tabeli dla pól z właściwością DisplayControl (TypFormantu) ustawioną na pole kombi lub pole listy.

Uwaga Program Microsoft Access automatycznie nadaje wartość tym właściwościom, jeśli jako typ danych dla pola w widoku "Projekt" tabeli zostanie wybrany typ Kreator odnośników.

W języku Visual Basic, wartość właściwości RowSourceType nadaje się przy użyciu jednego z następujących wyrażeń typu ciąg znaków: "Table/Query", "Value List" lub "Field List". Używa się również wyrażenia typu ciąg znaków, aby nadać wartość właściwości RowSource. Aby przypisać właściwości RowSourceType funkcję zdefiniowaną przez użytkownika, należy wprowadzić nazwę funkcji.

Forms!Employees!cmboNames.RowSourceType = "Table/Query"

Forms!Employees!cmboNames.RowSource = "EmployeeList"

Uwagi

W przypadku ograniczonej liczby wartości niezmiennych, można ustawić właściwość RowSourceType na wartość "Lista wartości", a następnie wprowadzić wartości, które tworzą listę we właściwości RowSource.

Po utworzeniu funkcji zdefiniowanej przez użytkownika służącej do wstawiania elementów w liście lub polu kombi, program Microsoft Access częstokroć wywołuje tę funkcję, aby otrzymać niezbędne informacje. Zdefiniowane przez użytkownika funkcje dla właściwości RowSoutceType muszą być napisane w ściśle określonym formacie funkcji.

RowSourceType, właściwość (funkcja zdefiniowana przez użytkownika) - wartości argumentu kodowania

Tworzone przez użytkownika funkcje języka Visual Basic muszą akceptować pięć argumentów. Pierwszy argument musi być zadeklarowany jako formant, a pozostałe jako Variant. Sama funkcja musi zwracać wartość typu Variant.

Składnia

Function nazwafunkcji(pole As Control, id As Variant, wiersz As Variant, kol As Variant, kod As Variant) As Variant

Procedura Function wymaga pięciu następujących argumentów:

Uwaga Ponieważ program Microsoft Access wywołuje funkcję kilka razy, aby wstawić pozycje do listy, często trzeba zachowywać informacje między wywołaniami. Dlatego najlepiej jest używać zmiennych typu Static.

Program Microsoft Access powtarza wywoływanie funkcji zdefiniowanej przez użytkownika używając różnych wartości w argumencie kod, aby określić potrzebne informacje. Argument kod może używać następujących stałych wewnętrznych.

Stała Znaczenie Funkcja zwraca

Program Microsoft Access wywołuje funkcję zdefiniowaną przez użytkownika jednokrotnie dla stałych acLBInitialize, acLBOpen, acLBGetRowCount i acLBGetColumnCount. Inicjuje on funkcję zdefiniowaną przez użytkownika, otwiera kwerendę oraz określa liczbę wierszy i kolumn.

Program Microsoft Access wywołuje funkcję zdefiniowaną przez użytkownika dwa razy dla stałej acLBGetColumnWidth - raz, aby określić całkowitą szerokość listy lub pola kombi i drugi raz, aby określić szerokość kolumny.

Liczba wywołań funkcji zdefiniowanej przez użytkownika dla stałych acLBGetValue i acLBGetFormat (aby otrzymać elementy listy i sformatować ciągi znaków) jest zmienna; zależy ona od liczby elementów, przewinięć dokonywanych przez użytkownika i innych czynników.

Program Microsoft Access wywołuje funkcję zdefiniowaną przez użytkownika dla stałej acLBEnd, gdy formularz jest zamknięty lub za każdym razem, gdy wykonywana jest kwerenda na liście lub polu kombi.

Ilekroć wymagana jest określona wartość (taka jak liczba kolumn), zwrócenie wartości Null lub innej nieprawidłowej wartości powoduje, że program Microsoft Access przestaje wywoływać funkcję listy z tym kodem.

Wskazówka Można użyć struktury kodu Select Case z przykładu jako szablonu dla własnych zdefiniowanych przez użytkownika funkcji dla właściwości RowSourceType.

Poniższa funkcja zdefiniowana przez użytkownika zwraca listę czterech poniedziałków następujących po dzisiejszej dacie. Aby wywołać tę funkcję z formantu listy, należy wprowadzić ciąg znaków ListMondays jako wartość właściwości RowSourceType (TypŹródłaWierszy) i pozostawić nieokreśloną właściwość RowSource (ŹródłoWierszy).

Function ListMondays(fld As Control,id As Variant,row As Variant,col As Variant,code As Variant) As Variant

Dim intOffset As Integer

Select Case code

Case acLBInitialize ' Initialize.

ListMondays = True

Case acLBOpen ' Open.

ListMondays = Timer ' Unique ID.

Case acLBGetRowCount ' Get rows.

ListMondays = 4

Case acLBGetColumnCount ' Get columns.

ListMondays = 1

Case acLBGetColumnWidth ' Get column width.

ListMondays = -1 ' Use default width.

Case acLBGetValue ' Get the data.

intOffset = Abs((9 - Weekday(Now))Mod 7)

ListMondays = Format(Now() + intOffset + 7 * row,"mmmm d")

End Select

End Function

W następnym przykładzie została użyta statyczna tablica do przechowania nazw baz danych z bieżącego katalogu. Aby wywołać tę funkcję należy wprowadzić ciąg znaków ListaMDB jako wartość właściwości RowSourceType i pozostawić wartość właściwości RowSource nieokreśloną.

Function ListMDBs(fld As Control, id As Variant, row As Variant, col As Variant, code As Variant) As Variant

Static dbs(127) As String, Entries As Integer

Dim ReturnVal As Variant

ReturnVal = Null

Select Case code

Case acLBInitialize ' Initialize.

Entries = 0

dbs(Entries ) = Dir("*.MDB")

Do Until dbs(Entries) = "" Or Entries >= 127

Entries = Entries+1

dbs(Entries) = Dir

Loop

ReturnVal = Entries

Case acLBOpen ' Open.

ReturnVal = Timer ' Generate unique ID for control.

Case acLBGetRowCount ' Get number of rows.

ReturnVal = Entries

Case acLBGetColumnCount ' Get number of columns.

ReturnVal = 1

Case acLBGetColumnWidth ' Column width.

ReturnVal = -1 ' -1 forces use of default width.

Case acLBGetValue ' Get data.

ReturnVal = dbs(row)

Case acLBEnd ' End.

Erase dbs

End Select

ListMDBs = ReturnVal

End Function

Reagowanie na błąd w polu kombi - kolejny przykład

Dla pola kombi można ustawić właściwość Ogranicz do listy (LimitToList). Standardowo pole kombi dopuszcza wybranie wartości z listy lub wpisanie wartości samemu. Jednak czasami może być wymagany wybór tylko z listy - wtedy właściwość LinitToList ustawiamy na tak. Próba wpisania wartości kończy się komunikatem o błędzie.

Napiszemy własny kod - realizacja tego;

Aby utworzyć procedurę zdarzenia wykonywaną po wystąpieniu zdarzenia NotInList należy ustawić właściwość OnNotInList (PrzyWartościSpozaListy) na wartość [Procedura zdarzenia] i kliknąć przycisk Buduj .

Składnia

Private Sub nazwaformantu_NotInList(NewData As String, Response As Integer)

Procedura zdarzenia NotInList ma następujące argumenty.

Argument Opis

Stała Opis

Uwagi

Można utworzyć procedurę zdarzenia dla zdarzenia NotInList umożliwiającą użytkownikowi dodanie nowej pozycji do listy pola kombi. Na przykład, można dodać rekord do tabeli dostarczającej wartości listy lub dodać wartość do listy wartości, która jest źródłem dla listy pola kombi.

Aby dodać nowy element do listy pola kombi, procedura zdarzenia musi dodać wartość argumentu NewData do źródła listy pola kombi. Jak to zostanie zrobione, zależy od typu źródła używanego przez listę pola kombi. Źródło to jest określone przez właściwości RowSourceType (TypŹródłaWierszy) i RowSource (ŹródłoWierszy) pola kombi. W przykładzie, który można otworzyć w tym temacie, procedura zdarzenia dodaje nową wartość do listy wartości dla pola kombi.

Jeśli umożliwi się użytkownikowi zmianę wartości początkowo wpisanej w polu kombi (na przykład w niestandardowym oknie dialogowym), trzeba wartość pola kombi ustawić na nową wartość wprowadzoną w niestandardowym oknie dialogowym. Powoduje to zapisanie nowej wartości w polu, z którym pole kombi jest związane. Program Microsoft Access doda nową wartość do listy pola kombi, jeśli wartością argumentu Response będzie acDataErrContinue.

Pisanie własnej aplikacji

Ustawianie właściwości formantu

Należy odwołać się do formantu w kolekcji Controls obiektu Form lub Report, w którym on się znajduje. Do kolekcji Controls można się odwołać domyślnie lub jawnie, lecz szybciej działa odwołanie domyślne. W poniższym przykładzie ustawiana jest właściwość Visible pola tekstowego o nazwie "CustomerID" w formularzu "Customers":

' Metoda szybsza.

Me!CustomerID.Visible = True

' Metoda wolniejsza.

Forms!Customers.Controls!CustomerID.Visible = True

Najszybszym sposobem ustawiania właściwości formantu jest użycie właściwości Me obiektu bezpośrednio z jego modułu. Można na przykład wykorzystać następujący kod do przełączenia właściwości Visible pola tekstowego o nazwie "CustomerID" w formularzu "Customers":

With Me!CustomerID

.Visible = Not .Visible

End With

Tworzenie okien dialogowych dla aplikacji

Mamy bazę składającą się z dwóch tabel w pierwszej zawarte są informacje o prenumeratorach a druga dotyczy płatności. pomiędzy tabelami istnieje relacja jeden do wielu o narzuconych więzach integralności.

Naszym pierwszym zadaniem jest stworzenie okien dialogowych, które z reguły służą do:

  1. prezentowania niestandardowych komunikatów

  2. zadawania pytań przed otworzeniem formularza lub raportu

  3. zezwolenie użytkownikowi na ustalenie ogólnych opcji aplikacji

Procedura tworzenia okna dialogowego;

Obiekty i kolekcje

Model obiektowy to hierarchia składników, z których korzystasz w aplikacji ( formularze wraz z formantami i właściwościami, tabele wraz z polami również o określonych właściwościach

Jeżeli skorzystamy z pomocy poprzez wybranie haseł obiekty i kolekcje to uzyskamy na ekranie schemat na którym widoczne są obiekty i kolekcje będące jednocześnie obiektami.

Aplikacja, ekran oraz Docmd są tylko obiektami, natomiast formularze, raporty, moduły itd. są jednocześnie kolekcjami i obiektami. Oznacza to, iż mówiąc o formularzach mamy na myśli kolekcję natomiast mówiąc o konkretnym formularzu myślimy o obiekcie.

Przeglądarka obiektów

Dostęp do przeglądarki obiektów jest możliwy z poziomu okna modułów, do którego dostajemy się poprzez okno projektowania formularza bądź raportu.

Odwoływanie się obiektów i kolekcji

Dotychczasowy sposób odwoływania się do obiektów typu formularz czy zawarty w nim formant w kodzie Visual Basic był realizowany w prosty sposób:

Forms!Kontakty - odwołanie do formularza

Forms!Kontakty!IDKontaktu - odwołanie do formantu

różne sposoby odwołania się do formularza

Forms!nazwaformularza Forms!OrderForm

Forms![nazwa formularza] Forms![Order Form]

Forms("nazwaformularza") Forms("OrderForm")

Forms(indeks) Forms(0)

Odwoływanie się do obiektów w kolekcji może być realizowane na kilka sposobów;

Sprawdzenie możemy zrealizować w oknie Analiza programu. Zmusimy Access aby okno Analizy programu było zawsze na wierzchu - sposób realizacji:

Przykłady wykonywane w oknie Analizy programu celem odwołania się do obiektów - będziemy to realizowali w dolnej części okna Analizy programu (okienko bezpośrednie);

Stosowanie instrukcji For Each dla kolekcji

Obiekty znajdujące się w tej samej kolekcji posiadają wspólne właściwości. W związku z tym rodzi się pytanie czy istnieje mechanizm (instrukcja), który pozwala modyfikować właściwości wszystkich obiektów należących do tej samej kolekcji. Do realizacji tego celu wykorzystujemy instrukcje For Each.

Przykład poniższy obrazuje procedurę, która modyfikuje kolor tła tekstu (ForeColor) (osobno występuje kolor czcionki) dla każdej etykiety występującej w formularzu. Procedura zostanie zapisana w module standardowym.

Sub ZmienKolorEtykiety(lngKodKoloru As Long) `wywołanie funkcji wymaga podania koloru w postaci liczby lub stałej (literału) zdefiniowanej w Access-ie

Dim ct1 As Control

For Each ct1 In Forms!Zadania.Controls

If TypeOf ct1 Is Label Then

ct1.ForeColor = lngKodColoru

End If

Next ct1

End Sub

Wyjaśnienie kodu;

For Each nazwa zmiennej (typu obiektowego - ale określonego rodzaju) słowo kluczowe In nazwa kolekcji, której ma dotyczyć ta instrukcja. W tym przykładzie kolekcją jest Controls występująca w formularzu Zadania. Czy poprawne jest sformułowanie, że procedura For Each zwraca nam obiekt za każdym razem inny podczas realizacji pętli.

Uruchamianie procedury;

Pole listy z wielokrotnym wyborem

Dotychczas stosowaliśmy pola listy, pozwalające wybrać jeden element. Wybrany element z listy stanowił wartość tego --> pola[Author:W M ] .

Aby pole listy umożliwiało wybrać kilka pozycji należy odpowiednio ustawić właściwość Wybór wielokrotny - dopuszcza on następujące ustawienia

Chcemy zrealizować program zmiana przyporządkowania.

Na formularzu występują następujące formanty:


Zakładamy, iż obydwa zadania 5 i 7 zostały zaznaczone. interesuje mnie czy uzyskamy informacje w oknie Analizy programu. Poprzez naciśniecie Ctrl + g przechodzę do okna analizy programu (jednak musimy pamiętać o tym aby okno formularza było otwarte)

Polecenie wpisane w dolnej części okna

?Forms!Zmianaprzyporządkowania!ListaZadań ` w przypadku wybranego jednego elementu listy zwróciłoby identyfikator wybranego zadania. W przypadku wybrania większej ilości elementów z listy musimy się odwołać do specjalnej kolekcji o nazwie ItemSelected

?Forms!ZmianaPrzyporządkowania!ListaZadań.ItemsSelected.Count [Enter] ` w odpowiedzi uzyskamy liczbę zaznaczonych elementów na liście.

?Forms!ZmianaPrzyporządkowania!ListaZadań.ItemsSelected(0)' zostaje zwrócona 0 gdyż wybrany został pierwszy element na liście. Gdybyśmy wybrali drugi element na liście polecenie powyższe zwróciłoby 1. Liczba zawarta w nawiasie może przyjmować wartości od 0 do n-1, gdzie n jest liczbą zaznaczonych elementów listy. Przy wyborze dwóch elementów przyjmuje 0 i 1.

Jeżeli do zbudowania pola listy jako typ źródła danych została podana kwerenda lub tabela, to polecenie powyższe zwróci zawartość pole klucza podstawowego tabeli lub kwerendy.

Natomiast zwraca on numer wybranego elementu na liście przy czym musimy pamiętać o tym że pierwszy element listy odpowiada wartości 0.

Jeżeli chcemy znać numer identyfikacyjny zdania musimy zastosować metodę ItemData(), gdzie argumentem mogą być liczby zwrócone przez metodę ItemsSelected().

Obiekty dostępu do danych (DAO - Data Access Objects)

Gdy chcemy sprawować kontrolę nad bazą danych, to możemy manipulować jej danymi za pomocą kodu korzystającego z obiektów dostępu do danych (DAO).

Biblioteka obiektów typu (DAO) ma złożoną strukturę gdyż składa się z dużej liczby obiektów i kolekcji. Ponadto obiekty typu DAO nie są obiektami graficznymi - są grupą abstrakcyjnych struktur przechowujących dane.

Hierarchię obiektów DAO otwiera obiekt DBEngine, który reprezentuje aparat bazy danych programu Access.

Struktura jest następująca;

Kolorem niebliskim zaznaczone są obiekty pozostałe elementy to kolekcje. W dalszym ciągu będą nas interesowały kolekcje Databases, Recordsets oraz Querdefs.

Wyszukiwanie i zmienianie danych o obiekcie Recordset

Jaka jest rola przycisku Zmiana Przyporządkowania;

Aby zmienić rekord w tabeli należy najpierw otworzyć obiekt Recordset. Następnie należy przejść do określonego rekordu i tutaj zostanie wykorzystana metoda Seek. Zmiana w odnalezionym rekordzie za pomocą metody Edit oraz Update.

Private Sub ZmieńPrzyporządkowanieZaznaczonych_Click()

' Otwórz zestaw rekordów i zmień przyporządkowanie zaznaczonych zadań.

Dim strKomunikat As String `deklaracja zmiennej łańcuchowej

Dim dbs As Database, rstZadania As Recordset `deklaracja zmiennych obiektowych jedna służy do przechowywania całej bazy a druga do zestawu rekordów

Dim varPozycja As Variant

' Sprawdź, czy w polu PrzyporządkujPracownikowi jest zaznaczona wartość.

If IsNull(PrzyporządkujPracownikowi) Then

WyświetlKomunikat "Musisz najpiew wskazać pracownika, aby przyporządkować mu zadania." `wywołanie funkcji poprzednio zdefiniowanej WyświetlKomunikat i przekazanie jej argumentu podanego w cudzysłowie

Exit Sub ` wyjście z procedury

End If

' Sprawdź, czy na liście zaznaczone jest przynajmniej jedna pozycja.

If ListaZadań.ItemsSelected.Count = 0 Then `Warunek polega na sprawdzeniu ilości elementów wybranych z listy, Jeżeli liczba wybranych elementów wynosi 0 to jest wywołana procedura

WyświetlKomunikat "Zaznacz zadania, które zmierzasz przyporządkować pracownikowi."

Exit Sub

End If

' Potwierdź zmianę przyporządkowania.

strKomunikat = "Przyporządkować zaznaczone zadania do "_

& PrzyporządkujPracownikowi.Column(1) & "?" `do zmiennej strKomunikat jest podstawiony łańcuch utworzony z trzech elementów; danego łańcucha, wartości (zawartości) formantu PrzyporządkujPracownkowi z kolumny 1(czym w tym przypadku jest Column(1) - zgodnie z informacją uzyskiwaną w oknie obiektów jest to właściwość) i znaku zapytania

If Potwierdzenie(strKomunikat) Then' realizacja instrukcji warunkowej związana jest z wywołaniem funkcji Potwierdzenie. Jeżeli użytkownik wybierze opcję tak to zgodnie z poniższym pojawi się klepsydra

' Wyświetl ikonę klepsydry w czasie zmiany przyporządkowania Houeglass jest metodą obiektu DoCmd

DoCmd.Hourglass True

' Otwórz zestaw rekordów w bieżącej bazie danych

Set dbs = CurrentDb() `zmienna dbs reprezentuje aktualną bazę danych

Set rstZadania = dbs.OpenRecordset("Zadania", dbOpenTable)' metoda OpenRecordset odniesiona do obiektu jakim jest baza danych w zmiennej dbs, powoduje otwarcie tabeli (dbOpenTable - to podobno właściwość)

' Rozpocznij transakcję zanim rozpoczniesz zmienianie danych.

DBEngine.BeginTrans `mamy tutaj do czynienia z obiektem i metodą

'Ustaw właściwość Index, by przeprowadzić wyszukiwanie na podstawie klucza podstawowego.

rstZadania.Index = "IDZadania"' obiekt typu zestaw rekordów i właściwość Index równy polu - nazwa pola ujęta w cudzysłów

' Wykonaj pętlę dla każdego zadania na liście.

For Each varPozycja In ListaZadań.ItemsSelected `związane z kolekcją ItemsSelected. Zmienna użyta tutaj jest typu variant - stosowana wykorzystywana przez elementy sterujące lub w przypadku nieznanego typu danych

'Znajdź rekord w tabeli Zadania.

rstZadania.Seek "=", ListaZadań.ItemData(varPozycja)'Metoda Seek przyjmuje dwa argumenty. Pierwszy jest operatorem ujętym w cudzysłów, kolejny argument oddzielony jest przecinkiem - i odpowiada mu identyfikator zdania. Metoda Seek wymaga wpierw ustawienia indeksu - co uprzednio zrobiliśmy. Przeszukiwanie zatem będzie dotyczyło pola, które zostało wykorzystane do stworzenia indeksu.

' Zmień wartość pola PrzyporządkowaneDo w tabeli.

rstZadania.Edit ` zostaje uruchomiona metoda Edyt obiektu Recordest, która informuje Access o rozpoczęciu edycji bieżącego rekordu

rstZadania!PrzyporządkowaneDo = PrzyporządkujPracownikowi' do pola o nazwie PrzyporządkowanieDo rekordu znalezionego (tabeli Zadania) zostanie przypisana wartość wzięta z formularza tkwiąca w formancie PrzyporządkujPracownikowi

rstZadania.Update `metoda Update zamyka proces zmian dla danego rekordu

Next varPozycja `po zrealizowaniu tego dla jednego rekordu przechodzimy do następnego rekordu Zadania wynikającego z listy zadań zaznaczonych w formularzu

'Zapisz wszystkie zmiany przeprowadzone w tej transakcji.

DBEngine.CommitTrans ' metoda CommitTrans obiektu DBEngine poleca systemowi baz danych zapisać wprowadzone zmiany

End If

' Uaktualnij dane na formularzu.

PrzyporządkowaneDo = PrzyporządkujPracownikowi

PrzyporządkujPracownikowi = Null

ListaZadań.Requery

DoCmd.Hourglass False `metoda Hourglass obiektu DoCmd przyjmuje wartość False w efekcie z ekranu znika klepsydra

End Sub

Tworzenie i uruchamianie kwerendy funkcjonalnej

W formularzu omawianym występuję jeszcze jeden przycisk o nazwie Zmień przyporządkowanie dla wszystkich. Czyli w tym przypadku wszystkie zadania przyporządkowane danemu pracownikowi zostaną przyporządkowane innemu. O zmianie zadań poprzez wybór odpowiednich pracowników decyduje użytkownik.

Problem sprowadza się zatem do napisania kodu obsługującego ten przycisk. Ważnym zaznaczenia jest fakt, iż w tym przypadku modyfikacji będzie podlegała cała grupa rekordów. Wydaje się, iż najlepszym narzędziem do zrealizowania tego celu jest kwerenda funkcjonalna. Pytania funkcjonalne można tworzyć w kodzie za pomocą obiektu QueryDef, należącego do biblioteki DAO.

Przycisk zatem będzie uruchamiał pytanie funkcjonalne, które zmodyfikuje nam pole PrzyporządkowanieDo. W miejsce starego identyfikatora pracownika pojawi się nowy identyfikator (innego pracownika).

Private Sub ZmieńPrzyporządkowanieDlaWszytkich_Click()

' Zbuduj kwerendę funkcjonalną zmieniającą przyporządkowanie zadań.

Dim strKomunikat As String

Dim dbs As Database, qdfZmieńPrzyporządkowanie As QueryDef ` pierwsza zmienna dbs będzie reprezentować bieżącą bazę danych służy do przechowywania i uruchamiania obiektu kwerendy

' Sprawdź, czy na obu listach zostały zaznaczone wartości.

If IsNull(PrzyporządkowaneDo) Or IsNull(PrzyporządkujPracownikowi) Then

WyświetlKomunikat "Aby zmienić przyporządkowanie zadania, " & _

"trzeba zaznaczyć pracowników w obu polach."

Exit Sub

End If

' Potwierdź zmianę przyporządkowania.

strKomunikat = "Przyporządkować wszytkie zadania na liście do " & _

PrzyporządkujPracownikowi.Column(1) & "?"

If Potwierdzenie(strKomunikat) Then

' Wyświetl ikonę klepsydry w czasie zmiany przyporządkowania.

DoCmd.Hourglass True

'Otwórz tymczasowy obiekt kwerendy w bieżącej bazie danych.

Set dbs = CurrentDb() `funkcja zwraca aktualnie otwartą bazę danych i zapisuje ją w zmiennej dbs

Set qdfZmieńPrzyporządkowanie = dbs.CreateQueryDef("") ` stosujemy metodę CreateQueryDef do obiektu baza danych w celu otwarcia nowego obiektu kwerendy i umieszczenia go w zmiennej gdfZmieńPrzyporządkowanie. Argument metody (czasami używane jest zamiennie pojęcie funkcji) określa nazwę kwerendy. Jeżeli argument jest pustym ciągiem znaków ujętych w cudzysłów, to utworzony zostaje tymczasowy obiekt kwerendy, wykorzystywany na potrzeby procedury.

'Definiuj aktualizującą kwerendę SQL, zmieniającą przyporządkowanie zadań

qdfZmieńPrzyporządkowanie.SQL = "UPDATE Zadania " & _

"SET PrzyporządkowaneDo = " & PrzyporządkujPracownikowi & _

" WHERE PrzyporządkowaneDo = " & PrzyporządkowaneDo

`w pierwszej linii powyższego bloku ustalamy właściwość SQL obiektu -kwerendy. Jest to sposób poinformowania kwerendy jakie dane ma zwrócić lub w przypadku kwerendy funkcjonalnej jakie dane i gdzie mają zostać wprowadzone. Polecenie SQL ujęte jest w cudzysłowy

Podczas wykonywania kodu Access połączy wszystkie teksty w jeden ciąg znaków definiujących kwerendę funkcjonalną

' Uruchom kwerendę

qdfZmieńPrzyporządkowanie.Execute `uruchomienie kwerendy

' Uaktualnij dane na formularzu.

PrzyporządkowaneDo = PrzyporządkujPracownikowi

PrzyporządkujPracownikowi = Null

ListaZadań.Requery

DoCmd.Hourglass False

End If

End Sub

Kolekcja pytania kwerendy

Kolekcja QueryDefs w bazie danych Microsoft Jet zawiera wszystkie obiekty QueryDef obiektu Database, a w obszarze roboczym ODBCDirect wszystkie obiekty QueryDef obiektu Connection.

0x08 graphic

Użycie

Aby utworzyć nowy obiekt QueryDef, należy zastosować metodę CreateQueryDef. W przypadku obszaru roboczego Microsoft Jet, jeśli argumentowi nazwa zostanie przypisany ciąg znaków lub jeśli właściwość Name nowego obiektu QueryDef zostanie ustawiona na ciąg inny niż ciąg o długości zerowej, powoduje to utworzenie trwałego obiektu QueryDef, który jest automatycznie dołączany do kolekcji QueryDefs i zapisywany na dysku. Przypisanie argumentowi nazwa ciągu znaków o długości zerowej lub ustawienie właściwości Name na ciąg znaków o długości zerowej powoduje utworzenie tymczasowego obiektu QueryDef.

W przypadku obszaru roboczego ODBCDirect, obiekt QueryDef jest zawsze tymczasowy. Kolekcja QueryDefs zawiera wszystkie otwarte obiekty QueryDef. Zamknięcie obiektu QueryDef powoduje automatyczne usunięcie go z kolekcji QueryDefs.

Aby odwołać się do obiektu QueryDef w kolekcji poprzez jego numer porządkowy lub poprzez jego właściwość Name, należy użyć jednej z poniższych form składniowych:

QueryDefs(0)

QueryDefs("nazwa")

QueryDefs![nazwa]

Przykład

W poniższym przykładzie posłużono się metodą CreateQueryDef w celu utworzenia i wykonania zarówno tymczasowej, jak i trwałej kwerendy (obiektu QueryDef). Do uruchomienia przykładowej procedury niezbędna jest procedura PobierzPom.

With instrukcja Wykonuje ciąg instrukcji na pojedynczym obiekcie lub na typie zdefiniowanym przez użytkownika.

Składnia

With obiekt[instrukcje]

End With

Składnia instrukcji With zawiera następujące elementy:

Element Opis

Użycie

Instrukcja With umożliwia wykonanie ciągu instrukcji na określonym obiekcie bez konieczności wielokrotnego kwalifikowania składowych nazwą obiektu. Na przykład, aby zmienić wartości różnych właściwości pojedynczego obiektu, należy umieścić instrukcje przypisania tych wartości właściwościom wewnątrz struktury With, odwołując się do obiektu tylko raz, a nie tyle razy, ile jest instrukcji przypisania. Przykład poniżej pokazuje użycie instrukcji With do przypisania wartości kilku właściwościom jednego obiektu.

With MojaEtykieta

.Wysokosc = 2000

.Szerokosc = 2000

.Nagłówek = "Oto moja etykieta"

End With

Uwaga Po wejściu do bloku instrukcji With nie ma możliwości zmiany elementu obiekt. Nie można zatem jedną instrukcją With operować na kilku różnych obiektach.

Instrukcje With można zagnieżdżać, umieszczając jeden blok With wewnątrz drugiego. Ponieważ jednak składowe z zewnętrznych bloków With są przesłaniane w blokach wewnętrznych, to aby odwołać się w bloku wewnętrznym do składowej obiektu z bloku zewnętrznego należy w bloku wewnętrznym użyć pełnego, kwalifikowanego odesłania do obiektu z bloku zewnętrznego.

Ważne Nie należy wykonywać skoków do wnętrza lub z wnętrza bloków With. Jeśli wykonywane są instrukcje w bloku With, ale nie kończą się one wykonaniem instrukcji With lub End With, mogą wystąpić błędy lub program może zachowywać się w sposób nieprzewidziany.

Sub CreateQueryDef()

Dim dbsNorthwind As Database

Dim qdfPom As QueryDef

Dim qdfNowa As QueryDef

Set dbsNorthwind = OpenDatabase("Northwind.mdb")

With dbsNorthwind

' Utwórz tymczasowy obiekt QueryDef:

Set qdfPom = .CreateQueryDef("", _

"SELECT * FROM Pracownicy")

' Otwórz zestaw rekordów i wydrukuj raport:

PobierzPom qdfPom

' Utwórz trwały obiekt QueryDef:

Set qdfNowa = .CreateQueryDef("NowaKwerenda", _

"SELECT * FROM Kategorie")

' Otwórz zestaw rekordów i wydrukuj raport:

PobierzPom qdfNowa

' Usuń nową kwerendę, gdyż jest to tylko

' przykład.

.QueryDefs.Delete qdfNowa.Name

.Close

End With

End Sub

Function PobierzPom(qdfPom As QueryDef)

Dim rstPom As Recordset

With qdfPom

Debug.Print .Name

Debug.Print " " & .SQL

' Otwórz zestaw rekordów według obiektu

' QueryDef:

Set rstPom = .OpenRecordset(dbOpenSnapshot)

With rstPom

' Wypełnij zestaw rekordów i pokaż liczbę

' rekordów należących do zestawu:

.MoveLast

Debug.Print " Liczba rekordów = " & _

.RecordCount

Debug.Print

.Close

End With

End With

End Function

Do tymczasowych obiektów typu QueryDef można odwoływać się tylko przez przypisane im zmienne obiektowe.

Obiekty typu Recordset

Obiekt Recordset reprezentuje rekordy zapisane w tabeli bazowej lub rekordy powstałe w wyniku wykonania kwerendy.

Użycie

Obiekty Recordset są wykorzystywane do operowania danymi w bazie danych na poziomie rekordów. W przypadku korzystania z obiektów DAO, operowanie danymi niemal całkowicie odbywa się przy użyciu obiektów Recordset. Wszystkie obiekty Recordset są zbudowane z rekordów (wiersze) i pól (kolumny). Istnieje pięć typów obiektów Recordset:

Obiekt Recordset typu tabela

Obiekt Recordset typu tabela reprezentuje tabelę bazową, którą można wykorzystywać do dodawania, zmiany lub usuwania rekordów z tabeli. Do pamięci ładowany jest tylko bieżący rekord. Uporządkowanie rekordów obiektu Recordset jest określone przez predefiniowany indeks (tylko w obszarach roboczych Microsoft Jet).

Użycie

Aby utworzyć obiekt Recordset typu tabela, należy w stosunku do otwartego obiektu Database zastosować metodę OpenRecordset.

Metoda OpenRecordset tworzy nowy obiekt Recordset i dołącza go do kolekcji Recordsets.

Składnia

Dla obiektów Connection i Database:

Set zestaw_rekordów = obiekt.OpenRecordset (źródło, typ, opcje, blokada)

Dla obiektów QueryDef, Recordset i TableDef:

Set zestaw_rekordów = obiekt.OpenRecordset (typ, opcje, blokada)

Składnia metody OpenRecordset zawiera następujące elementy:

Obiekt Recordset typu tabela można utworzyć w oparciu o tabelę bazową bazy danych Microsoft Jet, nie można jednak utworzyć go w oparciu o tabelę ODBC lub tabelę połączoną. Obiekt Recordset typu tabela może być wykorzystywany z bazami danych ISAM (jak np. FoxPro, dBASE lub Paradox), jeśli zostaną one otwarte bezpośrednio.

W odróżnieniu od obiektów Recordset typu zestaw dynamiczny lub utrwalonego, obiekt Recordset typu tabela nie może odnosić się do więcej niż jednej tabeli bazowej i nie można go utworzyć za pomocą instrukcji SQL filtrującej lub sortującej dane. Ogólnie, przy dostępie do obiektu Recordset typu tabela należy określić jeden z predefiniowanych indeksów tabeli, który porządkuje dane zwracane do aplikacji. Jeśli tabela nie posiada indeksu, dane zwracane są w porządku przypadkowym. Aplikacja może utworzyć indeks zwracający rekordy w określonym porządku, jeśli jest to konieczne. Aby wybrać określony porządek danych w obiekcie Recordset typu tabela, należy ustawić właściwość Index tak, aby wskazywała istniejący indeks.

Także inaczej niż jest to w przypadku obiektów Recordset typu zestaw dynamiczny lub utrwalonego, w celu uzyskania właściwej wartości właściwości RecordCount nie jest konieczne jawne wypełnianie obiektów Recordset typu tabela.

Aby zachować integralność danych, podczas wykonywania metod Edit i Update obiekty Recordset typu tabela są zablokowane, dzięki czemu tylko jeden użytkownik jednocześnie może aktualizować określony rekord. Kiedy aparat bazy danych Microsoft Jet blokuje rekord, następuje zablokowanie całej dwukilobajtowej strony, zawierającej ten rekord.

Dla tabel innych niż ODBC stosowane są dwa rodzaje blokowania — pesymistyczne i optymistyczne. Tabele, do których dostęp realizowany jest za pośrednictwem ODBC, zawsze wykorzystują blokowanie optymistyczne. Warunki blokowania podczas edycji określa właściwość LockEdits.

Współdzielenie danych z innym aplikacjami

Visual Basic wyposażony jest w mechanizm, za pomocą którego aplikacje systemu Windows mogą się komunikować między sobą. Mechanizm ten nazwany jest Automatyzacją.

Automatyzacja to metoda manipulowania obiektami, znajdującymi się w innych aplikacjach - tak jakby stanowiły one rozszerzenia aplikacji tej w której pracujesz. Zatem będziemy zmuszeni poznać obiekty, metody i właściwości innych aplikacji.

W ramach dotychczasowej pracy z Access-em poznaliśmy takie obiekty jak formularz, raport, Datbase, Recordset i inne. Nauczyliśmy się manipulować tymi obiektami za pomocą Visual Basic-a.

Excel posiada takie obiekty jak Worksheet i Chart.

Chcielibyśmy prześledzić mechanizm Automatyzacji, który na poziomie Access-a dał mi możliwość tworzenia i edycji dokumentów (co z reguły realizujemy w edytorze tekstów).

Z poziomu Access-a kod zapisany w Visual Basic-u musi spowodować;

Inne sposoby współdzielenia danych

Oprócz mechanizmu Automatyzacji w systemie Windows istnieją też dwie inne metody umożliwiające współpracę między aplikacjami

Przykład metody Automatyzacji obiektów

Zamierzam zbudować aplikację bazodanową, która mogłaby zrealizować notę czyli wykonać typową czynność programu Word.

Chcemy to osiągnąć korzystając z języka Visual Basic oraz mechanizmu Automatyzacji.

Realizację tego celu rozbijemy na dwa zadania;

Pierwszy krok jest stosunkowo prosty dlatego nie będzie omawiany. Wymagane jest stworzenie w szablonie zakładki, która będzie wyznaczała miejsce wprowadzania danych z bazy.

Odwołania do biblioteki obiektów programu Word

Program Word posiada własną bibliotekę obiektów, przypominająca obiekty Access-a, VBA czy DAO. Aby uzyskać dostęp do tych obiektów z poziomu Access-a należy zmodyfikować odwołania na poziomie Access-a.

Sposób realizacji;

Kod realizujący nasze zadanie

Public Function UtwórzNotęWProgramieWord()

' Otwórz dokument noty w programie Word i wstaw tekst,

' z którego korzysta polecenie menu.

Dim dbs As Database, rstPracownicy As Recordset

Dim appWord As Word.Application

Dim intStrony As Integer, strKomunikat As String

Wśród deklaracji zmiennych, które generalnie są znane mamy deklarację zmiennej dla obiektu Word Application. Zmienna ta umożliwi w dalszej części procedury wykonanie odwołań do programu Word oraz jego poleceń. Ten specjalny typ danych staje się dostępny, gdy w programie Access uaktywniliśmy odpowiednią bibliotekę.

Otwórz zestaw rekordów na podstawie kwerendy PracownicyZRozpoczętymiZadaniami.

Set dbs = CurrentDb()

Set rstPracownicy = dbs.OpenRecordset("PracownicyZRozpoczętymiZadaniami")

Jeżeli żaden z pracowników nie ma otwartych zadań,

wyświetl komunikat i zakończ funkcję. Wykorzystano poniżej właściwość obiektu Recordset RecordCount (typu long), w której zawarta jest liczba rekordów obiektu tabela. Jeżeli liczba rekordów jest równa zero, wtedy wyświetlany jest odpowiedni komunikat i następuje wyjście z procedury.

If rstPracownicy.RecordCount = 0 Then

WyświetlKomunikat "W bazie danych brak otwartych zadań."

Exit Function

End If

Przejdź do programu Word, dzięki czemu po zakończeniu

tej procedury pozostanie on na ekranie.

On Error Resume Next

AppActivate "Microsoft Word"

Omówimy drugi wiersz powyższego kodu. Czyni on aktywnym Word - innymi słowy przechodzimy do Worda, ale tylko w sytuacji gdy jest on otwarty. Użyta jest instrukcja Appactivate

Jeżeli program Word nie jest uruchomiony, to włącz go i uaktywnij. Zawarta w wierszu powyżej instrukcja On Error Resume Next nakazuje programowi ignorować błędy, które mogą mieć miejsce podczas próby przejścia do Worda. Będzie to miało miejsce wtedy gdy Word nie będzie uruchomiany (działanie w tle). Procedura AppActtivate spowoduje błąd wykonania i wtedy będzie wykonywany kod w następnym wierszu.

If Err Then

Shell "c:\Program Files\Microsoft Office\Office\WinWord", _

vbMaximizedFocus

AppActivate "Microsoft Word"

End If

On Error GoTo 0

Powyższy kod sprawdza czy instrukcja Appactivate spowodowała błąd. Sprawdzana jest wartość obiektu Err. Jeżeli Err ma wartość (albo False) oznacza to iż przejście nastąpiło bez zakłóceń. Natomiast w przypadku gdy operacja przejścia zakończyła się niepowodzeniem Err ma wartość inną niż zero (albo True) wtedy wykonywane są procedury instrukcji warunkowej. Funkcja shell z dwoma argumentami ścieżką i stałą Visual Basić otwiera Word i jednocześnie maksymalizuje okno oraz czyni je aktywnym. Word zatem pozostaje na pierwszym planie.

Instrukcja On Error GoTo 0 wskazuje programowi Access, aby nie ignorował błędów, które mogą powstać w dalszej części procedury. Innymi słowy odwołuje ona poprzednią obsługującą błąd, która nakazywała przejść do następnej linii kodu w przypadku pojawienia się błedu (On Error Resume Next). Procedura ta powinna być wyposażona w kod obsługujący błędy.

Pobierz obiekt Application, który posłuży do prowadzenia

operacji Automatyzacji.

Set appWord = GetObject(, "Word.Application")

Powyżej funkcja GetObject umieszcza w zmiennej appWord odwołanie do obiektu Word Application. Z powodu, że program jest już uruchomiony obiekt appWord będzie dotyczył działającej obecnie kopii programu Word. Funkcja GetObject została użyta z jednym argumentem, pierwszy argument został pominięty. Przekazuje on nazwę konkretnego dokumentu.

Dysponując obiektem Word Application możemy wysyłać polecenia do programu Word.

Otwórz dokument oparty na szablonie noty,

wyłącz automatyczne sprawdzanie pisowni,

po czym przejdź do zakładki ZakładkaNoty.

With appWord

.Documents.Add "C:\Przykłady dla Access VBA\14Nota.dot"

.ActiveDocument.ShowSpellingErrors = False

.Selection.GoTo wdGoToBookmark, Name:="ZakładkaNoty"

End With

W dalszej części programu występuje blok With End With. Instrukcja With pozwala wykonać serię czynności dla jednego obiektu. Instrukcje rozpoczynające się od kropki odnoszą się do obiektu wskazanego w instrukcji With. Wyjaśnienie kodu

Wykonaj pętlę dla zestawu rekordów zwróconego przez kwerendę,

wstawiając w dokumencie nazwiska pracowników.

Do Until rstPracownicy.EOF

appWord.Selection.TypeText rstPracownicy!NazwiskoPracownika & " "

rstPracownicy.MoveNext

Loop

Powyższy blok jest pętlą, a do jej budowy wykorzystano funkcję(instrukcja) Do ... Loop. Po instrukcji Do występuje warunek Until, który ustala jak długo pętla będzie wykonywana. Jeżeli warunek zwraca wartość False pętla jest wykonywana. Gdy warunek zwróci True wtedy kończy się wykonywanie pętli.

Warunek w pętli odnosi się do właściwości EOF obiektu typu Recordset (EOF to akronim od słów End of file ). Właściwość przyjmuje wartość True jeżeli wskaźnik rekordu przesunie się poza ostatni rekord.

Pierwsza instrukcja w pętli wykorzystuje metodę TypeText obiektu Selection. Wprowadzany jest tekst pochodzący z kolumny NazwiskoPracownika tabeli rstPracownicy wraz z trzema spacjami na końcu.

W kolejnym wierszu mamy zastosowaną metodę MoveNext do obiektu typu Recordset w wyniku, której następuje przejście do następnego rekordu.

Instrukcja Loop ustala czy pętla ma być wykonywana ponownie.

Przejdź z powrotem do programu Access.

AppActivate "Aplikacja Śledzenia Zadań"

Odczytaj ilość stron w dokumencie noty, po czym

zapytaj użytkownika, czy dokument ma zostać wydrukowany.

Jeżeli użytkownik zgodzi się, to wydrukuj dokument.

intStrony = appWord.Selection.Information(wdNumberOfPagesInDocument)

strKomunikat = "Dokument noty jest gotowy i ma " & CStr(intStrony) & _

" stron. Wydrukować go?"

If Potwierdzenie(strKomunikat) Then

appWord.ActiveDocument.PrintOut

End If

End Function

W przykładzie tym chcemy wyeliminować tworzenie wzorca filtrowania przez użytkownika

Procedury w modułach formularza i raportu mogą wywoływać procedury dodane do modułów standardowych.

W programie Microsoft Access 95 moduły klasy istnieją tylko w powiązaniu z formularzem lub raportem. W programie Microsoft Access 97 moduły klasy mogą również istnieć niezależnie od formularza lub raportu. Ten rodzaj modułu klasy jest wyświetlony na karcie Moduły w oknie bazy danych. Modułu klasy z karty Moduły można użyć do utworzenia definicji obiektu niestandardowego. Aby dowiedzieć się więcej na temat programowania przy użyciu tych modułów klasy, należy kliknąć .

Function - instrukcja

Deklaruje nazwę, argumenty i kod składający się na procedurę typu Function.

Składnia

[Public | Private] [Static] Function nazwa [(lista_argumentów)] [As typ]

[instrukcje]

[nazwa = wyrażenie]

[Exit Function]

[instrukcje]

[nazwa = wyrażenie]

End Function

Składnia instrukcji Function zawiera następujące elementy:

Element

Opis

Public

Element nieobowiązkowy. Wskazuje, że procedura typu Function jest dostępna dla wszystkich innych procedur we wszystkich modułach. Jeżeli element ten zostanie zastosowany w module zawierającym instrukcję Option Private, to procedura jest niedostępna poza projektem.

Private

Element nieobowiązkowy. Wskazuje, że procedura typu Function jest dostępna dla innych procedur tylko wewnątrz modułu, w którym została zadeklarowana.

Static

Element nieobowiązkowy. Wskazuje, że wartości zmiennych lokalnych procedury typu Function są zachowywane między wywołaniami procedury. Atrybut Static nie ma wpływu na wartości zmiennych zadeklarowanych poza procedurą typu Function, nawet jeżeli są one wykorzystywane wewnątrz tej procedury.

nazwa

Element obowiązkowy. Nazwa procedury typu Function podana zgodnie ze standardowymi konwencjami nazewnictwa zmiennych.

lista_argumentów

Element nieobowiązkowy. Lista zmiennych reprezentujących argumenty przekazywane do procedury typu Function w trakcie jej wywoływania. Jeżeli występuje wiele zmiennych, to są one rozdzielone przecinkami.

typ

Element nieobowiązkowy. Typ wartości zwracanej przez procedurę typu Function, mogący przyjąć następujące postaci: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (obecnie nie obsługiwany), Date, String (z wyjątkiem ciągów o stałej długości), Obiekt, Variant lub dowolny typ zdefiniowany przez użytkownika. Wprawdzie tablice nie mogą być zwracane przez tę procedurę, to jednak wartości typu Variant zawierające tablicę - mogą.

instrukcje

Element nieobowiązkowy. Dowolny blok instrukcji, które mają być wykonane wewnątrz procedury typu Function.

wyrażenie

Element nieobowiązkowy. Wartość zwracana przez procedurę typu Function

.

Argument lista_argumentów składa się z następujących elementów o poniższej składni:

[Optional] [ByVal | ByRef] [ParamArray] nazwa_zmiennej [( )] [As typ] [= wartość_domyślna]

Element

Opis

Optional

Element nieobowiązkowy. Wskazuje, że argument nie jest wymagany. Jeżeli element ten zostanie użyty, wszystkie następne argumenty zawarte na liście_argumentów muszą być również nieobowiązkowe i zadeklarowane z wykorzystaniem słowa kluczowego Optional. Element Optional nie może zostać użyty w stosunku do żadnego argumentu, jeżeli występuje element ParamArray.

ByVal

Element nieobowiązkowy. Wskazuje, że argument przekazywany jest przez wartość.

ByRef

Element nieobowiązkowy. Wskazuje, że argument przekazywany jest przez odwołanie. W języku Visual Basic ByRef jest ustawieniem domyślnym.

ParamArray

Element nieobowiązkowy. Wykorzystywany jest tylko jako ostatni argument na liście_argumentów wskazując, że ostatnim argumentem jest tablica typu Optional zawierająca elementy typu Variant. Słowo kluczowe ParamArray pozwala na podanie dowolnej liczby argumentów. Element ParamArray nie może być używany razem z elementami ByVal, ByRef lub Optional.

nazwa_zmiennej

Element obowiązkowy. Nazwa zmiennej reprezentującej przekazywany do procedury argument. Musi być zgodna ze standardowymi konwencjami nazewnictwa zmiennych.

typ

Element nieobowiązkowy. Typ argumentu przekazywanego do procedury; dopuszczalne typy to Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (obecnie nie obsługiwany), Date, String (tylko o zmiennej długości), Object, Variant. Jeżeli parametr nie jest typu Optional, dopuszczalne są również typy zdefiniowane przez użytkownika i typy obiektów.

wartość_

domyślna

Element nieobowiązkowy. Dowolna stała lub wyrażenie stałe. Element dozwolony tylko dla parametrów typu Optional. Jeżeli parametr jest typu Object, jawnie podana wartość domyślna może być równa tylko Nothing.

Użycie

Jeżeli nie zostało to jawnie określone za pomocą słowa kluczowego Public lub Private, procedury typu Function

są domyślnie publiczne. Jeżeli pominięto słowo kluczowe Static, wartości przechowywane w zmiennych lokalnych nie są zachowywane między wywołaniami procedury.

Ostrzeżenie Procedury typu Function mogą być rekursywne, tzn. aby wykonać określone zadanie, mogą wywoływać same siebie. Należy jednak pamiętać, że rekursja może doprowadzić do przepełnienia stosu. W przypadku korzystania z mechanizmu rekursji w procedurach typu Function, w deklaracji zwykle nie stosuje się zwykle słowa kluczowego Static.

Cały wykonywalny kod musi znajdować się wewnątrz procedur. Nie można zdefiniować procedury typu Function wewnątrz innej procedury typu Function, Sub lub Property.

Instrukcja Exit Function powoduje natychmiastowe opuszczenie procedury typu Function. Wykonywanie programu wznawiane jest od instrukcji następującej bezpośrednio po wywołaniu procedury. W procedurze typu Function może wystąpić dowolna liczba instrukcji Exit Function, które mogą znajdować się w dowolnych miejscach tej procedury.

Podobnie jak procedura typu Sub, procedura typu Function jest oddzielną procedurą, mogącą pobierać argumenty, wykonywać szereg instrukcji i zmieniać wartości swoich argumentów. Jednak w odróżnieniu od procedury typu Sub, jeżeli wartość zwracana przez procedurę typu Function ma być wykorzystana, to wywołanie takiej procedury można umieścić po prawej stronie wyrażenia w taki sam sposób, w jaki wykorzystuje się dowolne funkcje wewnętrzne, takie jak Sqr, Cos lub Chr.

Wywołanie procedury typu Function w wyrażeniu następuje przez podanie nazwy funkcji poprzedzającej umieszczoną w nawiasach listę argumentów. Szczegółowe informacje na temat wywoływania procedur typu Function podano w opisie instrukcji Call.

Aby funkcja zwracała wartość, należy do nazwy funkcji przypisać jakąś wartość. Wewnątrz procedury można wielokrotnie dokonywać takich przypisań. Jeżeli do nazwy nie została przypisana żadna wartość, funkcja zwraca wartość domyślną: funkcja numeryczna - wartość 0, funkcja operująca na ciągach - ciąg o długości zerowej ("") a funkcja typu Variant - wartość Empty. Funkcja, która zwraca odwołanie do obiektu, zwraca wartość Nothing, jeżeli wewnątrz funkcji nie zostało przypisane nazwie (za pomocą instrukcji Set) odwołanie do obiektu.

Poniższy przykład ilustruje sposób, w jaki należy funkcji o nazwie Szukanie_binarne przypisać zwracaną wartość. W tym przypadku do nazwy przypisywana jest wartość False, jeśli określony element nie został odnaleziony.

Function Szukanie_binarne(. . .) As Boolean

. . .

' Element nie odnaleziony. Zwróć wartość False.

If dolny > górny Then

Szukanie_binarne = False

Exit Function

End If

. . .

End Function

Zmienne wykorzystywane w procedurach typu Function dzielą się na dwie kategorie: jawnie i niejawnie zadeklarowane wewnątrz procedury. Zmienne zadeklarowane w procedurze w sposób jawny (za pomocą instrukcji Dim lub podobnej) są zawsze zmiennymi lokalnymi procedury. Zmienne wykorzystywane, ale nie zadeklarowane w procedurze w sposób jawny, są także lokalne, pod warunkiem, że nie są jawnie zadeklarowane na dowolnym wyższym poziomie poza procedurą.

Ostrzeżenie Procedura może wykorzystywać zmienną, która nie jest jawnie zadeklarowana w procedurze, ale istnieje niebezpieczeństwo wystąpienia konfliktu nazw, jeżeli jakakolwiek inna zmienna zadeklarowana na poziomie modułu ma tę samą nazwę. Jeżeli procedura odwołuje się do nie zadeklarowanej zmiennej, która ma taką samą nazwę jak inna procedura, stała lub zmienna, przyjmuje się, że odwołanie to odnosi się do nazwy elementu zadeklarowanego na poziomie modułu. Aby uniknąć konfliktu tego rodzaju, należy deklarować zmienne w sposób jawny. Aby wymusić jawne deklarowanie zmiennych, można wykorzystać instrukcję Option Explicit.

Instrukcja AppActivate

Uaktywnia okno aplikacji.

Składnia

AppActivate title[, wait]

Składnia instrukcji AppActivate zawiera następujące nazwane argumenty:

Argument

Opis

title

Argument obowiązkowy. Wyrażenie znakowe określające tekst umieszczony na pasku tytułu uaktywnianego okna aplikacji. W celu uaktywnienia aplikacji zamiast argumentu title można również użyć identyfikatora zadania zwracanego przez funkcję Shell.

wait

Argument nieobowiązkowy. Wartość typu Boolean która określa, czy aplikacja wołająca inną aplikację ma fokus. Wartość False (domyślnie) powoduje, że wywoływana aplikacja jest uaktywniana niezależnie od tego, czy aplikacja miała fokus. Wartość True powoduje, że aplikacja wołająca czeka, aż zostanie do niej przekazany fokus, a następnie uaktywnia podaną aplikację.

Użycie

Instrukcja AppActivate przenosi fokus na podaną aplikację lub okno, ale nie wpływa na to, czy aplikacja jest minimalizowana czy maksymalizowana. Fokus jest przenoszony z okna uaktywnionej aplikacji, gdy użytkownik wykonuje czynność związaną ze zmianą fokusu lub zamyka okno dialogowe. Aby uruchomić aplikację lub ustawić styl okna, należy użyć funkcji Shell.

Podczas określania, która aplikacja ma zostać uaktywniona, argument title jest porównywany z tytułami wszystkich aktualnie działających aplikacji. Jeśli żaden z tytułów okien nie jest zgodny z porównywanym wzorcem, uruchamiana jest ta aplikacja, dla której początkowa część tytułu odpowiada wartości argumentu title. Jeśli istnieje więcej instancji aplikacji o podanym title, zostanie wybrana jedna w nich.

Funkcja shell

Uruchamia program i w przypadku powodzenia zwraca wartość typu Variant (Double) reprezentującą identyfikator zadania odpowiadającego uruchomionemu programowi, natomiast w przypadku niepowodzenia zwraca zero.

Składnia

Shell(pathname[,windowstyle])

Funkcja Shell ma następujące nazwane argumenty:

Argument

Opis

pathname

Argument obowiązkowy typu Variant (String). Jest to nazwa programu, który ma być uruchomiony, wraz z wszystkimi potrzebnymi argumentami lub opcjami podawanymi w wierszu poleceń; może zawierać nazwę katalogu lub folderu oraz nazwę dysku.

windowstyle

Argument nieobowiązkowy typu Variant (Integer) odpowiadający stylowi okna, w którym ma być wykonywany program. Jeśli windowstyle jest pominięty, program jest uruchamiany w postaci zminimalizowanej z fokusem.

Nazwany argument windowstyle może przyjąć jedną z następujących wartości:

Stała

Wartość

Opis

VbHide

0

Okno jest ukrywane, a fokus jest przekazywany do tego ukrytego okna.

VbNormalFocus

1

Okno otrzymuje fokus, a rozmiar i położenie okna są przywracane do stanu początkowego.

VbMinimizedFocus

2

Okno jest wyświetlane jako ikona z fokusem.

VbMaximizedFocus

3

Okno jest maksymalizowane i ma fokus.

VbNormalNoFocus

4

Odtwarzany jest ostatni rozmiar i położenie okna. Aktualnie aktywne okno pozostaje aktywne.

VbMinimizedNoFocus

6

Okno jest wyświetlane jako ikona. Aktualnie aktywne okno pozostaje aktywne.

Użycie

Jeśli funkcja Shell poprawnie uruchomiła podany plik wykonywalny, zwraca jako wynik identyfikator zadania. Identyfikator zadania jest to liczba jednoznacznie określająca wykonujący się program. Jeśli funkcja Shell nie może uruchomić wskazanego programu, sygnalizowany jest błąd. W przypadku użycia w środowisku Microsoft Windows funkcji MacID z funkcją Shell wystąpi błąd.

Uwaga Funkcja Shell uruchamia programy w sposób asynchroniczny. Oznacza to, że program uruchomiony przez funkcję Shell może się nie zakończyć przed rozpoczęciem wykonywania instrukcji występujących po funkcji Shell.

Funkcja GetObject

Zwraca odwołanie do obiektu typu ActiveX pochodzącego z pliku.

Składnia

GetObject([pathname] [, class])

Funkcja GetObject ma następujące nazwane argumenty:

Element

Opis

pathname

Argument nieobowiązkowy typu Variant (String). Pełna ścieżka dostępu i nazwa pliku zawierającego obiekt pobierany. Jeżeli argument pathname zostanie pominięty, argument class jest obowiązkowy.

class

Argument nieobowiązkowy typu Variant (String). Ciąg znaków reprezentujący klasę obiektu.

Argument class ma składnię nazwa_aplikacji.typ_obiektu i składa się z następujących elementów:

Element

Opis

nazwa_aplikacji

Element obowiązkowy typu Variant (String). Nazwa aplikacji udostępniającej obiekt.

typ_obiektu

Element obowiązkowy typu Variant (String). Typ lub klasa tworzonego obiektu.

Użycie

Funkcję GetObject wykorzystuje się do uzyskania dostępu do obiektu ActiveX znajdującego się w pliku i przypisania go zmiennej obiektowej. Aby zwrócony przez funkcję GetObject obiekt przypisać zmiennej obiektowej, należy wykorzystać instrukcję Set. Na przykład:

Dim Obiekt_CAD As Object

Set Obiekt_CAD = GetObject("C:\CAD\SCHEMAT.CAD")

Efektem wykonania powyższego fragmentu kodu programu jest uruchomienie aplikacji związanej ze ścieżką pathname i aktywacja obiektu w określonym pliku.

Jeżeli argument pathname jest ciągiem o długości zerowej (""), funkcja GetObject zwraca nowe wystąpienie obiektu określonego typu. Jeżeli argument atphname zostanie pominięty, funkcja GetObject zwraca aktualnie aktywny obiekt podanego typu. Jeżeli nie istnieje żaden obiekt podanego typu, wystąpi błąd.

Niektóre aplikacje umożliwiają aktywację tylko części pliku. Aby tego dokonać, należy do końca nazwy pliku dołączyć znak wykrzyknika (!) oraz ciąg określający część pliku, która ma zostać uaktywniona. Więcej informacji o tym, w jaki sposób tworzyć taki ciąg, można znaleźć w dokumentacji aplikacji, która utworzyła obiekt.

Na przykład, w aplikacji do rysowania, rysunek zapisany w pliku może składać się z wielu warstw. W takim przypadku uaktywnienie dowolnej warstwy rysunku o nazwie SCHEMAT.CAD można przeprowadzić poniższym kodem programu:

Set Obiekt_warstwowy = GetObject("C:\CAD\SCHEMAT.CAD!Layer3")

Jeżeli nie zostanie określony argumentem class, czyli klasa obiektu, proces automatyzacji w oparciu o podaną nazwę pliku wyznaczy aplikację, która ma zostać uruchomiona, oraz obiekt, który ma zostać uaktywniony. Jednak niektóre pliki mogą obsługiwać więcej niż jedną klasę obiektów. Na przykład, rysunek może obsługiwać trzy różne typy obiektów: obiekt typu Application, obiekt typu Drawing i obiekt typu Toolbar, które wszystkie są częścią tego samego pliku. Aby określić, który obiekt z pliku ma zostać uaktywniony, należy wykorzystać argument nieobowiązkowy class. Na przykład:

Dim Mój_obiekt As Object

Set Mój_obiekt = GetObject("C:\RYSUNKI\PRÓBKA.DRW", "FIGMENT.DRAWING")

W przedstawionym powyżej przykładzie FIGMENT jest nazwą aplikacji do rysowania, a DRAWING jest jednym z obsługiwanych przez tę aplikację typów obiektów.

Po uaktywnieniu obiektu można się do niego odwoływać w kodzie programu za pomocą zdefiniowanych wcześniej zmiennych obiektowych. Kontynuując poprzedni przykład, dostęp do właściwości i metod nowego obiektu możliwy jest za pomocą zmiennej obiektowej Mój_obiekt. Na przykład:

Mój_obiekt.Line 9, 90

Mój_obiekt.InsertText 9, 100, "Pozdrawiam wszystkich"

Mój_obiekt.SaveAs "C:\RYSUNKI\PRÓBKA.DRW"

Uwaga Funkcji GetObject należy używać wtedy, gdy istnieje bieżące wystąpienie obiektu lub jeśli trzeba utworzyć obiekt z już załadowanego pliku. Jeżeli bieżące wystąpienie nie istnieje i nie istnieje konieczność uruchomienia obiektu w sytuacji z już załadowanym plikiem, należy użyć funkcji CreateObject.

Jeżeli obiekt zarejestrował się sam jako obiekt o pojedynczym wystąpieniu, tworzone jest tylko jedno jego wystąpienie, niezależnie od liczby wywołań funkcji CreateObject. W przypadku obiektu o pojedynczym wystąpieniu, funkcja GetObject wywołana z ciągiem o długości zerowej zwraca zawsze to samo wystąpienie, a wywołana z pominięciem argumentu pathname powoduje błąd. Nie można używać funkcji GetObject do uzyskania odwołania do klasy utworzonej w języku Visual Basic.

Add metoda - Method (kolekcji dokumnetów Documents Collection)

Dodaje nowy, pusty dokument do kolekcji otwartych dokumentów.

Składnia

expression.Add(Template, NewTemplate)

expression Required. An expression that returns a Documents object.

Template Optional Variant. The name of the template to be used for the new document. If this argument is omitted, the Normal template is used.

NewTemplate Optional Variant. True to open the document as a template. The default value is False.

GoTo Method

Document or Range object: Returns a Range object that represents the start position of the specified item, such as a page, bookmark, or field.

Selection object: Moves the insertion point to the character position immediately preceding the specified item, and returns a Range object (except for the wdGoToGrammaticalError, wdGoToProofreadingError, or wdGoToSpellingError constant).

Note When you use this method with the wdGoToGrammaticalError, wdGoToProofreadingError, or wdGoToSpellingError constant, the Range that's returned includes any grammar error text or spelling error text.

Syntax

expression.GoTo(What, Which, Count, Name)

expression Required. An expression that returns a Document, Range, or Selection object.

What Optional Variant. The kind of item that the range or selection is to be moved to. Can be one of the following WdGoToItem constants:

WdGoToBookmark

WdGoToComment

wdGoToEndnote

WdGoToEquation

wdGoToField

WdGoToFootnote

wdGoToGrammaticalError

WdGoToGraphic

wdGoToHeading

WdGoToLine

wdGoToObject

WdGoToPage

wdGoToPercent

WdGoToProofreadingError

wdGoToSection

WdGoToSpellingError

wdGoToTable

Which Optional Variant. The item that the range or selection is to be moved to. Can be one of the following WdGoToDirection constants: wdGoToAbsolute, wdGoToFirst, wdGoToLast, wdGoToNext, wdGoToPrevious, or wdGoToRelative.

The following examples are functionally equivalent, they both move the selection to the first heading in the document.

Selection.GoTo What:=wdGoToHeading, Which:=wdGoToFirst

Selection.GoTo What:=wdGoToHeading, Which:=wdGoToAbsolute, Count:=1

Count Optional Variant. The number of the item in the document. The default value is 1. The following example moves the selection to the fourth line in the document.

Selection.GoTo What:=wdGoToLine, Which:=wdGoToAbsolute, Count:=4

Only positive values are valid. To specify an item that precedes the range or selection, use wdGoToPrevious as the Which argument and specify a Count value. The following example moves the selection up two lines.

Selection.GoTo What:=wdGoToLine, Which:=wdGoToPrevious, Count:=2

Name Optional Variant. If the What argument is wdGoToBookmark, wdGoToComment, wdGoToField, or wdGoToObject, this argument specifies a name. The following example moves to the next DATE field.

Selection.GoTo What:=wdGoToField, Name:="Date"

BOF, EOF - właściwości

Wartości zwracane

Dla właściwości BOF i EOF zwracane są wartości typu Boolean.

Właściwość BOF zwraca wartość True, jeżeli pozycja odpowiadająca bieżącemu rekordowi znajduje się przed pierwszym rekordem i wartość False, jeżeli pozycja ta znajduje się na lub za pierwszym rekordem.

Właściwość EOF zwraca wartość True, jeżeli pozycja odpowiadająca bieżącemu rekordowi znajduje się za ostatnim rekordem i wartość False, jeżeli pozycja ta znajduje się na lub przed ostatnim rekordem.

Użycie

Właściwości BOF i EOF mogą być stosowane przy określaniu, czy obiekt Recordset zawiera rekordy i czy podczas przechodzenia od rekordu do rekordu przekroczone zostały granice obiektu Recordset.

Położenie wskaźnika bieżącego rekordu określa wartości zwracane przez właściwości BOF i EOF.

Jeżeli obie właściwości BOF i EOF zwracają wartość True, nie ma bieżącego rekordu.

Jeżeli zostanie otwarty obiekt Recordset nie zawierający rekordów, obie właściwości BOF i EOF są ustawione na wartość True, a wartość właściwości RecordCount obiektu Recordset wynosi 0. Jeżeli zostanie otwarty obiekt Recordset zawierający przynajmniej jeden rekord, pierwszy rekord staje się bieżącym, a właściwości BOF i EOF mają wartości False; ich wartości pozostają False do momentu, aż nastąpi przejście poza początek lub poza koniec obiektu Recordset za pomocą metod, odpowiednio, MovePrevious i MoveNext. Jeżeli nastąpi przejście poza początek lub poza koniec obiektu Recordset, oznacza to, że nie ma bieżącego rekordu lub żaden rekord nie istnieje.

Jeżeli zostanie usunięty ostatni rekord obiektu Recordset, właściwości BOF i EOF mogą mieć w dalszym ciągu wartości False, aż zostanie zmienione położenie bieżącego rekordu.

Jeżeli w stosunku do obiektu Recordset zawierającego rekordy zostanie użyta metoda MoveLast, bieżącym rekordem stanie się rekord ostatni; jeżeli następnie zostanie zastosowana metoda MoveNext, bieżący rekord stanie się nieprawidłowy, a właściwość EOF przyjmie wartość True. Na odwrót, jeżeli w stosunku do obiektu Recordset zawierającego rekordy zostanie użyta metoda MoveFirst, bieżącym rekordem stanie się rekord pierwszy; jeżeli następnie zostanie zastosowana metoda MovePrevious, żaden rekord nie będzie bieżącym i właściwość BOF przyjmie wartość True.

Zazwyczaj, gdy konieczne jest przetworzenie wszystkich rekordów obiektu Recordset, w kodzie umieszczana jest pętla po wszystkich rekordach wykorzystująca metodę MoveNext, wykonywana do czasu, aż właściwość EOF przyjmie wartość True.

Stosowanie metody MoveNext, podczas gdy właściwość EOF ma wartość True, lub metody MovePrevious, podczas gdy właściwość BOF ma wartość True, powoduje wystąpienie błędu.

Poniższa tabela określa, które metody typu Move są dozwolone z różnymi kombinacjami wartości właściwości BOF i EOF.

MoveFirst, MoveLast

MovePrevious, Move < 0

Move 0

MoveNext, Move > 0

BOF=True,

EOF=False

Dozwolona

Błąd

Błąd

Dozwolona

BOF=False,

EOF=True

Dozwolona

Dozwolona

Błąd

Błąd

Obie True

Błąd

Błąd

Błąd

Błąd

Obie False

Dozwolona

Dozwolona

Dozwolona

Dozwolona

Oznaczenie metody typu Move jako dozwolonej nie oznacza, że metoda ta zawsze znajdzie szukane rekordy. Jest to jedynie wskazówka, że wykonanie określonej metody Move jest dopuszczalne i nie spowoduje wystąpienia błędu. Stan właściwości BOF i EOF może zmieniać się w wyniku wykonania metody typu Move.

Metoda OpenRecordset wewnętrznie wywołuje metodę MoveFirst. Stąd zastosowanie metody OpenRecordset na pustym zestawie rekordów ustawia właściwości BOF i EOF na wartość True. (W tabeli poniżej podano efekt zakończonego niepowodzeniem wykonania metody MoveFirst.)

Wszystkie metody typu Move po znalezieniu rekordu ustawiają obie właściwości BOF i EOF na wartość False.

W obszarze roboczym Microsoft Jet dodanie rekordu do pustego zestawu rekordów Recordset powoduje ustawienie właściwości BOF na wartość False, natomiast właściwość EOF pozostaje True wskazując, że bieżącą jest pozycja na końcu zestawu Recordset. W obszarze roboczym ODBCDirect obie właściwości BOF i EOF przyjmują wartości False wskazując, że bieżącą pozycją jest pozycja nowego rekordu.

Żadna z metod Delete, nawet jeżeli usuwa ostatni, jedyny rekord z obiektu Recordset, nie powoduje zmiany wartości właściwości BOF i EOF.

Poniższa tabela przedstawia wpływ metod typu Move na ustawienia właściwości BOF i EOF w sytuacji, gdy rekord nie zostanie znaleziony.

BOF

EOF

MoveFirst, MoveLast

True

True

Move 0

Bez zmiany

Bez zmiany

MovePrevious, Move < 0

True

Bez zmiany

MoveNext, Move > 0

Bez zmiany

True

Powtarzanie instrukcji Do ... Loop, aż warunek przyjmie wartość True

Są dwa sposoby zastosowania słowa kluczowego Until do sprawdzenia warunku w instrukcji Do...Loop. Warunek można sprawdzać przed wejściem do pętli (tak jak pokazano w procedurze UntilNajpierw) lub po wykonaniu pętli przynajmniej jeden raz (tak jak pokazano w procedurze UntilPotem). Pętla powtarzana jest tak długo, jak długo warunek ma wartość False.

Sub UntilNajpierw()

licznik = 0

Liczba = 20

Do Until Liczba = 10

Liczba = Liczba - 1

licznik = licznik + 1

Loop

MsgBox "Pętla wykonała " & licznik & " powtórzeń."

End Sub

Sub UntilPotem()

licznik = 0

Liczba = 1

Do

Liczba = Liczba + 1

licznik = licznik + 1

Loop Until Liczba = 10

MsgBox " Pętla wykonała " & licznik & " powtórzeń."

End Sub

Instrukcja On Error

Włącza program obsługi błędów i określa jego położenie wewnątrz procedury. Instrukcję tę można też wykorzystać do wyłączenia programu obsługi błędów.

Składnia

On Error GoTo wiersz

On Error Resume Next

On Error GoTo 0

Składnia instrukcji On Error może przyjąć jedną z następujących form:

Instrukcja

Opis

On Error GoTo wiersz

Włącza program obsługi błędów rozpoczynający się od wiersza podanego jako obowiązkowy argument wiersz. Argument wiersz jest dowolną etykietą wiersza lub numerem wiersza. Jeżeli wystąpi błąd wykonania, sterowanie przechodzi do podanego wiersza, uaktywniając program obsługi błędów. Określony wiersz musi występować w tej samej procedurze co instrukcja On Error, w przeciwnym przypadku wystąpi błąd w czasie kompilacji.

On Error Resume Next

Powoduje, że jeżeli wystąpi błąd, sterowanie przechodzi do instrukcji znajdującej się bezpośrednio po instrukcji, wykonanie której spowodowało błąd. W przypadku używania obiektów należy korzystać raczej z tej instrukcji, a nie On Error GoTo.

On Error GoTo 0

Wyłącza wszystkie włączone programy obsługi błędów w bieżącej

Użycie

Jeżeli instrukcja On Error nie jest wykorzystywana, dowolny błąd wykonania, jeśli wystąpi, jest błędem fatalnym. Oznacza to, że wyświetlony zostaje komunikat o błędzie, a wykonywanie programu jest zatrzymywane.

“Włączony” program obsługi błędów to taki, który został włączony przez instrukcję On Error; "aktywny" program obsługi błędów to włączony program obsługi błędów aktualnie obsługujący błąd. Jeżeli błąd wystąpi w chwili, gdy program obsługi błędów jest aktywny (między miejscem wystąpienia błędu a instrukcjami Resume, Exit Sub, Exit Function lub Exit Property), program obsługi błędów w bieżącej procedurze nie obsłuży tego błędu. Sterowanie przekazane zostanie z powrotem do procedury wołającej. Jeżeli procedura wołająca ma włączony program obsługi błędów, jest on uaktywniany w celu obsługi tego błędu. Jeżeli program obsługi błędów procedury wołającej również jest aktywny, sterowanie powraca poprzez poprzednie procedury wołające aż do momentu, gdy znaleziony zostanie włączony, ale nie aktywny program obsługi błędów. Jeżeli nie zostanie znaleziony taki program obsługi błędów, błąd w miejscu jego wystąpienia staje się błędem fatalnym Za każdym razem, gdy program obsługi błędów przekazuje sterowanie wstecz do procedury wołającej, procedura ta staje się procedurą aktywną. Kiedy błąd zostanie obsłużony przez program obsługi w dowolnej procedurze, wykonywanie programu jest kontynuowane w bieżącej procedurze, od miejsca określonego przez instrukcję Resume.

Uwaga Program obsługi błędów nie jest procedurą typu Sub ani Function. Jest to fragment kodu programu oznaczonego etykietą wiersza lub numerem wiersza.

Programy obsługi błędów wykorzystują w celu wyznaczenia przyczyny błędu właściwość Number obiektu Err. Program obsługi błędów powinien sprawdzać lub zapisywać niezbędne właściwości w obiekcie Err, zanim wystąpi jakikolwiek inny błąd lub zanim zostanie wywołana procedura, która może być źródłem błędu. Wartości właściwości obiektu Err dotyczą tylko ostatniego błędu. Komunikat o błędzie związanym z wartością właściwości Err.Number zawarty jest we właściwości Err.Description.

Instrukcja Resume

Wznawia wykonywanie programu po zakończeniu działania programu obsługującego błąd.

Składnia

Resume [0]

Resume Next

Resume wiersz

Składnia instrukcji Resume może przyjąć jedną z następujących form:

Instrukcja

Opis

Resume

Jeżeli błąd wystąpił w tej samej procedurze, w której znajduje się program obsługi błędów, wykonywanie wznawiane jest od instrukcji, która spowodowała błąd. Jeżeli błąd wystąpił w procedurze wywołanej, wykonywanie wznawiane jest od instrukcji, która ostatnio wywołała procedurę zawierającą program obsługi błędów.

Resume Next

Jeżeli błąd wystąpił w tej samej procedurze, w której znajduje się program obsługi błędów, wykonywanie wznawiane jest od instrukcji znajdującej się bezpośrednio po instrukcji, która spowodowała błąd. Jeżeli błąd wystąpił w procedurze wywołanej, wykonywanie wznawiane jest od instrukcji znajdującej się bezpośrednio za instrukcją, która ostatnio wywołała procedurę zawierającą program obsługi błędów (lub od instrukcji On Error Resume Next).

Resume wiersz

Wykonywanie wznawiane jest od wiersza określonego w obowiązkowym argumencie wiersz. Argument wiersz jest etykietą wiersza lub numerem wiersza i musi wyznaczać wiersz w tej samej procedurze co program obsługi błędów.

Użycie

Wykorzystanie instrukcji Resume w dowolnym miejscu poza programem obsługi błędów spowoduje błąd.

Err -obiekt

Zawiera informacje o błędzie wykonania.

Użycie

Wartości właściwości obiektu Err są ustawiane w zależności od tego, co, lub kto, jest przyczyną wystąpienia błędu: język Visual Basic, jakiś obiekt czy programista języka Visual Basic.

Właściwością domyślną obiektu Err jest właściwość Number. Ponieważ nazwa Err może reprezentować właściwość domyślną, nie trzeba modyfikować wcześniejszego kodu programu, w którym użyto funkcji Err lub instrukcji Err.

Wystąpienie błędu wykonania powoduje przypisanie do właściwości obiektu Err dokładnych informacji o błędzie oraz sposobie jego obsługi.

Aby w kodzie programu wygenerować błąd wykonania, należy użyć metody Raise.

Po użyciu wewnątrz procedury obsługi błędu bloku instrukcji Resume lub On Error albo instrukcji Exit Sub, Exit Function lub Exit Property, właściwościom obiektu Err przypisywane są zera lub ciągi o długości zerowej (""). Za pomocą metody Clear można jawnie przywrócić stan początkowy właściwości obiektu Err.

Aby wygenerować błąd wykonania dla modułu klasy, należy zamiast instrukcji Error użyć metody Raise. Używanie metody Raise w innych fragmentach kodu programu zależy od ilości rodzaju informacji, które mają być uzyskane. W przypadku, gdy do generowania błędu zamiast metody Raise używana jest instrukcja Error, właściwościom obiektu Err przypisywane są wartości domyślne podane w poniższej tabeli:

Właściwość

Wartość

Number

Wartość podana jako argument instrukcji Error. Może to być dowolny poprawny numer błędu.

Source

Nazwa bieżącego projektu w języku Visual Basic.

Description

Jeżeli istnieje jakiś ciąg, to odpowiada on wartości zwracanej przez funkcję Error dla podanej właściwości Number. Jeżeli ciąg nie istnieje, właściwość Description zawiera ciąg "Błąd zdefiniowany w obiekcie lub aplikacji".

HelpFile

Pełne określenie nazwy dysku, ścieżki dostępu oraz nazwy pliku Pomocy języka Visual Basic.

HelpContext

Identyfikator tematu z pliku Pomocy języka Visual Basic, który dotyczy błędu związanego z właściwością Number.

LastDLLError

Występuje jedynie w 32-bitowych systemach operacyjnych Microsoft Windows; zawiera kod błędu systemowego ostatniego odwołania do biblioteki dołączanej dynamicznie (DLL) (DLL). LastDLLError służy tylko do odczytu.

Używanie obiektu Err oraz instrukcji Error nie zmusza do zmian w istniejącym już kodzie programu, może jednak wywołać niezamierzone skutki. Na przykład, nawet gdy właściwościom obiektu Err zostaną wcześniej przypisane pewne wartości, w chwili wykonywania instrukcji Error zostaną one zastąpione przez wartości domyślne podane w powyższej tabeli. Mimo, że nadal można używać instrukcji Error do generowania błędów wykonania w języku Visual Basic, możliwość ta wynika głównie z potrzeb zachowania zgodności z istniejącym kodem programu. Jednak do generowania błędów systemowych w nowym kodzie programu, szczególnie w kodzie modułów klas, należy używać obiektu Err, metody Raise i metody Clear.

Obiekt Err jest obiektem wewnętrznym o zakresie globalnym. Nie ma potrzeby tworzenia jego instancji w kodzie programu.

TypeText Method

Inserts the specified text. If the ReplaceSelection property is True, the selection is replaced by the specified text. If ReplaceSelection is False, the specified text is inserted before the selection.

Składnia

wyrażenie .TypeText(Text)

wyrażenie jest wymagane. Musi to być obiekt typu Selection

Argumentem tej metody jest łańcuch, który ma być wprowadzony. Argument ten jest wymagany.

Praca pochodzi z serwisu www.e-sciagi.pl

Pojęcie fokus jest szersze od ustawienia kursora.

Domyślam się, iż pierwsze wybrane pole zostanie wykorzystane do stworzenia połączenia. Oznacza, to iż wprowadzona przez użytkownika wartość będzie porównywana z zawartością tego pola. Gdy wartość zostanie znaleziona na ekranie uzyskamy rekord, który spełnia powyższe warunki. Problem pojawia się gdy mamy „relację” jeden do wielu.

Mamy tutaj do czynienia z pytaniem wybudowanym w formularz. Pytanie to nie istnieje w obiektach typu kwerenda. Przy nazwie tej właściwości widzimy tylko kod w języku MS SQL. Oczywiście do modyfikacji kodu języka MS SQL mogę wykorzystać konstruktora kwerend. Jednak nie wszystkie możliwości konstruktora są do wykorzystania. Próba wprowadzenia maski wprowadzania zakończyła się niepowodzeniem. Oznacza, to iż możliwe są te modyfikacje, które akceptuje MS SQL.

Równoznaczne są zapisy ?Forms.Kontakty.Filter i ?Forms!Kontakty.Filter po obiekcie Forms może się pojawić zarówno kropka jak i wykrzyknik. Kolejna ważna informacja - analizator programu nie zadziała prawidłowo jeżeli w nazwie formularza będzie użyta spacja.

Przy tworzeniu procedury przy jej nazwie w nawiasie zadeklarowaliśmy Cancel jako integer. Jaki istnieje związek między tym faktem a przyporządkowaniem Cancel wartości True. Z uwagi na zróżnicowany typ zmiennych wydaje się, że związek nie istnieje ???

Próby poczynione dla formularza tabelarycznego (?Forms!Nazwa_formularza.Controls(0)) zakończyły się niepowodzeniem. Czyli jak gdyby metoda - właściwość dotyczy tylko formularza kolumnowego ???

Uwaga: Skoro rodzaj obiektu formant jest niedostępny w oknie właściwości, zatem pola etykiety nie można przekształcić w pole tekstowe.

wartość pola nie ma związku z tym czy pole jest związane czy też nie.

0x01 graphic

0x01 graphic



Wyszukiwarka

Podobne podstrony:
jak działa bank (22 str)(1), Bankowość i Finanse
Musioł Małgorzata Czym jest i jak działa masaż dźwiękiem wg metody Petera Hessa
01 2006 czym sa i jak powstaja teorie fizyczne
Czym jest i jak działa kapitalizacja odsetek
inne ego rcyzmy poznaj czym jest i jak dziala ego mateusz grzesiak ebook
czym są negocjacje i jak je prowadzić, Materiały szkoleniowe
CZYM SĄ PRZEBARWIENIA I JAK Z NIMI WALCZYĆ
Czym są granice i jak z sukcesem stawiać je dziecku
Szafrański (red ) współczesne zagrożenia terroryzmem oraz metody działań antyterrorystycznych 2007
Broń EMP – jak działa i czym grozi humanitarny postrach naszych czasów

więcej podobnych podstron