Jakiś czas temu pisałem dla klienta mini aplikację, która miała za zadanie prowadzenie ewidencji umów. W skrócie: gdy pracownik pozyskał klienta to wprowadzał do formularza dane. Następnie makro sprawdzało różne warunki, generowało różne raporty i wstawiało do arkusza odpowiednie dane.
Każdy pracownik miał swoją własną pulę numerów umów. Numer umowy miał następujący schemat:
Kolejny numer / akronim pracownika / rok
Akronimem pracownika były 3 pierwsze litery jego imienia. Przykładowo dla Karola pierwsza umowa w roku 2024 miała następujący numer:
1/KAR/2024
System sobie całkiem fajnie działał do czasu aż nie została zatrudniona Martyna. Dla niej umowa miała taki oto numer:
1/MAR/2024
Excel automatycznie ten numer umowy zamienił na datę 1 marzec 2024. A data to tak naprawdę liczba, czyli dla 1 marca 2024 do komórki została wstawiana liczba: 45352. I system zaczął się psuć z powodu mojego przeoczenia. Uproszczony kod odpowiedzialny za wstawianie numeru umowy wyglądał następująco:
Sub WstawNumerUmowy(Wiersz As Long, Kolumna As Long, Numer As Long, Akronim As String, Rok As Long)
Dim NrUmowy As String
'tutaj jeszcze były jakieś dodatkowe linijki kodu, które sprawdzają czy np. podany numer już nie został wcześniej użyty
'albo czy nie ma "dziury" w numeracji itp.
NrUmowy = CStr(Numer) + "/" + Akronim + "/" + CStr(Rok)
Cells(Wiersz, Kolumna).Value = NrUmowy
End Sub
Sub TestNrUmowy()
Const KOLUMNA_NR_UMOWY = 5
'Tu będzie OK
Call WstawNumerUmowy(2, KOLUMNA_NR_UMOWY, 1, "KAR", 2024)
'Zamieni na 01-mar-24 czyli 45352
Call WstawNumerUmowy(3, KOLUMNA_NR_UMOWY, 1, "MAR", 2024)
End Sub
Co zrobić aby go naprawić? Otóż wystarczyło albo w danej kolumnie gdzie się wpisuje numery umów ustawić typ komórek jako Tekstowe. Dla bezpieczeństwa dodatkowo dodałem jedną linijkę kodu, która zmienia format komórki na tekstowy. Wystarczyło w procedurze WstawNumerUmowy przed linijką:
Cells(Wiersz, Kolumna).Value = NrUmowy
Dodać
Cells(Wiersz, Kolumna).NumberFormat = "@"
Jak widać – pisząc makra trzeba cały czas myśleć, czy gdzieś czegoś użytkownik nie może zepsuć i próbować temu zapobiegać.