Zapisywanie ustawień aplikacji w rejestrze systemu Windows

przez | 2024-07-11

Tworząc w VBA nawet proste skrypty dość często zachodzi potrzeba zapisania gdzieś pewnych danych konfiguracyjnych. Przykładowo niedawno pisałem aplikację dla zaprzyjaźnionego biura rachunkowego do wysyłania informacji o wysokości obliczonych podatków do klientów.

I tutaj wpadłem na pomysł że można w Outlooku zapisać wiadomość z opóźnioną wysyłką (np. 15 minut) aby w razie gdyby księgowa źle coś kliknęła można było usunąć wiadomości ze skrzynki nadawczej; albo sprawdzić czy wiadomości zostały poprawnie wygenerowane.

Z czasem jak wszystko jest OK księgowa mogłaby chcieć ustawić, aby od teraz nowe wiadomości wychodziły natychmiast.

Jak najprościej zapisać dowolne ustawienie? Otóż dawniej tworzyłem proste pliki INI w których zapisywałem ustawienia. Ale tutaj jest masa roboty: należy zapisać plik w odpowiednim folderze, przy odczytywaniu sprawdzić czy plik istnieje (jeśli nie to załadować jakieś domyślne ustawienia), odpowiednio parsować plik przy odczytywaniu ustawień. Na szczęście mamy w VBA 2 wygodne instrukcje do zapisu (i odczytu) danych z rejestru systemu Windows.

Czytaj dalej

Publiczne procedury i ich widoczność w oknie Makro

przez | 2024-07-07

Naciskając kombinację klawiszy ALT+F8 lub wybierając polecenie Makra z karty Deweloper możemy ujrzeć taką oto niespodziankę:

Często w modułach tworzę publiczne procedury, które dzięki temu, że są publiczne mogą być wywoływane z różnych miejsc (np. mogę chcieć, aby niektóre uniwersalne procedury były wywoływane z różnych formularzy).

Ale nie chcę aby te procedury były dostępne w okienku Makra gdyż są to procedury pomocnicze dla mojego kodu a nie procedury dla użytkownika,  których celem jest wywołanie jakiejś funkcjonalności z aplikacji.

Niestety, ale takie publiczne procedury są tez widoczne w oknie Makra (na szczęście nie są widoczne procedury, które są umieszczone w formularzach albo te, które w modułach są poprzedzone słowem kluczowym Private).

Co zrobić, aby takie procedury nie były widoczne?

Czytaj dalej

Kompaktowanie bazy danych programu Access

przez | 2024-07-05

Pisząc aplikację w programie Access lub w dowolnym innym programie, który przechowuje dane w plikach accdb czasami zachodzi potrzeba kompaktowania bazy danych.

Czym jest owe kompaktowanie? W skrócie można ten proces porównać do defragmentacji dysku twardego. Otóż jeśli zapiszesz w bazie jakiś rekord zawierający sporo informacji (np. jakiś długi string) to po usunięciu owego rekordu nie jest on fizycznie kasowany z pliku a jedynie jest oznaczony jako usunięty. Gdy często do bazy dodajemy jakieś wpisy, które później usuwamy to rozmiar takiego pliku bazy danych może rosnąć. W skrajnym przypadku może się okazać, że po zaimportowaniu kilkuset MB danych i ich usunięciu plik accdb ma kilkaset MB objętości. Dlatego jeśli Twoja aplikacja często usuwa dane z takiego pliku warto jest dodać jakąś procedurę kompaktowania. Dzięki temu plik będzie zajmował mniej miejsca na dysku jak również może to wpłynąć na przyśpieszenie działania aplikacji.

Czytaj dalej

Word – Jak usunąć wszystkie hiperłącza

przez | 2024-07-05

Czasami mamy dokument, w którym są hiperłącza. Aby usunąć hiperłącza najszybciej jest zaznaczyć tekst w którym owe hiperłącza występują, a następnie nacisnąć kombinację klawiszy Ctrl+Spacja. Niestety, ale ten skrót klawiszowy również usuwa formatowanie tekstu. Na szczęście możemy skorzystać z prostego makra, które przeskanuje cały dokument (lub tylko zaznaczony fragment) w poszukiwaniu hiperłączy i je usunie. Oto przykładowy kod.

Czytaj dalej

Jak zwrócić nazwę obecnego miesiąca?

przez | 2024-07-02

Czasami chcemy zwrócić nazwę aktualnego miesiąca. Pierwsza myśl, jaka przychodzi mi do głowy to prosta instrukcja Select Case:

Function PodajMiesiac(Miesiac As Long) As String
    Dim Ret As String
    
    Select Case Miesiac
        Case 1: Ret = "Styczeń"
        Case 2: Ret = "Luty"
        Case 3: Ret = "Marzec"
        Case 4: Ret = "Kwiecień"
        Case 5: Ret = "Maj"
        Case 6: Ret = "Czerwiec"
        Case 7: Ret = "Lipiec"
        Case 8: Ret = "Sierpień"
        Case 9: Ret = "Wrzesień"
        Case 10: Ret = "Październik"
        Case 11: Ret = "Listopad"
        Case 12: Ret = "Grudzień"
        Case Else: Ret = "Zły miesiąc"
    End Select
    
    PodajMiesiac = Ret
