- Tutorial VBA (Visual Basic for Applications) voor Excel -

0. Inleiding

Sinds de doorbraak van Microsoft Office binnen het Nederlandse bedrijfsleven, zo rond 1998, zijn we steeds meer met Excel gaan werken. Wie een beetje handig is met dit "worksheet" programma kan heel aardige resultaten neerzetten. In de allerdaagse praktijk moeten we echter vaak steeds dezelfde handelingen verrichten en dat maakt werken met Excel onnodig saai en/of arbeidsintensief. Gebruik van een macro-editor kan daar al aardig verbetering in brengen, maar voor veel zaken is een VBA-module net even handiger.

Deze website gaat over VBA voor Excel. Zelf werk ik met Excel 2007. De voorbeelden zijn allemaal met deze versie geschreven en getest. Bij andere versies van Excel kunnen de voorbeelden soms maar gedeeltelijk werken en dan zijn kleine aanpassingen nodig.

Indien de voorbeelden uit het menu worden doorlopen bent u in staat om uw eigen adresboek in Excel te onderhouden, te werken met ondermeer handige zoek- en filterfuncties en de opmaak van de werkbladen automatisch naar uw hand te zetten. Bovendien kunt u regelmatig een backup maken door de gegevens in een CSV-bestand op te slaan en zonodig weer in te lezen. Maar het belangrijste is dat u vlot leert werken met vba, zodat u beter in staat bent de allerdaagse Excel probleempjes het hoofd te bieden.

De voorbeelden heb ikzelf ontworpen, maar niet zonder uitgebreid de op internet aanwezige kennis te hebben geraadpleegd. Voor mij is deze website hobby en geen werk. Mocht u er echt blij van worden dat is een kleine donatie overigens van harte welkom. Daar kan ik dan deze website uit bekostigen en onderhouden.

VBA - Hoe werk het?

Simpel gezegd: je plaatst een knop ergens bovenaan je werkblad, klikt erop en de achterliggende macro wordt uitgevoerd. Die macro kan de meest ingewikkelde vormen aannemen en daardoor bergen werk voor je verzetten.

Maar pas op: het gaat razend snel en een slecht geprogrameerde macro kan ook al je gegevens geheel automatisch vernietigen! Dus zolang een macro nog niet goed is uitgetest altijd eerst een backup maken van je werkblad voordat je die macro los laat op je kostbare gegevens.

Laten we simpel beginnen met wat uitleg over de taal, procedures (subroutines of kortweg Sub) en functies.

De VBA taal

Voordat we iets kunnen beginnen moeten we de programmacode weergeven. Dat doen we met het icoontje "ontwerpmodus" dat we kunnen vinden op het lint onder ontwikkelaars. Ik zou hem toevoegen aan de Werkbalk snelle toegang, maar dat hoeft niet. Als we het icoontje hebben aangeklikt opent zich een nieuw venster en zien we onder ons nog lege VBAProject(Map1) de ingang Microsoft Excel -objecten. Met de rechtermuisknop kunnen we daarop klikken en via invoegen een nieuwe module maken.

De VBA taal heeft overeenkomsten met de werkbladfuncties, maar dan wel in de Amerikaans-Engelse taal. Dat geldt ook voor de interpunctie. Ben je in Excel gewend aan de ; in vba moet het , zijn.

De syntax van de taal kan tijdens het typen worden opgevraagd met F1 en dat werkt vaak verhelderend, termeer omdat er ook voorbeelden worden gegeven. Vanwege het mengelmoesje van syntax in het Engels en in het Nederlands kan deze hulpfunctie je echter ook op het verkeerde been zetten. De vba compiler kent geen Nederlands en een syntaxerror is zo gemaakt. Maar met een beetje Googlelen kom je vaak wel achter de juiste werking van de verschillende functies, instructies en methodes. Als je een functie enkel in het Nederlands weet, kun je onderaan het werkblad met de muiswijzer op het tablad gaan staan en met de rechtermuisknop een internationaal marcoblad invoegen. Dan kun je de bekende functie in het Nederlands kopieren naar dit blad en krijg de engelse equivalent. Heel handig.

Subroutines

Een subroutine kan in tegenstelling tot een functie direct vanuit de marcoknop worden uitgevoerd. Je begint dan ook met een subroutine. Een subroutine kan een andere subroutine of functie aanroepen met een Call. Een functie kan bovendien ook worden aangeroepen als:

variabele = functie(var1, var2, ...)

Als je een subroutine schrijft (in de nieuwe Module1) dan zie dat er als volgt uit:

Sub EersteMacro() Dim sVariabele1 As String, sVariabele2 As String Dim iVariabele3 As Long sVariabele1 = "vier" sVariabele2 = "" iVariabele3 = 4 For N = 1 To iVariabele3 sVariabele2 = sVariabele2 & " " & sVariabele1 Next N MsgBox sVariabele2 End Sub

Tsja, een vrij nutteloze macro op zich, maar deze helpt wel bij het begrijpen van VBA. Allereerst valt op dat variabelen moeten worden gedeclareerd met een Dim Statement en dat er verschillende soorten variabelen zijn. De helpfunctie van Excel legt dat prima uit dus ga met F1 maar eens op onderzoek uit. Overigens begin ik een variabelenaam in een subroutine steeds met de eerste kleine letter van het soort variabele, zodat ik me daar steeds van bewust ben. Een variabele die eenmaal gedeclareerd is kan niet opeens een ander soort worden, zodat er een fout zal optreden. (uitzonderingen daargelaten).

Willen we de subroutine aan het werk zien, dan moeten we op het werkblad een knop aanmaken. Dat doen we weer via het lint en ontwikkelaars en dit maal kiezen we voor invoegen en klikken het het meest linkse besturings element aan op de bovenste rij. Dan moeten we dit element, de knop, nog plaatsen op ons werkblad en vervolgens met de rechter muisknop de macro toewijzen. Daarna kunnen we erop klikken en zal een messagebox openen met de fantastische tekst: vier vier vier vier!

msgbox vieren

Valt er wat te vieren? Jazeker, u heeft uw eerste stap gezet in VBA!

Functies

Een functie werkt vrijwel als een subroutine, maar kan bovendien ook een waarde terug geven. Omdat die waarde niet teruggegeven kan worden aan een macroknop kun je hem alleen aanroepen vanuit een subroutine. VBA kent één merkwaardigheid waarop je je moet instellen: Standaard worden variabelen doorgegeven by reference. Dat is wat je meestal NIET wilt, omdat je variabelen dan direct worden bewerkt en je dus de initiële waarde ervan kwijt bent. Wen je er aan functies als volgt te definieren:

Function Vieren(ByVal Var1 As String, ByVal Var3 As Long) As String Vieren = "" For N = 1 To Var3 Vieren = Vieren & " " & Var1 Next N End Function

We roepen dus Var1 aan ByVal, want we willen niet dat er iets verandert aan de overgedragen variable. Voor Var3 is dat eigenlijk niet nodig omdat er geen bewerking wordt uitgevoerd op Var3. Deze functie hadden we in een sub kunnen aanroepen met:

sVariabele2 = Vieren(sVariable1, iVariabele3)

In het diepe

Met deze zeer bekopte inleiding mag u het nu proberen. Ik heb geprobeerd datgene te beschrijven wat noodzakelijk is, maar in andere bronnen veelal niet duidelijk is aangegeven. In het menu staan een aantal voorbeelden waarmee u kunt oefenen. Veel succes!