Żądanie potwierdzenia wykonania operacji

Czasem, przy operacjach potencjalnie niebezpiecznych, np usuwanie i nadpisywanie plików czy usuwanie danych z bazy powinniśmy dodatkowo zażądać potwierdzenia wykonania operacji, aby nie było możliwe przypadkowe jej wykonanie. Idealnym rozwiązaniem tego będzie poniższa funkcja:

Function fnBrakPotwierdzenia(Pytanie As String) As Boolean
    Dim Odp As Long
    Odp = MsgBox(Pytanie, vbYesNo + vbCritical + vbDefaultButton2, "UWAGA!")
    If Odp = vbNo Then fnBrakPotwierdzenia = True
End Function

Jej użycie będzie wyglądało np tak:

Sub Glowna()
    If fnBrakPotwierdzenia("Czy na pewno...?") Then Exit Sub
    'tu wywołanie procedury niebezpiecznej
End Sub

Zabezpieczenia makr, poziomy zabezpieczeń

Na szczęście makrowirusy nie są ostatnio bardzo popularne, ale proszę zawsze uważać, lepiej dmuchać na zimne. Poziom zabezpieczeń ustawiamy z menu – Narzędzia – Makro – Zabezpieczenia.

Nie wolno ustawiać niskiego poziomu zabezpieczeń, ponieważ wtedy każdy uruchomiony plik zawierający makro, będzie mógł je bez pytania uruchomić. W większości przypadków należy użyć średniego poziomu zabezpieczeń, który gwarantuje zadanie pytania czy włączyć makra, przy uruchamianiu pliku. Proszę się dobrze zastanowić przed odpowiedzią na to pytanie!

Nigdy nie należy włączać makr w obcym nieznanym pliku!

Zabezpieczenia wysokie i bardzo wysokie stosujemy tylko gdy mamy wykupiony certyfikat bezpieczeństwa do projektu VBA co się raczej rzadko zdarza

Jak skorzystać z kodu VBA znalezionego w Internecie

Dla początkujących może być to poważny problem. Przede wszystkim trzeba ocenić czy przypadkiem kod nie jest szkodliwy. Na szczęście w przypadku kodu VBA jest to bardzo rzadko spotykane. Po drugie trzeba rozróżnić czy jest to kod do umieszczenia w module publicznym, czy prywatnym module formularza, raportu, skoroszytu czy arkusza.

Moduł publiczny wstawiamy z menu Instert – Module (wcześniej Alt-F11 aby otworzyć edytor VBA). Tu wklejamy funkcje, które mają być dostępne z poziomu funkcji użytkownika w Excelu czy też w każdej kwerendzie, raporcie czy formularzu w Accessie (np wrzucamy tu funkcję Slownie, jeżeli chcemy aby była powszechnie dostępna w całej bazie)

Moduł prywatny zawsze związany jest z jakimś obiektem. Tylko tu możemy umieścić kod automatycznie wykonujący się z powodu zdarzeń generowanych przez użytkownika takich jak otwarcie czy zamknięcie dokumentu, lub kliknięcie w przycisk. Jeżeli widzimy kod bezpośrednio odwołujący się do kontrolek na formularzu, jak np poniższe dwie procedury:

Private Sub UserForm_Initialize()
 
    przyciskUruchom.Enabled = False
    listaFunkcji.AddItem "Funkcja1"
    listaFunkcji.AddItem "Funkcja2"
 
End Sub
 
Private Sub listaFunkcji_Click()
    przyciskUruchom.Enabled = True
End Sub

to znaczy, że aby przetestować taki kod trzeba: po pierwsze trzeba utworzyć formularz, po drugie umieścić na nim pole listy i przycisk a po trzecie odpowiednio je ponazywać (właściwość Name kontrolki). Efektem powyższych procedur jest początkowe wyłączenie przycisku i załadowanie pola listy. Następnie gdy użytkownik kliknie coś na liście, przycisk zostanie włączony.

Jak generować niepowtarzalne nazwy plików, tabel, arkuszy i innych obiektów

Generując automatycznie raporty w Excelu, dokumenty w Wordzie czy też tabele w Accessie, moglibyśmy niechcący nadpisać poprzednie wersje. Aby tego uniknąć nadamy im niepowtarzalne nazwy. Pomocna tu będzie znakomita funkcja Format(wyrażenie, string_formatujący). Warto poczytać o niej w helpie. Na jej podstawie zbudujemy własną funkcję:

Function fnStempelCzasowy() As String
fnStempelCzasowy = Format(Now(), "_yyyymmdd_hhmmss")
End Function

Jak bezpiecznie wyłączyć komunikaty ostrzegawcze w Excelu

Z wyłączeniem komunikatów ostrzegawczych nie ma problemu. Jest to właściwość logiczna Excela. Problemem jest fakt, że pozostawienie wyłączonych komunikatów ostrzegawczych jest bardzo niebezpieczne przy późniejszej normalnej pracy użytkownika. Poniżej przykład procedury, gdzie na pewno zawsze nastąpi przywrócenie komunikatów, nawet gdy wystąpi błąd w procedurze. Jest to możliwe przy użyciu poprawnej obsługi błędów.

Private Sub UsunBiezacyArkuszBezOstrzezenia()
 
    On Error GoTo Obsluga
 
    'wyłącz komunikaty ostrzegawcze
    Application.DisplayAlerts = False 
 
    ActiveSheet.Delete
 
Czyszczenie:
    On Error Resume Next
    Application.DisplayAlerts = True 'przywróć komunikaty
    Exit Sub
 
Obsluga:
    MsgBox Err & ". " & Err.Description
    Resume Czyszczenie
 
End Sub

Co to znaczy: Wymaga referencji do Microsoft Office XX Object Library

Oznacza to, że w edytorze VBA należy uruchomić okienko do dodawania referencji do bibliotek obiektowych (Tools – References), znaleźć bibliotekę Microsoft Office XX Object Library (gdzie XX to nr Twojego Office’a, np 14.0) i wstawić przy niej ptaszek