UDF – formuły z funkcjami użytkownika

Za pomocą UDF (user defined functions, funkcje zdefiniowane przez użytkownika) programista może stworzyć nowe funkcje do użycia w formułach. W poniższy sposób używam moją nową funkcję:

Kod znajduje się w module VBA:

Tworzy je się tak samo jak zwykłe funkcje VBA. Umieszczone w module kodu mogą być używane w tym samym pliku. Można je też dodać do pliku personal  lub dodatku. Funkcje UDF podlegają jednak kilku ograniczeniom.

Ograniczenia

Dzięki UDF programista może rozszerzyć wachlarz funkcji dostarczanych przez Excel. Tak jak zwykłe funkcje mogą jedynie zwracać wartość do komórki w której się znajdują. Nie mogą więc robić poniższych:

  • Dodawać, usuwać i formatować komórki na arkuszu,
  • Edytować komórki w arkuszu,
  • Modyfikować zmienne środowiskowe, takie jak odświerzanie ekranu, czy przeliczanie automatyczne,
  • Ustawiać atrybuty czy wywołuwać większość metod modelu obiektowego Excela,

Dane wejściowe powinny  być zawsze pobierane przez argumenty, czyli bez odwoływania się do obiektu Range. Odwołanie do danych przez Range może doprowadzić do niespodziewanych rezultatów, ponieważ zaburza Excelowi drzewo przeliczania formuł. Nasza formuła może nie być przeliczona kiedy powinna.

Zwracanie błędów

UDF mogą zwracać błędy tak jak standardowe funkcje. Funkcja CVErr tworzy odpowiedni variant.

Poniższe stałe mogą być używane do zwracania innych błędów.

  • xlErrDiv0 – #DIV/0
  • xlErrNA – #N/A
  • xlErrName – #NAME?
  • xlErrNull – #NULL
  • xlErrNum – #NUM
  • xlErrRef – #REF
  • xlErrValue – #VALUE

Argumenty opcjonalne

Poniżej znajduje się przykład w którym drugi argument jest opcjonalny. Funkcją IsMissing sprawdzam czy argument został przekazany.

Spis treści

Comments 7

    1. Post
      Author
  1. Mam takie pytanie:
    Jak stworzyc dowolna liczbe argumentow opcjonalnych?
    Chcialbym stworzyc funkcje, ktora tak jak funkcja Suma() moze przyjac dowolna liczbe argumentow i w tym przypadku zawsze zwroci sume, niezaleznie, czy podamy jej 1 argument czy 10.

  2. Post
    Author

    Dziękuję za pytanie. Można to osiągniąć za pomocą ParamArray.

    Function SumAll(ParamArray var() As Variant) As Double
    Dim i As Integer
    Dim tmp As Double
    For i = LBound(var) To UBound(var)
    If IsNumeric(var(i)) Then tmp = tmp + var(i)
    Next
    SumAll = tmp
    End Function

  3. Dzień dobry p.Michale, Ja zapytaniem ,czy będą dalsze części pańskiego kursu? Pamiętam również, iż wcześniejszy był kurs Excela, lecz teraz nie ma do niego dostępu .Powiem krótko i zwięźle na ten temat. Robi Pan wspaniałą robotę, aby VBA w Excelu,nauczyć zwykłych użytkowników. Bardzo wartościowe szkolenie na tym blogu. Wiedza przekazywana w praktyczny sposób, wszystko dobrze i dokładnie tłumaczone ja budowa cepa, gdzie Pan się uchował z taką wiedzą, która jest udostępniana gratis.Wielki szacunek.

    1. Post
      Author

      Dzień dobry,
      Dziękuję za miłe słowa. Chciałbym obiecać, że jeszcze jakieś części kursu się pojawią. Jeżeli dam radę wrócić do rozwoju bloga, to pewnie następnym krokiem będzie utworzenie forum.
      Mam nadzieję, że mimo wszystko paru ciekawych rzeczy Pan się tutaj nauczył.
      Pozdrawiam,
      MS

Skomentuj Michał Sasiński Anuluj pisanie odpowiedzi

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