Z poziomu VBA możemy tworzyć własne funkcje użytkownika – tzw. UDF. Możemy je wywoływać w swoich makrach jak również korzystać z nich bezpośrednio w komórkach arkusza. Funkcja uniwersalna pozwala zwrócić w wyniku dowolny typ wartości, zależnie od wartości argumentu.
O funkcji uniwersalnej
Osoby, które chcą zacząć swoją przygodę z VBA często pytają o to, jaką książkę wybrać na start. Kiedyś jeden z moich kolegów z Excelforum odpowiedział:
„Zacznij od (Walken)Bacha” .
Moim zdaniem książka jest zbyt trudna na początek nauki VBA, ale zawiera całą masę świetnych przykładów makr, funkcji UDF czy formularzy.
W części dotyczącej funkcjom UDF, bardzo spodobał mi się przykład pokazujący działanie funkcji uniwersalnej.
Pamiętam, że pierwszym argumentem funkcji był zakres komórek, drugim zaś cyfra. W zależności od wskazanej cyfry – funkcja wykonywała konkretną operację matematyczną. Było to m.in. sumowanie, zliczenie liczb, wyliczenie średniej itp.. Takie rozwiązanie jest bardzo wygodne, ponieważ nie musimy tworzyć kilku podobnych funkcji, wystarczy jedna funkcja uniwersalna.
Przyznam, że często korzystam z tego patentu – zwłaszcza wtedy, gdy mogę wyciągnąć wiele szczegółowych informacji z jednej.
Wydobycie informacji z daty
Poniższy przykład pokazuje, jak wydobyć kilka użytecznych informacji na podstawie daty.
Funkcja może zwrócić w wyniku liczbę, tekst, datę lub nawet błąd. Wszystko zależy od wartości podanego argumentu. Co więcej – argument może być podany w formie liczby lub tekstu.
Kod funkcji UDF
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 |
Public Function vDataInfo(ByVal dtData As Date, _ Optional ByVal vInfo As Variant = 0) As Variant 1 Select Case vInfo Case 0, "data" 2 vDataInfo = dtData ' Zwraca wartość pierwszego argumentu 3 Case 1, "miesiąc_słownie" 4 vDataInfo = Format$(dtData, "mmmm") ' Pełna nazwa miesiąca np. grudzień 5 Case 2, "dzień_słownie" 6 vDataInfo = Format$(dtData, "dddd") ' Pełna nazwa dnia np. czwartek 7 Case 3, "dzień_tygodnia" 8 vDataInfo = CInt(Format$(dtData, "w") - 1) ' Numer dnia tygodnia 9 Case 4, "dzień_roku" 10 vDataInfo = CInt(Format$(dtData, "y")) ' Dzień roku 11 Case 5, "tydzień_roku" 12 vDataInfo = CInt(Format$(dtData, "ww")) ' Tydzień w roku 13 Case 6, "kwartał" 14 vDataInfo = CInt(Format$(dtData, "q")) ' Kwartał 15 Case Else 16 vDataInfo = CVErr(xlErrValue) 17 End Select End Function |