Zaheslované spuštění procedury ve VBA

Zaheslované spuštění procedury může být potřeba v případě, kdy je procedura sice veřejná (zobrazuje se v dialogu Makro, viz Alt+F8), nicméně právo spustit ji (resp. její podstatnou část) má jen oprávněná osoba (znající heslo). Řešení je vcelku snadné – stačí využít parametr při jejím volání nebo vnořit testovací proceduru.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Sub ZaheslovaneSpusteni()

    Dim blnPristup As Boolean

    'volani vlastni funkce
    blnPristup = pefPristup

    If blnPristup = True Then

        '... kod procedury

    Else

        'hlaska
        MsgBox "Nemáte oprávnění spouštět tuto proceduru.", vbExclamation + _
            vbOKOnly

        'opusteni procedury
        Exit Sub

    End If


End Sub

Private Function pefPristup() As Boolean

    'nezabezpecene heslo
    Const cstrHeslo As String = "xxx"

    Dim strPromenna As String

    'InputBox pro zadani hesla (znaky nekryte hvezdickou)
    strPromenna = Application.InputBox("Zadejte heslo", "Ověření přístupu")

    If (strPromenna <> "False") And (Len(strPromenna) > 0) And _
        (StrComp(strPromenna, cstrHeslo, vbBinaryCompare) = 0) Then

        'neklepnuto na tlacitko Storno nebo krizek
        'neprazdne heslo
        'spravne heslo (rozlisuje velikost pismen)
        pefPristup = True

    End If

End Function
Zaheslované spuštění procedury
Zaheslované spuštění procedury

Použité heslo (xxx) je zde bohužel nechráněné hned dvakrát – vyskytuje se na přímo zapsané v kódu VBA a není kryto hvězdičkami při zadávání do InputBoxu. V prvním případě si zčásti pomůžeme zamknutím projektu, ve druhém bychom museli buď InputBox nahradit TextBoxem (viz vlastnost PasswordChar) na UserFormu, případně InputBox chránit krycími znaky s pomocí API.

Tip: Aby byla procedura veřejná (Public), a tedy dostupná ze všech modulů projektu ve VBA, ale přitom se nevypisovala v dialogu Makro, postačí zkraje modulu, kde se nachází, uvést klauzuli Option Private Module. Pozor! To, že se v dialogu procedura nevypisuje, ještě neznamená, že ji nelze po ručním zápisu jejího názvu spustit… A ač to není zjevné, v dialogu Makro je možné spouštět procedury i s parametry.