07 februari 2010
Wellicht gebruikt u, zelfs als u een doorwinterde Excel gebruiker bent, slechts een fractie van de mogelijkheden van dit programma.
Maar toch … precies die éne functie die u zo vaak nodig heeft, zijn ze in Redmond vergeten in te bouwen. Geen nood. In Excel kunt u eenvoudig zelf functies toevoegen en opslaan als een "add-in" of invoegtoepassing.
Laten we als voorbeeld de berekening van de datum van paaszondag nemen. Dat is niet al te moeilijk, maar toch te complex om het even in één celletje te klaren met een formule. Het is nuttig, want m.b.v. de paasdatum kunnen we meteen de data berekenen van een aantal wettelijke feestdagen. Bovendien past het helemaal bij deze tijd van het jaar.
Het doel
De berekeningsmethode
De functie definiëren
De functie testen
Het werkblad opslaan
Zelfgedefinieerde functies gebruiken in meerdere werkbladen
Het is altijd prettiger navigeren als je weet waar je naartoe moet. In ons geval is ons doel het volgende: we hebben een functie nodig die een jaartal neemt als parameter, en de datum van Pasen geeft als resultaat. In Excel zou dat er zo uitzien:

Hoe wordt de paasdatum berekend? Een volledige ontleding van de definitie van de paasdatum laat ik voor sites als wikipedia e.a. Na wat googlen vond ik volgende formules:
|
A = Mod(Year ÷ 19) |
|
B = Int(Year ÷ 100) |
|
C = Mod(Year ÷ 100) |
|
D = Int(B ÷ 4) |
|
E = Mod(B ÷ 4) |
|
F = Int[(B + 8) ÷ 25] |
|
G = Int[(B - F + 1) ÷ 3] |
|
H = Mod[(19xA + B - D - G + 15) ÷ 30] |
|
I = Int(C ÷ 4) |
|
K = Mod(C ÷ 4) |
|
L = Mod[(32 + 2xE + 2xI - H - K) ÷ 7] |
|
M = Int[(A + 11xH + 22xL) ÷ 451] |
|
P = Int[(H + L - 7xM + 114) ÷ 31] |
|
Q = Mod[(H + L - 7xM + 114) ÷ 31] |
|
Easter date will be on P month, Q+1 day |
Wie over een gezonde dosis argwaan beschikt mag dit proberen te doorgronden, maar voor het gemak neem ik dit zonder meer aan als waarheid.
Tijd om de handen uit de mouwen te steken:

Wat u nu ziet in de VBA editor is het standaard skelet voor een functie. Die begint steeds met het woord “Function” en eindigt met “End Function”. Daartussen schrijft u formules en instructies om de gewenste berekeningen uit te voeren.
In ons geval kunnen we de bovenstaande formules bijna letterlijk gebruiken om de functie af te werken. De volledige functie ziet er als volgt uit:
Function PaasDatum(jaar As Integer) As Date
a = jaar Mod 19
b = Int(jaar / 100)
c = jaar Mod 100
d = Int(b / 4)
e = b Mod 4
f = Int((b + 8) / 25)
g = Int((b - f + 1) / 3)
h = (19 * a + b - d - g + 15) Mod 30
i = Int(c / 4)
k = c Mod 4
l = (32 + 2 * e + 2 * i - h - k) Mod 7
m = Int((a + 11 * h + 22 * l) / 451)
p = Int((h + l - 7 * m + 114) / 31)
q = (h + l - 7 * m + 114) Mod 31
PaasDatum = DateSerial(jaar, p, q + 1)
End Function
Let op de voorlaatste lijn. Het lijkt alsof we het resultaat toewijzen aan een variabele met de naam “PaasDatum”, dezelfde naam dus als de naam van onze functie. Dat is de VBA manier om aan Excel duidelijk te maken wat de uitkomst is van onze berekeningen, m.a.w. het resultaat van een functie wordt steeds op die manier doorgegeven naar Excel.
That’s it! U hebt nu een functie toegevoegd aan het standaardrepertoire van Excel.
Eens kijken of het werkt …
Wat verschijnt er: 40272! Oei, dat is niet het verwachte antwoord. Wat is er aan de hand?
Het resultaat van onze functie is wel degelijk juist. Achter de schermen behandelt Excel datums als gewone getallen. Elke dag heeft zijn nummer. We moeten Excel alleen nog een handje helpen om het resultaat terug om te vormen naar een datum die wij “humans” kunnen begrijpen.
Dat doet u door een andere celopmaak te kiezen. In plaats van “Standaard” kiest u “Korte datumnotatie”, en dan verschijnt er wel degelijk “04/04/2010”. En dat lijkt mij juist. U kunt naar believen het jaartal in B2 wijzigen en vaststellen hoe de datum in cel C2 volgt.
Al dat werk moet natuurlijk bewaard worden. Let op! U moet de werkmap opslaan als een “Excel-werkmap met macro’s”. In de gewone indeling “Excel-werkmap” zal uw functie niet mee opgeslagen worden. Dat is één van de beveiligingen die in versie 2007 ingebouwd werd.
Natuurlijk wilt u al dat werk graag in meer dan één werkblad gebruiken. Dat kan heel gemakkelijk door het werkblad op te slaan als een “Excel Invoegtoepassing”:

Let wel op als u dit laatste werkblad wilt delen met anderen. Als iemand anders het op zijn PC wil gebruiken, zal hij ook uw invoegtoepassing nodig hebben.
Reactie van Frank van de Laar op maandag 12 juli 2010
Net niet wat ik zocht. Zoek eigenlijk een manier om een werkblad met complexe formules, berekeningen etc. als een formule opnemen. Het werkblad bevat een cel die ik telkens wil varieren en meerdere cellen als resultaat.
Maar uw stukje vind ik er fantastisch eenvoudig en duidelijk uitzien. Complement.