Jobber med Excel VBA -makroer
Makroer i Excel lagres som VBA -kode, og noen ganger vil du redigere denne koden direkte. Denne opplæringen vil dekke hvordan du ser og redigerer makroer, beskriver noen makrofeilsøkingsteknikker og gir noen vanlige redigeringseksempler.
Se makroer
En liste over makroer kan vises i dialogboksen Makroer. For å se denne dialogboksen, velg Utvikler -fanen på båndet og klikk på Makro -knappen.
Hvis flere arbeidsbøker er åpne, vises makroer fra alle arbeidsbøkene i listen. Makroer i den aktive arbeidsboken vises bare ved navn, mens makroer i andre arbeidsbøker vil ha prefikset med arbeidsboknavnet og et utropstegn (dvs. "Book2! OtherMacro").
Åpne en makro for redigering
Du kan bruke makro -dialogboksen til å åpne koden for en makro ved å velge makroens navn og klikke på Rediger -knappen. Dette åpner makroen i VB Editor.
Alternativt kan du åpne VB Editor direkte ved å klikke på Visual Basic -knappen i kategorien Utvikler, eller ved å trykke på ALT+F11 hurtigtast.
Ved å bruke denne metoden må du navigere til ønsket makro (også kalt "prosedyre"). Vi vil gå over VBA Editor -oppsettet:
Oversikt over VB Editor
VB Editor har flere vinduer; i denne opplæringen dekker vi prosjektvinduet, vinduet Egenskaper og kodevinduet.
Prosjektvindu
Prosjektvinduet viser hver Excel -fil som sitt eget prosjekt, med alle objektene i prosjektet kategorisert etter type. Innspilte makroer vises i kategorien "Moduler", vanligvis i objektet "Modul1". (Hvis prosjektet ditt har flere moduler og du ikke er sikker på hvor makroen er lagret, åpner du den bare fra den nevnte makro -dialogboksen.)
Egenskaper -vinduet
Egenskapsvinduet viser egenskapene og tilhørende verdier for et objekt - for eksempel klikker du på et regnearkobjekt i prosjektvinduet, vises en liste over egenskaper for regnearket. Eiendomsnavn er til venstre, og eiendomsverdier er til høyre.
Hvis du velger en modul i prosjektvinduet, vil den vise at den bare har en egenskap, "(Navn)". Du kan endre navnet på en modul ved å dobbeltklikke på eiendommens verdi, skrive inn et nytt navn og trykke Enter. Hvis du endrer modulens navn, får du nytt navn i prosjektvinduet, noe som er nyttig hvis du har mange moduler.
Kodevinduer
Kodevinduer er spesielle tekstredigerere der du kan redigere makroens VBA -kode. Hvis du ønsket å se koden for en makro som ligger i modul 1, vil du dobbeltklikke på 'modul 1' i prosjektvinduet.
Kjører makroer i VB Editor
Makroer kan kjøres direkte fra VB Editor, noe som er nyttig for testing og feilsøking.
Kjører en makro
- I prosjektvinduet dobbeltklikker du på modulen som inneholder makroen du vil teste (for å åpne kodevinduet)
- I kodevinduet plasserer du markøren hvor som helst på makrokoden mellom "Sub" og "End Sub"
- Klikk på Løpe på verktøylinjen, eller trykk på hurtigtasten F5
"Step-Through" en makro
I stedet for å kjøre makroen på en gang, kan du kjøre makroen én linje om gangen ved å bruke en hurtigtast for å "gå gjennom" koden. Makroen stopper på hver linje, slik at du kan sørge for at hver kodelinje gjør det du forventer i Excel. Du kan også stoppe en makro fra å fortsette når som helst ved å bruke denne metoden.
For å "gå gjennom" en makro:
- I prosjektvinduet dobbeltklikker du på modulen som inneholder makroen du vil teste (for å åpne kodevinduet)
- I kodevinduet plasserer du markøren hvor som helst på makroens kode
- Trykk på hurtigtasten F8 for å starte "trinnvis" -prosessen
- Trykk F8 gjentatte ganger for å gå ut av kode, angitt med det gule høydepunktet i kodevinduet
- Trykk på for å stoppe en makro fra å fortsette Nullstille knapp
Hvorfor redigere VBA -makroer?
Makroopptakeren - selv om den er effektiv - er også svært begrenset. I noen tilfeller produserer den sakte makroer, registrerer handlinger du ikke hadde tenkt å gjenta, eller registrerer ting du ikke trodde du gjorde. Å lære å redigere makroene dine vil hjelpe dem å kjøre raskere, mer effektivt og mer forutsigbart.
I tillegg til å fikse disse problemene, får du også en massiv produktivitetsøkning når du utnytter makroens fulle kraft. Makroer trenger ikke bare å være opptak av oppgaver - makroer kan inneholde logikk, slik at de bare utfører oppgaver under visse forhold. På bare et par minutter kan du kode sløyfer som gjentar en oppgave hundrevis eller tusenvis av ganger på en gang!
Nedenfor finner du noen praktiske tips for å optimalisere makrokoden din, samt verktøy for å få makroene til å jobbe hardere og smartere.
Vanlige makroredigeringseksempler
Fremskynde makroer
Hvis du har en makro som tar lang tid å kjøre, kan det være et par grunner til at den går sakte.
For det første: Når en makro kjøres, viser Excel alt som det skjer i sanntid - mens det kan se raskt til deg, faktiskviser verket er en betydelig prestasjonshit. En måte å få Excel til å kjøre betydelig raskere på er å fortelle det til slutt å oppdatere skjermen:
'Disable Screen Updating Application.ScreenUpdating = False' Aktiver Screen Updating Application.ScreenUpdating = True
Linjen "Application.ScreenUpdating = False" betyr at du ikke vil se makroen fungere, men den vil kjøre mye raskere. Vær oppmerksom på at du alltid bør sette ScreenUpdating til True på slutten av makroen, ellers fungerer Excel kanskje ikke slik du forventer senere!
En annen måte å få fart på makroer:slå av automatisk beregning i makroen. Hvis du har jobbet med komplekse regneark, vet du at små endringer kan utløse tusenvis av beregninger som tar tid å fullføre, og derfor slår mange av automatisk beregning i Excel-alternativene. Du kan også bytte dette med VBA -kode, slik at makroen din fortsatt fungerer raskt på andre datamaskiner. Dette hjelper i tilfeller der du kopierer og limer inn mange formelceller, eller får mange beregninger til å utløse når du limer inn data i et område:
'Deaktiver applikasjon for automatisk beregning.Kalkulering = xlCalculationManual' Aktiver automatisk beregningsapplikasjon.Kalkulering = xlCalculationAutomatic
Legg til sløyfer og logikk (hvis utsagn)
Makroopptakeren lagrer alle handlingene dine som kode på et språk som heter VBA. VBA er mer enn bare en måte å registrere handlinger i Excel - det er et programmeringsspråk, noe som betyr at den kan inneholde kode for å ta beslutninger om hvilke handlinger som skal utføres, eller gjenta handlinger til en betingelse er oppfylt.
Looping
Si at du ønsket å lage en makro som utarbeidet en rapport, og som en del av den makroen måtte du legge til nitten ark i arbeidsboken, for totalt tjue. Du kan registrere deg selv ved å klikke på (+) -knappen igjen og igjen, eller du kan skrive en løkke som gjentar handlingen for deg, slik:
Sub ReportPrep () Dim i Så lenge for i = 1 til 19 ark. Legg til neste i slutten Sub
I dette eksemplet bruker vi a For sløyfe, som er en slags sløyfe som går gjennom en rekke elementer. Her er vårt område tallene 1 til 19, ved hjelp av en variabel som heter 'i' slik at løkken kan holde oversikt. Inne i løkken vår er det bare en handling som gjentas mellom til ogneste linjer (arket legger til), men du kan legge til så mye kode i sløyfen som du vil gjøre ting som å formatere arket, eller kopiere og lime inn data i hvert ark - hva du vil gjenta.
Hvis uttalelser
An Hvis uttalelse brukes til å avgjøre om noen kode kjører eller ikke, ved å bruke en logisk test for å ta avgjørelsen. Her er et enkelt eksempel:
Sub ClearIfSmall () If Selection.Value <100 Then Selection.Clear End If End Sub
Dette enkle eksemplet viser hvordan If -setningen fungerer - du tester en tilstand som enten er sann eller usann (er verdien til den valgte cellen mindre enn 100?), og hvis testen returnerer True, kjøres koden inne.
En mangel ved denne koden er at den bare tester én celle om gangen (og ville mislykkes hvis du valgte flere celler). Dette ville være mer nyttig hvis du kunne … gå gjennom hver valgt celle og teste hver enkelt …
Sub ClearIfSmall () Dim c Som område for hver c I utvalg. Celler Hvis c.Værdi <100 Deretter c.Clear End Hvis neste c End Sub
I dette eksemplet er det en litt annen For -sløyfe - denne går ikke gjennom en rekke tall, men går i stedet gjennom alle cellene i utvalget, ved å bruke en variabel som heter 'c' for å holde oversikt. Inne i sløyfen brukes verdien av 'c' for å avgjøre om cellen skal slettes eller ikke.
Løkker og If -setninger kan kombineres slik du vil - du kan sette løkker inne i løkker, eller en Hvis inne i en annen, eller bruke en Hvis for å bestemme om en sløyfe skal løpe i det hele tatt.
<<>>
Fjern rulleeffekter
En vanlig grunn til å redigere makrokode er å fjerne skjermrulling. Når du spiller inn en makro, må du kanskje nå andre områder av et regneark ved å rulle, men makroer trenger ikke å rulle for å få tilgang til data.
Rulling kan rote koden din med hundrevis eller tusenvis av linjer med unødvendig kode. Her er et eksempel på koden som blir registrert når du klikker og drar på rullefeltet:
Denne typen kode er helt unødvendig og kan slettes uten å påvirke annen funksjonalitet. Selv om du ønsket å beholde rullingen, kan denne koden fortsatt kondenseres til en løkke.
Fjern overflødig kode
Registrerte makroer har en tendens til å legge til mye overflødig kode som ikke nødvendigvis gjenspeiler det du vil at makroen skal gjøre. Ta for eksempel følgende innspilte kode, som registrerer endring av et skriftnavn på en celle:
Selv om bare skriftnavnet ble endret, ble elleve (11) skriftendringer registrert som skriftstørrelsen, teksteffektene osv. Hvis makroens intensjon bare var å endre skriftnavnet (mens alle andre eiendommer var alene) innspilt makro ville ikke fungere!
Det er mulig å endre denne makroen slik at den bare endrer skriftnavnet:
Denne makroen vil ikke bare fungere etter hensikten nå, men den er også mye lettere å lese.
Fjern markørbevegelser
En annen ting som blir registrert i makroer, er regneark og cellevalg. Dette er et problem fordi en bruker lett kan miste oversikten over hva de nettopp jobbet med hvis markøren beveger seg til en annen posisjon etter at en makro har kjørt.
Som med rulling, du må kanskje flytte markøren og velge forskjellige celler for å utføre en oppgave, men makroer trenger ikke å bruke markøren for å få tilgang til data. Tenk på følgende kode, som kopierer et område og limer det inn i tre andre ark:
Det er noen problemer med denne koden:
- Brukeren mister sin forrige plass i arbeidsboken
- Makroen angir ikke hvilket ark vi kopiererfra - dette kan være et problem hvis makroen ble kjørt på feil ark
I tillegg er koden vanskelig å lese og sløsing. Disse problemene kan løses enkelt nok:
I denne koden er det klart å se at vi kopierer fra Sheet1, og verken det aktive regnearket eller det valgte området må endres for å lime inn dataene. (En vesentlig endring er bruken av "PasteSpecial" i stedet for "Paste" - Range -objekter, som "Range (" C4 ″) ", har bare tilgang til PasteSpecial -kommandoen.)
Når koden blir full av referanser til ".Select" og "Selection", er det en anelse om at det er rom for å optimalisere den koden og gjøre den mer effektiv.
