VBA/Excel – tworzenie opisów pomocy dla własnych funkcji (UDF)

Tworząc moduł z własnymi funkcjami fajnie by było stworzyć jakieś ułatwienie dla użytkowników naszych funkcji. Przykładowo napisałem prostą funkcję, która na podstawie twierdzenia Pitagorasa oblicza długość przeciwprostokątnej, gdy znamy długości dwóch przyprostokątnych.

Function Pitagoras(BokA As Single, BokB As Single) As Single
    Pitagoras = Sqr(BokA ^ 2 + BokB ^ 2)
End Function

Fajnie by było, gdyby pisząc nazwę funkcji podpowiadacz powiedział co owa funkcja robi, oraz jakie argumenty przyjmuje (podobnie jak ma to miejsce gdy wpisuję z palca nazwę funkcji =SUMA

Niestety, ale tego nie da się osiągnąć w VBA. Aby działał podpowiadacz (IntelliSense) należałoby napisać ową funkcję w Visual Studio jako dodatek XLL (taki odpowiednik pliku DLL). Jest jeszcze inna opcja: Excel DNA, ale instalowanie jakiś dodatkowych pluginów do Excela, aby makra pisane w VBA obsługiwały Intellisense uważam za nieporozumienie. Istnieją natomiast dwie namiastki owego rozwiązania, którą tutaj opiszę.

Ctrl+Shift+A

Po wpisaniu nazwy funkcji =Pitagoras( możemy nacisnąć kombinację klawiszy Ctrl + Shift + A. Excel dopisze wtedy w nawiasie nazwy argumentów (nazwy zmiennych) jakie przyjmuje ta funkcja. Rozwiązanie średnie, ale można zapamiętać tę sztuczkę.

Podpowiadacz w oknie fx (Argumenty funkcji)

Dodając odpowiedni kod (metoda Application.MacroOptions) możemy dodać opis funkcji, który pojawia się w okienku Argumenty funkcji.

Aby coś takiego zrobić należy wywołać metodę Application.MacroOptions z odpowiednimi argumentami. Najlepiej jest ją podpiąć pod funkcję auto_open znajdująca się w dowolnym module – wtedy automatycznie przy otwieraniu skoroszytu zostanie wywołana metoda rejestrująca pomoc dla naszej funkcji. Oto przykładowy kod jaki popełniłem:

Function Pitagoras(BokA As Single, BokB As Single) As Single
    Pitagoras = Sqr(BokA ^ 2 + BokB ^ 2)
End Function

Private Sub PomocUDF(Nazwa As String, Opis As String, Args, Optional Kategoria As Variant = 14, Optional HelpFile = "")
    On Error Resume Next
    
    #If VBA7 Then
        'Excel 2010 i nowsze
        Application.MacroOptions Macro:=Nazwa, Description:=Opis, Category:=Kategoria, HelpFile:=HelpF, ArgumentDescriptions:=Args
    #Else
        'W Excelu 2007 MacroOptions nie ma ostatniego argumentu ArgumentDescriptions i VBA by sypał błędem kompilacji
        'stąd to obejście z kompilacją warunkową
        Application.MacroOptions Macro:=Nazwa, Description:=Opis, HelpFile:=HelpF, Category:=Kategoria
    #End If
End Sub


Sub RejestrujMojeFunkcje()
    Dim Nazwa As String, Opis As String
    Dim Args(1 To 2) As String
    
    Nazwa = "Pitagoras"
    Opis = "Funkcja na podstawie tw. Pitagorasa oblicza długość przeciwprostokątnej gdy podamy wartości obu przyprostokątnych"
    Args(1) = "Długość pierwszej przyprostokątnej"
    Args(2) = "Długość drugiej przyprostokątnej"
        
    Call PomocUDF(Nazwa, Opis, Args, "OfficeBlog.pl")
End Sub


Sub auto_open()
    Call RejestrujMojeFunkcje
End Sub

Sub auto_close()
    Application.MacroOptions Macro:="Pitagoras", Description:=Empty, Category:=Empty
End Sub

Pobierz przykładowy plik

Tutaj mamy dwie ciekawostki: po pierwsze w Office 2007 metoda Application.MacroOptions nie obsługuje parametru Parameters (tablica zawierająca opisy poszczególnych zmiennych/parametrów dla naszej funkcji). Stąd użyłem instrukcji kompilacji warunkowej #IF VBA7 (ten fragment kodu wykona się gdy mamy pakiet Office 2007 lub nowszy).

Po drugie: jako ID kategorii możemy użyć liczby. Wtedy dana funkcja zostanie umieszczona w okienku funkcje w odpowiedniej grupie według poniższej rozpiski:

ID kategorii Kategoria
1 Finansowe
2 Data i godzina
3 Matematyczne
4 Statystyczne
5 Wyszukiwania i adresu
6 Bazy danych
7 Tekstowe
8 Logiczne
9 Informacyjne
10 Polecenia (ang. Commands)
11 Dostosowywanie (ang. Customizing)
12 Sterowanie makrami (ang. Macro Control)
13DDE/Zewnętrzne (ang. DDE/External)
14Zdefiniowane przez użytkownika
15Inżynierskie???
16Moduł???
17Zgodności???
18Sieć Web???
19Azure machine learning???

Ale jeśli ten argument potraktujemy jako string to zostanie utworzona nowa kategoria o podanej nazwie w tym przypadku utworzyłem kategorię OfficeBlog.pl

Jeśli artykuł Ci się podobał, będę wdzięczny gdy go udostępnisz w mediach społecznościowych
Ten wpis został opublikowany w kategorii VBA porady i oznaczony tagami , . Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.