Hvis du prøver at få et godt greb om Excel VBA , kan du sandsynligvis drage fordel af et par eksempler for at udvikle den visuelle grundlæggende dygtighed. Her finder du et par Excel VBA-eksempler, så du kan få styr på denne begivenhedshåndteringsvirksomhed.
Excel VBA-eksempel: The Open-begivenhed for en projektmappe
En af de mest brugte Excel VBA-begivenheder er Workbook Open-begivenheden. Antag, at du har en projektmappe, som du bruger hver dag. Workbook_Open-proceduren i dette eksempel udføres, hver gang projektmappen åbnes. Proceduren kontrollerer ugedagen; hvis det er fredag, viser koden en påmindelse til dig.
Følg disse trin for at oprette Excel VBA-proceduren, der udføres, når hændelsen Workbook Open opstår:
Åbn Excel-projektmappen.
Enhver Excel-projektmappe duer.
Tryk på Alt+F11 for at aktivere VBE.
Find projektmappen i projektvinduet.
Dobbeltklik på projektnavnet for at vise dets elementer, hvis det er nødvendigt.
Dobbeltklik på punktet ThisWorkbook.
VBE'en viser et tomt kodevindue for ThisWorkbook-objektet.
I kodevinduet skal du vælge Arbejdsbog fra rullelisten Objekt (venstre).
VBE indtaster begyndelses- og slutsætningerne for en Workbook_Open-procedure.
Indtast følgende udsagn, så den komplette hændelsesprocedure ser sådan ud:
Privat underarbejdsbog_Åben()
Dæmp besked som streng
Hvis ugedag(nu) = 6, så
Msg = "Det er fredag i dag. Glem ikke at "
Msg = Msg & "indsend TPS-rapporten!"
MsgBox Msg
Afslut Hvis
Slut Sub
Kodevinduet skulle se sådan ud.
Denne hændelseshåndteringsprocedure udføres, når projektmappen åbnes.
Workbook_Open udføres automatisk, hver gang projektmappen åbnes. Den bruger VBA's WeekDay-funktion til at bestemme ugedagen. Hvis det er fredag (dag 6), minder en beskedboks brugeren om at indsende en rapport. Hvis det ikke er fredag, sker der ikke noget.
Hvis i dag ikke er fredag, kan du have svært ved at teste denne procedure. Du kan bare ændre de 6, så de svarer til dagens faktiske dagnummer.
Og selvfølgelig kan du ændre denne procedure, som du vil. For eksempel viser følgende version en meddelelse, hver gang projektmappen åbnes. Dette bliver irriterende efter et stykke tid.
En Workbook_Open-procedure kan gøre næsten alt. Disse hændelseshandlere bruges ofte til følgende:
- Viser velkomstbeskeder (såsom i Franks seje projektmappe)
- Åbning af andre projektmapper
- Aktivering af et bestemt regneark i projektmappen
- Opsætning af brugerdefinerede genvejsmenuer
Her er et sidste Excel VBA-eksempel på en Workbook_Open-procedure, der bruger funktionerne GetSetting og SaveSetting til at holde styr på, hvor mange gange projektmappen er blevet åbnet. SaveSetting-funktionen skriver en værdi til Windows-registreringsdatabasen, og GetSetting-funktionen henter denne værdi (se hjælpesystemet for detaljer). Følgende Excel VBA-eksempel henter optællingen fra registreringsdatabasen, øger den og gemmer den derefter tilbage i registreringsdatabasen. Den fortæller også brugeren værdien af Cnt, der svarer til det antal gange, projektmappen er blevet åbnet.
Privat underarbejdsbog_Åben()
Dim Cnt As Long
Cnt = GetSetting("MinApp", "Indstillinger", "Åben", 0)
Cnt = Cnt + 1
Gem Indstilling "MinApp", "Indstillinger", "Åbn", Cnt
MsgBox "Denne projektmappe er blevet åbnet " & Cnt & " gange."
Slut Sub
Brug af en Workbook_Open-hændelseshandler til at holde styr på, hvor mange gange en projektmappe er blevet åbnet.
Excel VBA-eksempel: Begivenheden BeforeClose for en projektmappe
Her er et eksempel på Excel VBA Workbook_BeforeClose hændelseshåndteringsproceduren, som udføres automatisk umiddelbart før projektmappen lukkes. Denne procedure er placeret i kodevinduet for et ThisWorkbook-objekt:
Privat underarbejdsbog_BeforeClose(Annuller som boolesk)
Dæmp besked som streng
Dim Ans As Long
Dim F-navn som streng
Msg = "Vil du lave en sikkerhedskopi af denne fil?"
Ans = MsgBox(Msg, vbYesNo)
Hvis Ans = vbJa Så
FName = "F:\BACKUP\" & ThisWorkbook.Name
ThisWorkbook.SaveCopyAs FName
Afslut Hvis
Slut Sub
Denne rutine bruger en beskedboks til at spørge brugeren, om han vil lave en sikkerhedskopi af projektmappen. Hvis svaret er ja, bruger koden SaveCopyAs-metoden til at gemme en sikkerhedskopi af filen på drev F. Hvis du tilpasser denne procedure til eget brug, skal du ændre drevet og stien.
Excel-programmører bruger ofte en Workbook_BeforeClose-procedure til at rydde op efter sig selv. For eksempel, hvis du bruger en Workbook_Open-procedure til at ændre nogle indstillinger, når du åbner en projektmappe (for eksempel skjuler statuslinjen), er det kun passende, at du returnerer indstillingerne til deres oprindelige tilstand, når du lukker projektmappen. Du kan udføre denne elektroniske husholdning med en Workbook_BeforeClose-procedure.
Når du bruger hændelsen Workbook_BeforeClose, skal du huske på dette: Hvis du lukker Excel, og en åben fil er blevet ændret siden sidste lagring, viser Excel dens sædvanlige "Vil du gemme dine ændringer"-meddelelsesboks. Hvis du klikker på knappen Annuller, annulleres hele lukningsprocessen. Men begivenheden Workbook_BeforeClose vil være blevet udført alligevel.
Excel VBA-eksempel: Begivenheden BeforeSave for en projektmappe
Begivenheden BeforeSave, som navnet antyder, udløses, før en projektmappe gemmes. Denne hændelse opstår, når du vælger Fil → Gem eller Fil → Gem som.
Følgende procedure, som er placeret i kodevinduet for en ThisWorkbook objekt, viser BeforeSave begivenhed. Rutinen opdaterer værdien i en celle (celle A1 på Ark1), hver gang projektmappen gemmes. Med andre ord fungerer celle A1 som en tæller til at holde styr på antallet af gange, filen blev gemt.
Privat underarbejdsbog_BeforeSave(ByVal SaveAsUI _
Som boolsk, annuller som boolsk)
Dæmp tæller som rækkevidde
Indstil tæller = Sheets("Sheet1"). Range("A1")
Counter.Value = Counter.Value + 1
Slut Sub
Bemærk, at Workbook_BeforeSave-proceduren har to argumenter: SaveAsUI og Cancel. For at demonstrere, hvordan disse argumenter virker, skal du undersøge følgende makro, som udføres, før projektmappen gemmes. Denne procedure forsøger at forhindre brugeren i at gemme projektmappen med et andet navn. Hvis brugeren vælger Filer → Gem som, er SaveAsUI-argumentet True.
Når koden køres, tjekker den SaveAsUI-værdien. Hvis denne variabel er Sand, viser proceduren en meddelelse og indstiller Annuller til Sand, hvilket annullerer handlingen Gem.
Privat underarbejdsbog_BeforeSave(ByVal SaveAsUI _
Som boolsk, annuller som boolsk)
Hvis SaveAsUI Så
MsgBox "Du kan ikke gemme en kopi af denne projektmappe!"
Annuller = Sandt
Afslut Hvis
Slut Sub
Bemærk, at denne procedure ikke rigtig forhindrer nogen i at gemme en kopi med et andet navn. Hvis nogen virkelig vil gøre det, kan han eller hun bare åbne projektmappen med makroer deaktiveret. Når makroer er deaktiveret, deaktiveres hændelseshåndteringsprocedurer også, hvilket giver mening, fordi de trods alt er makroer.