vbamania.pl
login:
hasło:
 
  *Rejestracja *Zapomniane hasło
 Dziś jest czwartek, 18 kwietnia 2024 roku.
Ustaw jako stronę startową Ulubione Napisz
Artykuły
Procedury zdarzeniowe.
zamieszczony: 22 października 2003
przez: admin
czytany 53197 razy.

Poniższy opis tyczy się procedur zdarzeniowych dla Excela2000.

Jeżeli otworzymy edytor VBA dla MS Excel, to zobaczymy kilka (w zależności od ilości otwartych plików *.xls i ilości arkuszy w tych plikach) modułów.
Po dwukrotnym kliknięciu na wybrany moduł (na początek niech to będzie Arkusz1), pojawi się okienko, w którym można wpisywać kod. Nie byłoby w tym nic ekscytującego, ale w tych modułach można wstawiać specjalne procedury, zwane zdarzeniowymi. Uruchamiane one są wówczas automatycznie, gdy użytkownik wykonuje jakieś operacje w Excelu. (np. otwieranie pliku, zapisywanie pliku, zmiana aktywnego arkusza). Stwarza do doskonałą możliwość automatycznego uruchamiania makr VBA, bez klikania w specjalne przyciski, czy paski narzędzi. Pomimo, że jest tych procedur kilkanaście, nie trzeba pamiętać ich nazw i argumentów. Jeżeli z listy rozwijalnej położonej z prawej strony ekranu wybierzemy obiekt Worksheet, na liście położonej po stronie prawej pojawi się spis dostępnych procedur zdarzeniowych dla tego obiektu (patrz rysunek).



Zdarzenia obiektu Worksheet (arkusz).

Obiekt Worksheet posiada następujące procedury zdarzeniowe:

Worksheet_Activate()

Uruchamiana wówczas, gdy użytkownik uaktywni dany arkusz

Worksheet_Deactivate()

Uruchamiana wówczas, gdy bieżący arkusz przestaje być aktywny, np. wtedy, gdy użytkownik uaktywni inny arkusz.

przykład użycia:

Private Sub Worksheet_Activate()

   MsgBox "W tym arkuszu są przechowywane ważne dane." & _
   vbCrLf & "Nie należy ich modyfikować!", vbExclamation

End Sub


Worksheet_BeforeDoubleClick(ByValTarget As Range, Cancel As Boolean)
Worksheet_BeforeRightClick(ByVal TargetAs Range, Cancel As Boolean)

Powyższe procedury są uruchamiane wówczas, gdy użytkownik kliknie dwa razy (pierwsza procedura) lub kliknie prawym przyciskiem myszy (procedura druga) na obszar okna arkusza.

Argumentami tych procedur są:

- Target - (argument przekazywany przez wartość) czyli komórka lub zakres komórek, na który kliknął użytkownik.
- Cancel - (argument przekazywany przez referencje) - informacja o anulowaniu zdarzenia.

przykłady użycia:
Pierwsza procedura zmienia kolor klikniętej komórki na żółty,
Po powtórnym kliknięciu wypełnienie jest usuwane.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

With Target.Interior
   If .ColorIndex = xlNone Then .ColorIndex = 6 Else .ColorIndex = xlNone
End With

Cancel = True

End Sub

Poniższa procedura uniemożliwia użytkownikowi wywołanie menu podręcznego (pod prawym przyciskiem myszy).

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

MsgBox "Żadnego klikania!"
Cancel = True

End Sub


Worksheet_Calculate()

Procedura wywoływana po przeliczeniu arkusza.


Worksheet_Change(ByVal Target As Range)

Wywołana po zmianie zawartości dowolnej komórki arkusza. Argumentem jest tutaj adres zmienianej komórki (lub zakresu komórek).


Worksheet_FollowHyperlink(ByVal Target As Hyperlink)

Procedura wywoływana, gdy użytkownik kliknie na link umieszczone na arkuszu. Argument Target to adres, wskazywany przez link.


Worksheet_SelectionChange(ByVal Target As Range)

Uruchomiana, gdy użytkownik zmienia obszar zaznaczenia na arkuszu.
przykład użycia:

Gdy użytkownik zmienia obszar zaznaczenia na arkuszu, na pasku stanu jest wyświetlana informacja o ilo?ci wierszy i kolumn w zaznaczonym obszarze. Gdy zaznaczona jest tylko jedna komórka, wyświetlany jest pusty ciąg.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

With Target
   If .Rows.Count <> 1 or .Columns.Count <> 1 Then
      Application.StatusBar = "Zaznaczenie: " & .Rows.Count &" wiersze(y) i " _
      & .Columns.Count & " kolumn(y)."
   Else
      Application.StatusBar = vbNullString
   End If
