"Hello World" - om "Subs" og "Functions"

Normalt ville man indlede en bog om programmering med nogle generelle betragtninger, og derefter gå i gang med at fortælle om erklæring af variabler og konstanter osv. Det kommer jeg også frem til på et tidspunkt, men jeg vil hellere gå i gang med at lave makroer. Så det gør jeg her.

VBA kender principielt to forskellige typer af makroer. Den ene kaldes Subs eller subrutiner, den anden kaldes funktrionsmakroer eller bare funktioner (functions). Når man i diverse nyhedsgrupper eller andre fora ser betegnelsen UDF står det som regel for User Defined Function - altså en funktion som en bruger selv har lavet - i modsætning til de funktioner, som findes i Excel fra begyndelsen.

Forskellen på en Sub og en Function, er, at en Sub ikke returner en værdi det det sted, den er kaldt fra. En Function returnerer derimod en værdi. Fx er SUM(A1:A3) en funktion som returnere summen af de celler, der er specificeret i parentesen. En  Sub kan være "Print", som kan kaldes fra fx en genvejsknap. Den udfører en handling (at udskrive regnearket), men returnerer ikke noget.

Subs kan startes manuelt af brugeren, eller udløses af en hændelse. Jeg ender tilbage til hændelser i en senere artikel. I denne omgang holder jeg mig til Subs der bliver afspillet manuelt.

Da jeg i sin tid lærte at programmere, var det første program, vi skulle lave, en lille rutine, som sagde "Hello World" - deraf overskriften på denne artikel. Med udgangspunkti  denne, vil vi se nærmere på funktioner og subs.

Begge starter med en indledende sætning, der består af et af ordene Sub eller Function (al programmering i VBA foregår på engelsk). Ordet efterfølges af navnet på rutinen og en parentes. Rutinerne slutter med en End Sub eller End Function linje. I Excel indsættes slutlinjen automatisk, når man trykker Enter efter at have skrevet startlinjen.

Selve rutinens navn kan være op til 255 tegn langt. Det skal starte med et bogstav. Kun tal, bogstaver og Understregningstegn kan anvendes i navne.

Sub HelloWorld()
Sub Hello_World()
Sub HelloWorld_1()

er alle accepterede navne.

Sub Hello World
Sub 1-Hello_World

accepteres ikke.

Jeg skal måske lige sige, at såvel Sub's som Functions skal "have et sted at være". De skal altså gemmes et sted. Hvor man kan gemme dem, vender jeg tilbage til i senere artikler. I denne omgang gemmer vi alting i de mapper, hvor de skal bruges. "Opbevaringsstedet" for makroer kaldes "moduler". For at åbne et modul i en projektmappe, skal mappen være åben. Derefter trykks Alt+F11. Så åbnes VBA editoren (også kaldet VBE). Her kan man så indsætte koden i modularket (det store hvide område).

For at lave en Sub (fremover bare kaldet makro - Functions kaldes fremfor for funktioner), der siger Hello World til brugeren, skrives

Sub HelloWorld()
' Dette er min første makro
    MsgBox "Hello World"
End Sub

MsgBox er et reserveret ord, som jeg vender tilbage til senere. Indrykningen er ikke nødvendig, men bruges for at gøre især kompleks kode, mere overskuelig. Mere om det i en senere artikel.

Linjen, der indledes med en enkelt apostrof er en kommentar. Den vises også i editoren markeret med grøn farve. Sådanne kommentarlinjer springes over, når koden afvikles, men anvendes til at forklare koden. Også dette vender jeg tilbage til - i næste artikel.

For at afspille makroen kan man trykke på Alt+F8 og så klikke på Afspil Så vises

Klik OK for at lukke boksen igen.

Skal jeg i stedet lave en Function, kunne den se sådan ud:

Function HelloWorld()
' Min første funktion
    HelloWorld = "Hello World"
End Function

Alle funktioner skal altid indeholde en variabel med samme navn som funktionen. Det er ved hjælp af denne variabel, at funktionen returnerer sin værdi. I dette tilfælde tidldeles variablen "HelloWorld værdien "Hello World". Læg mærke til, at i både Sub og Function, skal tekster (også kaldet tekststrenge) skrives mellem dobbelte anførselstegn.

Funktionen bruges på samme måde som de indbyggede funktioner i Word. I en celle skrives formlen =HelloWorld() og så vises

i cellen.

For god ordens skyld, skal jeg lige gøre opmærksom på, at man ikke i samme modul kan have både en makro og en funktion, som har samme navn. Det er altså Enten Sub HelloWorld eller Function HelloWorld(), ikke begge på en gang.

 

- Tilbage til Programmering -
- Tilbage til makroer -
- Tilbage til Excel -