2013-06-27 11 views
6

Chciałbym zdefiniować funkcję w języku Visual Basic, która oblicza podatek dochodowy w danym nawiasie. Dane wejściowe powinny być dochodem, krańcową stawką podatku, granicą dolnego wspornika i - opcjonalnie - granicą górnego wspornika. (Dla górnego nawiasu nie ma górnej granicy).Ustal, ile argumentów (opcjonalnych) faktycznie przekazano do funkcji VBA?

Oto, jak sobie z tym poradziłem. Po pierwsze, określenie funkcji "rampa" w następujący sposób:

Public Function ramp(x) 
    ramp = (x + Abs(x))/2 
End Function 

, który jest w zasadzie taki sam, jak gdyby (x < 0,0 X,). Potem określenia funkcji (w języku polskim) dla podatku jako

Public Function schijfbelasting(inkomen, ondergrens, bovengrens, tarief) 
    schijfbelasting = ramp(tarief * (inkomen - ondergrens)) - ramp(tarief * (inkomen - bovengrens)) 
End Function 

Here „inkomen” = dochód, „ondergrens” = dolna granica wspornik „bovengrens” = górna granica wspornik, „tarief” = krańcowa stopa podatkowa , a wynik "schijfbelasting" = podatek w określonym nawiasie.

To wszystko działa w porządku, poza tym, że chciałbym, aby „bovengrens” (górnej granicy wspornik) Opcjonalnie za pomocą

Optional bovengrens 

w Matlab, chciałbym użyć „nargin” (liczba argumentów) funkcji wykonać coś takiego:

Public Function schijfbelasting(inkomen, ondergrens, Optional bovengrens, tarief) 
If nargin==4 
    schijfbelasting = ramp(tarief * (inkomen - ondergrens)) - ramp(tarief * (inkomen - bovengrens)) 
Elseif nargin==3 
schijfbelasting = ramp(tarief*(inkomen-ondergrens)) 
End If 
End Function 

Jednak nie jestem świadomy funkcji podobnej do "nargin" w Visual Basic. Może to być również coś w stylu "jeśli argument" bovengrens "jest zdefiniowany". Czy ktoś wie, jak podejść do tego problemu? Z góry dziękuję.

P.S. Mam świadomość, że mogę uczynić kod "pracą", wypełniając bardzo dużą liczbę dla "granicy" klamry w górnym przedziale, ale nie uważam tego eleganckiego kodowania.

+3

jeśli używasz 'Opcjonalnie parameter' w definicji funkcji wszystkie parametry, które następują po pierwszej' Optional' być 'Optional' też. Tak więc przenieś 'Opcjonalne bovengrens' na koniec listy parametrów lub utwórz' Opcjonalny tarief'. także. –

Odpowiedz

7

Można użyć IsMissing funkcję VBA do testowania parametrów opcjonalnych. Oto przykład:

Public Sub OptionalArg(arg1, Optional arg2) 
Debug.Print arg1; IIf(IsMissing(arg2), "missing", arg2) 
End Sub 

testu to tak:

Sub Test() 
OptionalArg 1 
OptionalArg 1, 2 
End Sub 
+0

+1 ładnie odpowiedział Doug. – brettdj

+0

Może być również dobrze, aby określić typ jako 'Wariant' niejawna konwersja może spowodować błąd? 'Public Sub OptionalArg (arg1 jako Variant, Opcjonalny arg2 jako Variant)' Minęło trochę czasu odkąd użyłem opcji, ale excel/vba jest znany z robienia tego, co chce z typami danych. – Bmo

1

Wystarczy przetestować argumenty za pomocą funkcji IsMissing:

If IsMissing(bovengrens) Then ... 
+1

Znacznie lepiej niż oryginalna odpowiedź :) –

+0

@DougGlancy Heh, tak, zawsze używam domyślnego "Nic" dla opcjonalnych parametrów wariantu, więc zapomniałem ... – RBarryYoung

Powiązane problemy