Często się zdarza, że w wybranym arkuszu przechowujemy dane wrażliwe. Mogą to być ceny produktów, marże, dane osobowe pracowników lub jakieś inne poufne informacje.
Zazwyczaj chcemy, aby dostęp do nich miały tylko wybrane osoby, które obsługują plik. Priorytetem jest dla nas staranne zabezpieczenie tych danych – nie chcemy, aby dostały się one w niepowołane ręce.
Budowa Pliku
Plik składa się z dwóch arkuszy: Instrukcja i Ceny. Domyślnie aktywny jest pierwszy z nich, drugi zaś aktywuje się po wpisaniu prawidłowego hasła w wyskakującym okienku.
Nie chcemy używać do tego celu arkusza głęboko ukrytego (xlVeryHidden). Arkusz z cenami będzie często używany przez niektóre osoby, więc chcemy, aby pozostał widoczny.
Jak to zrobić?
Idea Działania Formularza
Naszym celem jest stworzenie bardzo prostego, wręcz minimalistycznego formularza.
Najważniejszą kontrolką będzie pole tekstowe, do którego będziemy wpisywać hasło. Oprócz Textboxa, na formularzu powinny się znaleźć także dwa przyciski typu CommandButton – Anuluj i OK.
Ale chcemy zrobić jeszcze jedną rzecz… Chcemy pozwolić użytkownikowi na zatwierdzenie hasła klawiszem ENTER, bez konieczności klikania w przycisk OK na formularzu.
Budowa Formularza
Formularz nazwiemy sobie UHaslo. W jego skład wejdą następujące kontrolki.

- txtHaslo – tutaj będziemy wpisywać hasło
- lblHaslo – etykieta ze słowem Hasło
- cmdOK – zatwierdzenie hasła
- cmdAnuluj – ukrycie formularza
Kod Formularza
Zmienne Prywatne i Właściwości Publiczne
Private Const ms_MODUL As String = "UHaslo"
Option Explicit
Private msHaslo As String
Private mbOK As Boolean
Property Get Haslo() As String: Haslo = msHaslo: End Property
Property Get OK() As String: OK = mbOK: End Property
Na samej górze umieszczamy zmienne prywatne, których zadaniem jest przechwycenie wpisanego hasła i informacji czy użytkownik kliknął w przycisk OK.
Na bazie tych zmiennych prywatnych tworzymy właściwości globalne.
Obsługa Przycisków OK i Anuluj
Private Sub cmdOK_Click()
mbOK = True
Me.Hide
End Sub
Private Sub cmdAnuluj_Click()
mbOK = False
Me.Hide
End Sub
Przyciski ustawiają wartość zmiennej prywatnej mbOK. Jeśli użytkownik kliknie cmdOK, wówczas będzie to wartość TRUE. Jeśli kliknie cmdAnuluj będzie to wartość FALSE.
Dodatkowo, kliknięcie w jeden z przycisków ukrywa formularz.
Obsługa Pola Tekstowego
Private Sub txtHaslo_Exit(ByVal Cancel As MSForms.ReturnBoolean)
msHaslo = Me.txtHaslo.Text
End Sub
' Kliknięcie ENTER na klawiaturze
Private Sub txtHaslo_Keydown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
msHaslo = Me.txtHaslo.Text
mbOK = True
Me.Hide
End If
End Sub
W tym miejscu sprawdzamy dwa istotne zdarzenia.
Zdarzenie Exit
Wyzwalane jest w momencie wyjścia z pola tekstowego txtHaslo i aktywacji innej kontrolki. W tym momencie do zmiennej prywatnej msHaslo powinno zostać przechwycone wpisane hasło.
Zdarzenie Keydown
Wyzwalane jest w momencie wciśnięcia dowolnego klawisza na klawiaturze. Za pomocą parametru KeyCode sprawdzamy czy użytkownik kliknął przycisk ENTER (kod 13).
Jeżeli tak było wówczas:
- przechwytujemy do zmiennej msHaslo wpisane hasło. Działa to więc tak samo jak w zdarzeniu txtHaslo_Exit.
- przypisujemy zmiennej prywatnej mbOK wartość TRUE. Czyli postępujemy tak samo jak w przypadku kliknięcia w przycisk cmdOK
- ukrywamy formularz
Ukrycie Formularza
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
Cancel = True
Me.Hide
End If
End Sub
Obsługujemy zdarzenie zamknięcia formularza (kliknięcia w krzyżyk). Nie chcemy formularza zamykać, tylko go ukryć, tak aby nie tracić wprowadzonych do niego informacji.
Kod Arkusza Ceny
Drugi kod znajduje się w module arkusza Ceny i wywoływany jest automatycznie przy próbie jego aktywacji.
Private Const ms_MODUL As String = "wksCeny"
Option Explicit
Private Sub Worksheet_Activate()
Dim frmHaslo As UHaslo ' Egzemplarz formularza
Dim sHaslo As String ' Wpisane hasło
Dim bCzyOk As Boolean ' Czy kliknął OK
'Aktywuj inny arkusz
1 wksInstrukcja.Select
'Utwórz kopię obiektu UHaslo
2 Set frmHaslo = New UHaslo
'Wyświetl w trybie modalnym
3 frmHaslo.Show vbModal
'Zaczytaj hasło i czyOK?
4 bCzyOk = frmHaslo.OK
5 sHaslo = frmHaslo.Haslo
'Wyloguj formularz
6 Unload frmHaslo
'Pokaż ceny jeśli hasło jest prawidłowe
'i jeśli user kliknął OK lub ENTER
7 If bCzyOk Then
8 If sHaslo = "Tajne" Then
9 wksCeny.UsedRange.EntireColumn.Hidden = False
10 Application.EnableEvents = False
11 wksCeny.Select
12 Application.EnableEvents = True
13 End If
14 End If
End Sub
Private Sub Worksheet_Deactivate()
wksCeny.UsedRange.EntireColumn.Hidden = True
End Sub
Analiza Kodu
- Pierwszą rzeczą, którą robię jest aktywacja arkusza z instrukcją, czyli zablokowanie możliwości wejścia do arkusza z cenami
- Tworzę kopię obiektu UHaslo i wyświetlam formularz w celu wprowadzenia hasła
- Zaczytuję do zmiennych: wpisane hasło + informację czy użytkownik kliknął OK (lub ENTER na klawiaturze)
- Jeśli hasło się zgadza i zmienna bCzyOk przybiera wartość OK, wówczas zezwalam na aktywację arkusza z cenami
- Wcześniej jednak musimy wykonać dwie rzeczy. Po pierwsze, odkryć kolumny z cenami produktów. Po drugie, wyłączyć zdarzenia aby uniknąć rekurencji. Polecenie wksCeny.Select wyzwala zdarzenie Activate, więc bez wyłączenia na chwilę zdarzeń, mielibyśmy niekończącą się pętlę.
Jest jeszcze jedna rzecz, którą robimy w momencie deaktywacji arkusza z cenami. A mianowicie, ukrywamy kolumny z cenami produktów. Dlaczego tak robimy? Dowiesz się z filmu.
Uwagi
Opcjonalnie możemy dodać linijkę Application.EnableEvents = True w zdarzeniu Workbook_BeforeSave lub Workbook_BeforeClose. Jest to nasze zabezpieczenie na wypadek, gdyby zdarzenia zostały przypadkowo wyłączone w pliku.