End With

End Sub


Zdarzenia obiektu Workbook (skoroszyt).

Obiekt Workbook, reprezentujacy otwarty plik *.xls posiada następujące procedury zdarzeniowe:

Workbook_Activate()
Workbook_Deactivate()

Pierwsza procedura jest wywoływana w momencie uaktywnienia skoroszytu, a druga wtedy, kiedy skoroszyt przestaje być aktywny (np. użytkownik uaktywnił inny otwarty plik).


Workbook_AddinInstall()
Workbook_AddinUninstall()

Pierwsza procedura jest wywoływana w momencie gdy skoroszyt jest ładowany jako Dodatek (patrz menu Narzędzia->Dodatki), druga gdy jest on wyładowywany.


Workbook_BeforeClose(Cancel As Boolean)

Procedura jest uruchamiana, gdy użytkownik próbuje zamknąć skoroszyt.


Workbook_BeforePrint(Cancel As Boolean)

Procedura jest uruchamiana, gdy użytkownik próbuje wydrukować skoroszyt. Dzięki tej procedurze można zablokować drukowanie pliku *.xls

przykład:

Private Sub Workbook_BeforePrint(Cancel As Boolean)

MsgBox "Nie można wydrukować tego pliku.", vbCritical
Cancel = True

End Sub


Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Uruchamiana w momencie próby zapisu skoroszytu.
Argument SaveAsUI będzie miał warto?ć TRUE jeżeli okno dialogowe Save As będzie wyświetlone (np. podczas pierwszego zapisu pliku).
Dzięki tej procedurze można zabezpieczyć skoroszyt przed zapisaniem niepożądanych zmian.


Workbook_NewSheet(ByVal Sh As Object)

Uruchamiana w momencie wstawienia do skoroszytu nowego arkusza.
Argument Sh, który jest zmienna obiektowa reprezentuje wstawiany arkusz.
przykład:
Do nazwy wstawianego arkusza dołączona będzie nazwa użytkownika.

Private Sub Workbook_NewSheet(ByVal Sh As Object)

Sh.Name = Sh.Name & " (" & Application.UserName & ")"

End Sub


Workbook_Open()

Procedura uruchamiana w momencie otwarcia pliku.
Można ja wykorzystać do automatycznego uruchamiania makr.

przykład użycia:
poniższa procedurę należy umie?cić w module ThisWorkbook:

Private Sub Workbook_Open()
  Call PokazEkran
End Sub

natomiast poniższa procedura może się znaleĄć w dowolnym miejscu projektu (także w innym module).
W momencie otwarcia pliku wyświetlone zostanie okno komunikatu z pytaniem, czy edytować otwarty skoroszyt.
Jeżeli użytkownik wybierze NIE, skoroszyt zostanie zamknięty.

Sub PokazEkran()

Dim ret As Variant

ret = MsgBox("Otworzyłe? plik " & ThisWorkbook.Name & "." & vbCr & _
"Czy chcesz go edytować?", vbYesNo)
If ret = vbNo Then ThisWorkbook.Close SaveChanges:=False

End Sub


Workbook_SheetActivate(ByVal Sh As Object)
Workbook_SheetDeactivate(ByVal Sh As Object)
Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Workbook_SheetBeforeRightClick(ByVal Sh As Object, Cancel ByVal Target As Range, Cancel As Boolean)
Workbook_SheetCalculate(ByVal Sh As Object)
Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Workbook_SheetFollowHyperlink(ByVal Sh As Object, ByVal Target As Hyperlink
Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal TargetAs Range)

Powyższe procedury są analogiczne do omówionych powyżej procedur dla obiektu Worksheet (arkusza).
Występuje tu dodatkowy argument (Sh), identyfikujący arkusz. Należy używać tych procedur, jeżeli chcemy dodawać lub usuwać arkusze ze skoroszytu.


Workbook_WindowActivate(ByVal Wn As Window) Workbook_WindowDeactivate(ByVal Wn As Window)

Te procedury uruchamiane wówczas gdy uaktywnione/dezaktywowane jest okno skoroszytu.
Argumentem jest tu zmienna obiektowa reprezentująca okno.


Workbook_WindowResize(ByVal Wn As Window)

Procedura jest uruchamiana, gdy użytkownik zmienia obszar okna skoroszytu.
Podobnie jak poprzednio argumentem jest tu zmienna obiektowa reprezentująca zmieniane okno.


Opis powyższy należy uzupełnic jeszcze o procedury

Auto_Open()
Auto_Close()

Sa one dokładnymi odpowiednikami procedur zdarzenowych Workbook_Open()
i Workbook_Close(), ale umieszczone one moga być we zwykłym module, a nie module Workbook.

wstecz