Ligesom mennesker, kæledyr og orkaner skal hver Excel VBA-under- og funktionsprocedure have et navn. Selvom det er helt acceptabelt at navngive din hund Hairball Harris, er det normalt ikke en god idé at bruge sådan en frihjuls-attitude, når du navngiver Excl VBA-procedurer. Når du navngiver Excel VBA-procedurer, skal du følge nogle få regler:
- Du kan bruge bogstaver, tal og nogle tegnsætningstegn, men det første tegn skal være et bogstav.
- Du kan ikke bruge mellemrum eller punktum i navnet.
- VBA skelner ikke mellem store og små bogstaver.
- Du kan ikke bruge nogen af følgende tegn i et procedurenavn: #, $, %, &, @, ^, * eller !. Med andre ord kan dit procedurenavn ikke ligne tegneserieforbandelsesord.
- Hvis du skriver en funktionsprocedure til brug i en formel, skal du undgå at bruge et navn, der ligner en celleadresse (f.eks. A1 eller B52). Faktisk tillader Excel sådanne funktionsnavne, men hvorfor gøre tingene mere forvirrende, end de allerede er?
- Procedurenavne må ikke være længere end 255 tegn. (Selvfølgelig ville du aldrig lave et procedurenavn så langt.)
Ideelt set beskriver en procedures navn rutinens formål. En god praksis er at oprette et navn ved at kombinere et verbum og et substantiv - for eksempel ProcessData, PrintReport, Sort_Array eller CheckFilename.
Nogle programmører foretrækker at bruge sætningslignende navne, der giver en komplet beskrivelse af proceduren. Nogle eksempler inkluderer WriteReportToTextFile og Get_Print_Options_and_Print_Report. Brugen af så lange navne har fordele og ulemper. På den ene side er sådanne navne beskrivende og normalt utvetydige. På den anden side tager de længere tid at skrive. Alle udvikler en navngivningsstil, men hvis din makro ikke bare er en hurtig og beskidt midlertidig makro, er det en god idé at være beskrivende og undgå meningsløse navne som DoIt, Update, Fix og den altid populære Macro1.
Udførelse af Excel VBA-underprocedurer
Selvom du måske ikke ved meget om udvikling af underprocedurer på dette tidspunkt, er det vigtigt at vide, hvordan disse procedurer udføres. En underprocedure er værdiløs, medmindre du ved, hvordan den skal udføres.
Forresten, at udføre en Sub-procedure betyder det samme som at køre eller kalde en Sub-procedure. Du kan bruge den terminologi du vil.
Du kan udføre en VBA Sub på mange måder; det er en af grundene til, at du kan gøre så mange nyttige ting med underprocedurer. Her er en udtømmende liste over måder at udføre en underprocedure på:
- Vælg Kør → Kør Sub/UserForm (i VBE). Excel udfører den underprocedure, hvor markøren er placeret. Denne menukommando har to alternativer: F5-tasten og Kør Sub/UserForm-knappen på standardværktøjslinjen i VBE. Disse metoder virker ikke, hvis proceduren kræver et eller flere argumenter.
- Brug Excels makro-dialogboks. Du åbner denne boks ved at vælge Udvikler → Kode → Makroer eller ved at vælge Vis → Makroer → Makroer. Eller omgå båndet og tryk bare på Alt+F8. Når makrodialogboksen vises, skal du vælge den ønskede underprocedure og klikke på Kør. Denne dialogboks viser kun de procedurer, der ikke kræver et argument.
- Tryk på Ctrl+tast (eller Ctrl+Shift+tast), der er tildelt underproceduren (forudsat at du har tildelt en).
- Klik på en knap eller en figur på et regneark. Knappen eller formen skal have en underprocedure tildelt sig - hvilket er meget nemt at gøre.
- Fra en anden underprocedure, som du skriver.
- Klik på en knap, som du har tilføjet til værktøjslinjen Hurtig adgang.
- Fra et brugerdefineret element, du har føjet til båndet.
- Når en begivenhed indtræffer. Disse hændelser omfatter åbning af projektmappen, lukning af projektmappen, lagring af projektmappen, ændring af en celle, aktivering af et ark og andre ting.
- Fra vinduet Øjeblikkelig i VBE. Indtast blot navnet på underproceduren og tryk på Enter.
Nogle af disse teknikker er dækket nedenfor. For at følge med skal du indtaste en underprocedure i et VBA-modul:
Start med en ny projektmappe.
Tryk på Alt+F11 for at aktivere VBE.
Vælg projektmappen i projektvinduet.
Vælg Indsæt → Modul for at indsætte et nyt modul.
Indtast følgende i modulet:
Sub ShowCubeRoot()
Num = InputBox("Indtast et positivt tal")
MsgBox Num ^ (1/3) & "er terningroden."
Slut Sub
Denne procedure beder brugeren om et tal og viser derefter dette nummers terningerod i en meddelelsesboks. Disse billeder viser, hvad der sker, når du udfører denne procedure.
Brug af den indbyggede VBA InputBox-funktion til at få et nummer.
Du også hvad der sker via MsgBox-funktionen her.
Visning af terningroden af et tal via MsgBox-funktionen.
ShowCubeRoot er i øvrigt ikke et eksempel på en god makro. Den tjekker ikke for fejl, så den fejler let. Prøv at klikke på knappen Annuller i indtastningsfeltet eller indtast et negativt tal. Begge handlinger resulterer i en fejlmeddelelse.
Udførelse af Excel VBA Sub-proceduren direkte
En måde at udføre denne procedure på er ved at gøre det direkte fra VBA-modulet, hvor du definerede det. Følg disse trin:
Aktiver VBE, og vælg VBA-modulet, der indeholder proceduren.
Flyt markøren hvor som helst i procedurens kode.
Tryk på F5 (eller vælg Kør → Kør Sub/UserForm).
Svar på inputfeltet, og klik på OK.
Fremgangsmåden viser terningroden af det tal, du indtastede.
Du kan ikke bruge Kør → Kør Sub/UserForm til at udføre en Underprocedure, der bruger argumenter, fordi du ikke har nogen måde at videregive argumenterne til proceduren. Hvis proceduren indeholder et eller flere argumenter, er den eneste måde at udføre den på at kalde den fra en anden procedure - som skal levere argumentet/argumenterne.
Udførelse af proceduren fra Excels makro-dialogboks
Det meste af tiden udfører du underprocedurer fra Excel, ikke fra VBE. Følgende trin beskriver, hvordan man udfører en makro ved at bruge Excels makro-dialogboks:
Hvis du arbejder i VBE, skal du aktivere Excel.
Et tryk på Alt+F11 er ekspresruten.
Vælg Udvikler → Kode → Makroer (eller tryk på Alt+F8).
Excel viser dialogboksen vist her.
Dialogboksen Makro viser alle tilgængelige underprocedurer.
Vælg makroen.
Klik på Kør (eller dobbeltklik på makroens navn i listeboksen).
Dialogboksen Makro viser ikke underprocedurer, der bruger argumenter. Det er fordi der ikke er nogen måde for dig at specificere argumenterne.
Udførelse af en Excel VBA-makro ved at bruge en genvejstast
En anden måde at udføre en makro på er at trykke på dens genvejstast. Men før du kan bruge denne metode, skal du tildele en genvejstast til makroen.
Du har mulighed for at tildele en genvejstast i dialogboksen Optag makro, når du begynder at optage en makro . Hvis du opretter proceduren uden at bruge makrooptageren, kan du tildele en genvejstast (eller ændre en eksisterende genvejstast) ved at bruge følgende trin:
Vælg Udvikler → Kode → Makroer.
Vælg underprocedurenavnet fra listeboksen.
I dette eksempel hedder proceduren ShowCubeRoot.
Klik på knappen Indstillinger.
Excel viser dialogboksen Makroindstillinger vist her.
Dialogboksen Makroindstillinger giver dig mulighed for at angive indstillinger for dine makroer.
Klik på genvejstasten, og indtast et bogstav i boksen mærket Ctrl.
Det bogstav, du indtaster, svarer til den tastekombination, du vil bruge til at udføre makroen. Hvis du f.eks. indtaster det lille bogstav c, kan du udføre makroen ved at trykke på Ctrl+C. Hvis du indtaster et stort bogstav, skal du tilføje Shift-tasten til tastekombinationen. Hvis du for eksempel indtaster C, kan du udføre makroen ved at trykke på Ctrl+Shift+C.
Klik på OK for at lukke dialogboksen Makroindstillinger, og klik derefter på Annuller for at lukke dialogboksen Makro.
Når du har tildelt en genvejstast, kan du trykke på denne tastekombination for at udføre makroen. En genvejstast virker ikke, hvis den er tildelt en makro, der bruger et argument.
De genvejstaster, du tildeler til makroer, tilsidesætter Excels indbyggede genvejstaster. For eksempel er Ctrl+C standardgenvejstasten til at kopiere data. Hvis du tildeler Ctrl+C til en makro, kan du ikke bruge Ctrl+C til at kopiere. Dette er normalt ikke en stor sag, fordi Excel næsten altid giver andre måder at udføre kommandoer på.
Udførelse af Excel VBA-proceduren fra en knap eller form
Nogle gange kan du måske lide ideen om at tildele makroen til en knap (eller enhver anden form) på et regneark. Følg disse trin for at tildele Excel-makroen til en knap:
Aktiver et regneark.
Tilføj en knap fra gruppen Formularkontrolelementer.
For at vise gruppen Formularkontrolelementer skal du vælge Udvikler → Kontrolelementer → Indsæt.
Båndet, der viser de tilgængelige kontroller, når du klikker på Indsæt på fanen Udvikler.
Klik på knapværktøjet i gruppen Formularkontrolelementer.
Det er den første knap i den første række af kontroller.
Træk i regnearket for at oprette knappen.
Når du har tilføjet knappen til dit regneark, læser Excel dine tanker og viser dialogboksen Tildel makro vist nedenfor.
Når du tilføjer en knap til et regneark, viser Excel automatisk dialogboksen Tildel makro.
Vælg den makro, du vil tildele knappen.
Klik på OK.
Når du har lavet opgaven, udføres makroen ved at klikke på knappen - ligesom magi.
Når du tilføjer en knap, skal du bemærke, at rullemenuen viser to sæt kontrolelementer: Formularkontrolelementer og ActiveX-kontroller. Disse to grupper af kontroller ligner hinanden, men de er faktisk meget forskellige. I praksis er formularkontrollerne nemmere at bruge.
Du kan også tildele en makro til enhver anden form eller objekt. Antag for eksempel, at du gerne vil udføre en makro, når brugeren klikker på et rektangelobjekt. Følg disse trin:
Tilføj rektanglet til arbejdsarket.
Indsæt et rektangel ved at vælge Indsæt → Illustrationer → Former.
Højreklik på rektanglet.
Vælg Tildel makro fra dens genvejsmenu.
Vælg makroen i dialogboksen Tildel makro.
Klik på OK.
Når du har udført disse trin, udføres den tildelte makro ved at klikke på rektanglet.
Udførelse af proceduren fra en anden Excel VBA-procedure
Du kan også udføre en Excel VBA-procedure fra en anden procedure. Følg disse trin, hvis du vil prøve dette:
Aktiver VBA-modulet, der indeholder ShowCubeRoot-rutinen.
Indtast denne nye procedure (enten over eller under ShowCubeRoot-koden - det gør ingen forskel):
Sub NewSub()
Ring til ShowCubeRoot
Slut Sub
Når du er færdig, udfører du blot NewSub-makroen.
Den nemmeste måde at gøre dette på er at flytte markøren et vilkårligt sted i NewSub-koden og trykke på F5. Bemærk, at denne NewSub-procedure blot udfører ShowCubeRoot-proceduren.
Nøgleordet Call er i øvrigt valgfrit. Redegørelsen kan kun bestå af underprocedurens navn. Brug af nøgleordet Call gør det dog helt klart, at en procedure kaldes.
Udførelse af Excel VBA-funktionsprocedurer
Funktioner, i modsætning til underprocedurer, kan kun udføres på to måder:
- Ved at kalde funktionen fra en anden underprocedure eller funktionsprocedure
- Ved at bruge funktionen i en regnearksformel
Prøv denne simple funktion. Indtast det i et VBA-modul:
Funktion CubeRoot (nummer)
CubeRoot = tal ^ (1/3)
Afslut funktion
This function is pretty wimpy; it merely calculates the cube root of the number passed to it as its argument. It does, however, provide a starting point for understanding functions. It also illustrates an important concept about functions: how to return the value. (You do remember that a function returns a value, right?)
Notice that the single line of code that makes up this Function procedure performs a calculation. The result of the math (number to the power of 1⁄3) is assigned to the variable CubeRoot. Not coincidentally, CubeRoot is also the name of the function. To tell the function what value to return, you assign that value to the name of the function.
Calling the Excel VBA function from a Sub procedure
Because you can’t execute a function directly, you must call it from another procedure. Enter the following simple procedure in the same VBA module that contains the CubeRoot function:
Sub CallerSub()
Ans = CubeRoot(125)
MsgBox Ans
End Sub
When you execute the CallerSub procedure, Excel displays a message box that contains the value of the Ans variable, which is 5.
Here’s what’s going on: The CubeRoot function is executed, and it receives an argument of 125. The calculation is performed by the function’s code (using the value passed as an argument), and the function’s returned value is assigned to the Ans variable. The MsgBox function then displays the value of the Ans variable.
Try changing the argument that’s passed to the CubeRoot function and run the CallerSub macro again. It works just like it should — assuming that you give the function a valid argument (a positive number).
By the way, the CallerSub procedure could be simplified a bit. The Ans variable is not really required unless your code will use that variable later. You could use this single statement to obtain the same result:
MsgBox CubeRoot(125)
Calling an Excel VBA function from a worksheet formula
Now it’s time to call this VBA Function procedure from a worksheet formula. Activate a worksheet in the same workbook that holds the CubeRoot function definition. Then enter the following formula in any cell:
=CubeRoot(1728)
The cell displays 12, which is indeed the cube root of 1,728.
As you might expect, you can use a cell reference as the argument for the CubeRoot function. For example, if cell A1 contains a value, you can enter =CubeRoot(A1). In this case, the function returns the number obtained by calculating the cube root of the value in A1.
You can use this function any number of times in the worksheet. Like Excel’s built-in functions, your custom functions appear in the Insert Function dialog box. Click the Insert Function toolbar button, and choose the User Defined category. As shown below, the Insert Function dialog box lists your very own function.
The CubeRoot function appears in the User Defined category of the Insert Function dialog box.
If you want the Insert Function dialog box to display a description of the function, follow these steps:
Choose Developer → Code → Macros.
Excel displays the Macro dialog box, but CubeRoot doesn’t appear in the list. (CubeRoot is a Function procedure, and this list shows only Sub procedures.) Don’t fret.
Type the word CubeRoot in the Macro Name box.
Click the Options button.
Enter a description of the function in the Description box.
Click OK to close the Macro Options dialog box.
Close the Macro dialog box by clicking the Cancel button.
This descriptive text now appears in the Insert Function dialog box.
This image shows the CubeRoot function being used in worksheet formulas.
Using the CubeRoot function in formulas.
By now, things may be starting to come together for you.