Kod znajduje się w module VBA:
1 2 3 4 5 6 7 8 9 10 11 |
Option Explicit Function SUMUJPARZYSTE(rng As Range) Dim lr_cell For Each lr_cell In rng If lr_cell.Value Mod 2 = 0 Then SUMUJPARZYSTE = SUMUJPARZYSTE + lr_cell.Value End If Next lr_cell End Function |
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.
1 2 3 4 5 6 7 |
Function Podziel(A As Double, B As Double) As Variant If B = 0 Then Podziel = CVErr(xlErrDiv0) Else Podziel = A / B End If End Function |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Function sumuj_co_drugi(ref As Range, Optional jakie As Variant) As Variant Dim lref_cell As Range Dim lint_modulo As Integer If IsMissing(jakie) = True Then jakie = gc_Parzyste ElseIf jakie <> gc_Parzyste And jakie <> gc_NieParzyste Then sumuj_co_drugi = CVErr(xlErrValue) Return End If If jakie = gc_Parzyste Then lint_modulo = 0 Else lint_modulo = 1 For Each lref_cell In ref.Cells If lref_cell.Value Mod 2 = lint_modulo Then sumuj_co_drugi = sumuj_co_drugi + lref_cell.Value End If Next lref_cell End Function |
Comments 7
Jak zrobić, aby podczas wpisywania formuły w komórce pojawiały się podpowiedzi na temat argumentów?
Author
Po wpisaniu „(” należy wciśnąć ctrl+shift+A.
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.
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
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.
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
Forum Excela już jest.