Arbejde med Excel VBA -makroer
Makroer i Excel gemmes som VBA -kode, og nogle gange vil du redigere denne kode direkte. Denne vejledning vil dække, hvordan du ser og redigerer makroer, beskriver nogle makrofejlfindingsteknikker og giver nogle almindelige redigeringseksempler.
Se makroer
En liste over makroer kan vises i dialogboksen Makroer. For at se denne dialog skal du vælge fanen Udvikler på båndet og klikke på knappen Makroer.
Hvis flere projektmapper er åbne, vises makroer fra alle projektmapper på listen. Makroer i den aktive projektmappe vises alene ved navn, mens makroer i andre projektmapper vil blive præfikset af projektmappens navn og et udråbstegn (dvs. "Book2! OtherMacro").
Åbn en makro til redigering
Du kan bruge makro -dialogen til at åbne koden for en makro ved at vælge makroens navn og klikke på knappen Rediger. Dette åbner makroen i VB Editor.
Alternativt kan du åbne VB Editor direkte ved at klikke på knappen Visual Basic på fanen Udvikler eller ved at trykke på tasten ALT+F11.
Ved hjælp af denne metode skal du navigere til din ønskede makro (også kaldet 'procedure'). Vi vil gå over VBA Editor -layoutet:
Oversigt over VB Editor
VB Editor har flere vinduer; i denne vejledning dækker vi projektvinduet, vinduet Egenskaber og kodevinduet.
Projektvindue
Projektvinduet viser hver Excel -fil som sit eget projekt med alle objekterne i projektet kategoriseret efter type. Optagede makroer vises i kategorien "Moduler", som regel i objektet "Modul1". (Hvis dit projekt har flere moduler, og du ikke er sikker på, hvor din makro er gemt, skal du blot åbne den fra den førnævnte makro -dialog.)
Egenskaber vindue
Egenskabsvinduet viser egenskaberne og tilhørende værdier for et objekt - f.eks. Ved at klikke på et regnearkobjekt i projektvinduet viser en liste over egenskaber for regnearket. Ejendomsnavne er til venstre, og ejendomsværdier er til højre.
Hvis du vælger et modul i projektvinduet, viser det, at det kun har en egenskab, "(Navn)". Du kan ændre navnet på et modul ved at dobbeltklikke på ejendommens værdi, skrive et nyt navn og trykke på Enter. Ændring af et modul navn vil omdøbe det i projektvinduet, hvilket er nyttigt, hvis du har mange moduler.
Kodevinduer
Kodevinduer er specielle tekstredigerere, hvor du kan redigere din makros VBA -kode. Hvis du ville se koden til en makro i modul 1, ville du dobbeltklikke på 'Modul1' i projektvinduet.
Kører makroer i VB Editor
Makroer kan køres direkte fra VB Editor, hvilket er nyttigt til test og fejlfinding.
Kører en makro
- I projektvinduet skal du dobbeltklikke på modulet, der indeholder den makro, du vil teste (for at åbne vinduet Kode)
- I vinduet Kode skal du placere markøren hvor som helst på makroens kode mellem "Sub" og "End Sub"
- Klik på Løb på værktøjslinjen, eller tryk på tastaturgenvej F5
"Step-Through" en makro
I stedet for at køre makroen på én gang, kan du køre makroen én linje ad gangen ved hjælp af en tastaturgenvej til at “gå igennem” koden. Makroen stopper på hver linje, så du kan sikre, at hver kodelinje gør, hvad du forventer i Excel. Du kan også stoppe en makro fra at fortsætte når som helst ved hjælp af denne metode.
Sådan “træder du igennem” en makro:
- I projektvinduet skal du dobbeltklikke på modulet, der indeholder den makro, du vil teste (for at åbne vinduet Kode)
- I vinduet Kode skal du placere markøren hvor som helst på makroens kode
- Tryk på tastaturgenvejen F8 for at starte "trinvis" proces
- Tryk gentagne gange på F8 for at fremskynde kodeudførelsen, angivet med den gule markering i vinduet Kode
- Hvis du vil stoppe en makro fra at fortsætte, skal du trykke på Nulstil knap
Hvorfor redigere VBA -makroer?
Makrooptageren - selvom den er effektiv - er også meget begrænset. I nogle tilfælde producerer den langsomme makroer, registrerer handlinger, du ikke havde til hensigt at gentage, eller registrerer ting, du ikke troede, du lavede. At lære at redigere dine makroer hjælper dem med at køre hurtigere, mere effektivt og mere forudsigeligt.
Udover at løse disse problemer får du også en massiv produktivitetsforøgelse, når du udnytter makroernes fulde kraft. Makroer behøver ikke bare at være optagelser af opgaver - makroer kan omfatte logik, så de kun udfører opgaver under visse betingelser. På bare et par minutter kan du kode loops, der gentager en opgave hundredvis eller tusinder af gange på én gang!
Nedenfor finder du nogle praktiske tips til at hjælpe med at optimere din makrokode samt værktøjer til at få dine makroer til at fungere hårdere og smartere.
Almindelige makroredigeringseksempler
Fremskynde makroer
Hvis du har en makro, der tager lang tid at køre, kan der være et par grunde til, at den kører langsomt.
For det første: Når en makro kører, viser Excel alt, som det sker i realtid - mens det kan se hurtigt til dig, faktiskviser værket er et betydeligt præstationshit. En måde at få Excel til at køre betydeligt hurtigere er ved at fortælle det til stop med at opdatere skærmen:
'Deaktiver skærmopdatering af Application.ScreenUpdating = Falsk' Aktiver skærmopdatering af Application.ScreenUpdating = True
Linjen "Application.ScreenUpdating = False" betyder, at du ikke kan se makroen fungere, men den kører meget hurtigere. Bemærk, at du altid bør indstille ScreenUpdating til True i slutningen af din makro, ellers fungerer Excel muligvis ikke, som du forventer senere!
En anden måde at fremskynde makroer på:slå automatisk beregning fra i makroen. Hvis du har arbejdet med komplekse regneark, ved du, at små ændringer kan udløse tusindvis af beregninger, der tager tid at fuldføre, og derfor slukker mange mennesker for automatisk beregning i Excel's muligheder. Du kan også skifte dette med VBA -kode, så din makro stadig fungerer hurtigt på andre computere. Dette hjælper i tilfælde, hvor du kopierer og indsætter mange formelceller eller får mange beregninger til at udløse, når du indsætter data i et område:
'Deaktiver automatisk beregningsapplikation.Kalkulation = xlCalculationManual' Aktiver automatisk beregningsapplikation.Kalkulation = xlCalculationAutomatic
Tilføj sløjfer og logik (hvis udsagn)
Makrooptageren gemmer alle dine handlinger som kode på et sprog kaldet VBA. VBA er mere end bare en måde at registrere handlinger i Excel - det er et programmeringssprog, hvilket betyder, at det kan indeholde kode for at træffe beslutninger om, hvilke handlinger der skal udføres, eller gentage handlinger, indtil en betingelse er opfyldt.
Looping
Sig, at du ville lave en makro, der udarbejdede en rapport, og som en del af denne makro skulle du tilføje nitten ark til projektmappen i alt tyve. Du kan registrere dig selv ved at klikke på knappen (+) igen og igen, eller du kan skrive en loop, der gentager handlingen for dig, sådan her:
Sub ReportPrep () Dim i så længe i = 1 til 19 ark. Tilføj næste i slut Sub
I dette eksempel bruger vi en Til sløjfe, som er en slags sløjfe, der gentages gennem en række elementer. Her er vores område tallene 1 til 19 ved hjælp af en variabel med navnet 'i', så løkken kan holde styr. Inde i vores loop er der kun en handling, der gentages mellem til ogNæste linjer (arket tilføjer), men du kan tilføje så meget kode inde i sløjfen, som du vil gøre ting som at formatere arket, eller kopiere og indsætte data på hvert ark - uanset hvad du vil gentage.
Hvis erklæringer
An Hvis erklæring bruges til at afgøre, om en kode kører eller ej, ved hjælp af en logisk test til at træffe beslutningen. Her er et enkelt eksempel:
Sub ClearIfSmall () If Selection.Value <100 Then Selection.Clear End If End Sub
Dette enkle eksempel viser, hvordan If -sætningen fungerer - du tester en tilstand, der enten er sand eller falsk (er værdien af den valgte celle mindre end 100?), og hvis testen returnerer True, kører koden inde.
En mangel ved denne kode er, at den kun tester en celle ad gangen (og ville mislykkes, hvis du valgte flere celler). Dette ville være mere nyttigt, hvis du kunne … gå gennem hver markeret celle og teste hver enkelt …
Sub ClearIfSmall () Dim c Som område for hver c i markering. Celler Hvis c.Værdi <100 Derefter c.Clear End Hvis Næste c End Sub
I dette eksempel er der en lidt anden For -loop - denne går ikke gennem en række tal, men går i stedet gennem alle cellerne i markeringen ved hjælp af en variabel med navnet 'c' for at holde styr. Inde i sløjfen bruges værdien af 'c' til at bestemme, om cellen skal ryddes eller ej.
Loops og If -sætninger kan kombineres, som du vil - du kan sætte loops inde i loops eller en If inden i en anden, eller bruge et If til at bestemme, om en loop overhovedet skal køre.
<<>>
Fjern rullende effekter
En almindelig grund til at redigere makrokode er at fjerne skærmrulning. Når du optager en makro, skal du muligvis nå andre områder af et regneark ved at rulle, men makroer behøver ikke at rulle for at få adgang til data.
Rulning kan rod din kode med hundredvis eller endda tusinder af linjer med unødvendig kode. Her er et eksempel på koden, der registreres, når du klikker og trækker på rullefeltet:
Denne form for kode er fuldstændig unødvendig og kan slettes uden at påvirke anden funktionalitet. Selvom du ønskede at beholde rullingen, kunne denne kode stadig kondenseres til en loop.
Fjern redundant kode
Registrerede makroer har en tendens til at tilføje en masse redundant kode, der ikke nødvendigvis afspejler, hvad du vil have makroen til at gøre. Tag f.eks. Følgende registrerede kode, som registrerer ændring af et skrifttypenavn på en celle:
Selvom kun skrifttypenavnet blev ændret, blev elleve (11) skrifttypeændringer registreret som skrifttypestørrelse, teksteffekter osv. Hvis makroens hensigt kun var at ændre skrifttypenavnet (mens alle andre egenskaber blev efterladt alene), er dette optaget makro ville ikke fungere!
Det er muligt at ændre denne makro, så den kun ændrer skrifttypenavnet:
Denne makro fungerer ikke kun efter hensigten nu, men den er også meget lettere at læse.
Fjern markørbevægelser
En anden ting, der registreres i makroer, er regneark og cellevalg. Dette er et problem, fordi en bruger let kan miste styr på, hvad de lige arbejdede med, hvis markøren bevæger sig til en anden position efter en makro kører.
Som med rulning, du kan være nødvendigt at flytte markøren og vælge forskellige celler for at udføre en opgave, men makroer behøver ikke at bruge markøren for at få adgang til data. Overvej følgende kode, som kopierer et område og derefter indsætter det i tre andre ark:
Der er et par problemer med denne kode:
- Brugeren mister sin tidligere plads i projektmappen
- Makroen angiver ikke, hvilket ark vi kopiererfra - dette kan være et problem, hvis makroen blev kørt på det forkerte ark
Derudover er koden vanskelig at læse og spild. Disse problemer kan løses let nok:
I denne kode er det klart at se, at vi kopierer fra Sheet1, og hverken det aktive regneark eller det valgte område skal ændres for at indsætte dataene. (En væsentlig ændring er brugen af "PasteSpecial" i stedet for "Paste" - Range -objekter, som "Range (" C4 ″) ", har kun adgang til PasteSpecial -kommandoen.)
Når kode bliver fuld af referencer til ".Select" og "Selection", er det en anelse om, at der er plads til at optimere den kode og gøre den mere effektiv.