End Function


Sub Testuj()
    Dim Miesiac As Long
    
    Miesiac = Month(Date)
    MsgBox "Obecny miesiąc to: " + PodajMiesiac(Miesiac), vbInformation
End Sub

Jest jednak prostszy sposób.

Czytaj dalej

Jak zwrócić aktualny miesiąc jako liczbę rzymską?

przez | 2024-07-02

Wielokrotnie podczas programowania potrzeba zwrócić numer miesiąca (niekoniecznie aktualnego) jako liczbę rzymską. Po co? Otóż czasami np. wygenerowany numer zamówienia ma w sobie zawarty miesiąc. I klientka zażyczyła sobie, aby miesiąc nie był jako numer miesiąca, tylko była to liczba rzymska. Pierwsza moja myśl była następująca:

Function PodajMiesiacRzymski(Miesiac As Long) As String
    Dim Ret As String
    
    Select Case Miesiac
        Case 1: Ret = "I"
        Case 2: Ret = "II"
        Case 3: Ret = "III"
        Case 4: Ret = "IV"
        Case 5: Ret = "V"
        Case 6: Ret = "VI"
        Case 7: Ret = "VI"
        Case 8: Ret = "VIII"
        Case 9: Ret = "IX"
        Case 10: Ret = "X"
        Case 11: Ret = "XI"
        Case 12: Ret = "XII"
        Case Else: Ret = "zły miesiąc"
    End Select
    
    
    PodajMiesiacRzymski = Ret
End Function


Sub Testuj()
    Dim Miesiac As Long
    
    Miesiac = Month(Date)
    MsgBox "Obecny miesiąc jako liczba rzymska to: " + PodajMiesiacRzymski(Miesiac), vbInformation
End Sub

Instrukcja Select Case jest bardzo wygodna, gdyż w przypadku podania nietypowego numeru klauzura Case Else może zwrócić wartość domyślną (np. pusty ciąg znaków, tekst zły miesiąc itp.)

Inne „podręcznikowe” rozwiązanie jakie często widuję to „stablicowanie” numerów miesięcy i zwrócenie odpowiedniego elementu tablicy. No ale, nie byłoby tego wpisu, gdyby nie fakt, że można to zrobić nieco sprytniej.

Czytaj dalej

Jak sprawdzić gdzie jest zainstalowany Access (lub Outlook)

przez | 2024-06-30

Jedną z rzeczy, które mnie denerwują w VBA to jest brak 100% pokrycia metod i właściwości w obiekcie Application. Przykładowo jeśli chciałbym się dowiedzieć w jakim folderze jest zainstalowany Word, Excel lub PowerPoint to mógłbym użyć instrukcji:

MsgBox Application.Path 

I to wszystko. Niestety, ale ani w programie Access ani w Outlook obiekt Application nie posiada właściwości Path. A czasami chcemy z jakiegoś powodu wiedzieć w jakim folderze mamy zainstalowany dany program. Na szczęście znalazłem ciekawy trik.

Czytaj dalej

Jak wstrzymać wykonywanie skryptu zanim uruchomiony program się nie zakończy?

przez | 2024-06-30

Instrukcja Shell służy do uruchamiania zewnętrznych programów.

Oto prosty przykład:

Sub TestKalkulatora()
    MsgBox "Uruchamiam kalkulator", vbInformation
    Shell "calc.exe"
    MsgBox "Widzę, że skończyłeś liczyć ;-)", vbInformation
End Sub

Niestety, ale druga instrukcja MsgBox wyświetli się jeszcze zanim instrukcja Shell „zdąży” uruchomić kalkulator 😉 A my chcielibyśmy, aby druga instrukcja MsgBox wykonała się dopiero wtedy gdy zamkniemy kalkulator, który został uruchomiony przez instrukcję Shell. Na szczęście jest pewne rozwiązanie tego problemu.

Czytaj dalej

Jak odpalić VBE po kliknięciu w przycisk?

przez | 2024-06-25

Ostatnio pisałem proste narzędzie rozszerzające możliwości edytora Visual Basic (VBE) i chciałem w arkuszu Excela umieścić przycisk w którego kliknięcie od razu mi uruchamia edytor VBA.

No cóż zamiast klikać w kartę Deweloper i potem w Visual Basic chciałem zaoszczędzić jedno kliknięcie gdyż w danym projekcie (na etapie rozwoju) często po otworzeniu skoroszytu od razu odpalałem VBE.

Czytaj dalej

Jak usunąć wszystkie hiperłącza z arkusza?

przez | 2024-06-23

Czasami chcemy usunąć wszystkie hiperłącza w aktywnym arkuszu. Do napisania tej notki zainspirował mnie wpis z mojego drugiego bloga: Walidacja adresów e-mail w Excelu.

Podczas wklejania adresów e-mail do arkusza czasami Excel mi automatycznie tworzył z adresów e-mail hiperłącza. A ja tego nie chciałem. Wiem, można w ustawieniach autokorekty wyłączyć automatyczne tworzenie hiperłączy ale załóżmy, że od kogoś już otrzymaliśmy taki skoroszyt i chcemy się pozbyć wszystkich hiperłączy z arkusza.

Czytaj dalej