Jak z nazwy pliku wyciągnąć rozszerzenie

przez | 2024-09-15

Czasami w zmiennej mamy nazwę pliku (np. plik.txt, bądź możemy mieć też podaną pełną ścieżkę wraz z nazwą pliku np. c:\katalog\podkatalog\plik.txt). I chcemy z tej nazwy pliku wyciągnąć samo rozszerzenie (np. txt). Bo np. w zależności od tego czy użytkownik wskazał plik tekstowy a graficzny nasze makro ma wykonać inną operację.

Jak najprościej sprawdzić jakie rozszerzenie ma nasz plik?

Czytaj dalej

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