Arbetar med Excel VBA -makron
Makron i Excel lagras som VBA -kod, och ibland vill du redigera den här koden direkt. Denna handledning kommer att täcka hur du visar och redigerar makron, beskriver några makrofelsökningstekniker och ger några vanliga redigeringsexempel.
Visa makron
En lista över makron kan visas i dialogrutan Makron. Om du vill visa den här dialogrutan väljer du fliken Utvecklare på menyfliksområdet och klickar på knappen Makron.
Om flera arbetsböcker är öppna visas makron från alla arbetsböcker i listan. Makron i den aktiva arbetsboken visas bara med namnet, medan makron i andra arbetsböcker kommer att ha ett prefix med arbetsbokens namn och ett utropstecken (dvs. "Book2! OtherMacro").
Öppna ett makro för redigering
Du kan använda makrodialogen för att öppna koden för ett makro genom att välja makrons namn och klicka på knappen Redigera. Detta öppnar makrot i VB Editor.
Alternativt kan du öppna VB Editor direkt genom att klicka på Visual Basic -knappen på fliken Utvecklare, eller genom att trycka på ALT+F11 kortkommando.
Med denna metod måste du navigera till ditt önskade makro (kallas även "procedur"). Vi kommer att gå över VBA Editor -layouten:
Översikt över VB Editor
VB Editor har flera fönster; i den här självstudien täcker vi projektfönstret, fönstret Egenskaper och kodfönstret.
Projektfönster
Projektfönstret visar varje Excel -fil som sitt eget projekt, med alla objekt i projektet kategoriserade efter typ. Inspelade makron visas i kategorin "Moduler", vanligtvis i objektet "Modul1". (Om ditt projekt har flera moduler och du inte är säker på var ditt makro är lagrat öppnar du det helt enkelt från den ovannämnda dialogrutan Makron.)
Egenskapsfönster
Egenskapsfönstret visar egenskaper och tillhörande värden för ett objekt - till exempel genom att klicka på ett kalkylbladsobjekt i projektfönstret visas en lista med egenskaper för kalkylbladet. Fastighetsnamn finns till vänster och fastighetsvärden till höger.
Om du väljer en modul i projektfönstret visas att den bara har en egenskap, "(Namn)". Du kan ändra namnet på en modul genom att dubbelklicka på egenskapens värde, skriva ett nytt namn och trycka på Retur. Om du ändrar modulens namn kommer det att byta namn på det i projektfönstret, vilket är användbart om du har många moduler.
Kodfönster
Kodfönster är speciella textredigerare där du kan redigera ditt makros VBA -kod. Om du ville se koden för ett makro som finns i modul1, dubbelklickar du på "modul1" i projektfönstret.
Kör makron i VB Editor
Makron kan köras direkt från VB Editor, vilket är användbart för testning och felsökning.
Kör ett makro
- I projektfönstret dubbelklickar du på modulen som innehåller makrot du vill testa (för att öppna dess kodfönster)
- I kodfönstret placerar du markören var som helst på makrokoden mellan "Sub" och "End Sub"
- Klicka på Springa på verktygsfältet, eller tryck på tangentbordsgenväg F5
"Step-Through" ett makro
Istället för att köra makrot på en gång kan du köra makrot en rad i taget, med hjälp av en kortkommando för att "gå igenom" koden. Makrot kommer att pausa på varje rad, så att du kan se till att varje kodrad gör vad du förväntar dig i Excel. Du kan också stoppa ett makro från att fortsätta när som helst med den här metoden.
För att "gå igenom" ett makro:
- I projektfönstret dubbelklickar du på modulen som innehåller makrot du vill testa (för att öppna dess kodfönster)
- I fönstret Kod, placera markören var som helst på makrons kod
- Tryck på tangentbordsgenväg F8 för att påbörja "steg-igenom" -processen
- Tryck på F8 upprepade gånger för att avancera kodkörning, vilket indikeras av den gula markeringen i kodfönstret
- För att stoppa ett makro från att fortsätta, tryck på Återställa knapp
Varför redigera VBA -makron?
Makroinspelaren - även om den är effektiv - är också mycket begränsad. I vissa fall producerar det långsamma makron, registrerar åtgärder du inte hade för avsikt att upprepa eller registrerar saker du inte trodde att du gjorde. Att lära sig redigera dina makron hjälper dem att köra snabbare, mer effektivt och mer förutsägbart.
Förutom att lösa dessa problem får du också en massiv produktivitetsökning när du utnyttjar makronas fulla kraft. Makron behöver inte bara vara inspelningar av uppgifter - makron kan inkludera logik så att de bara utför uppgifter under vissa förhållanden. På bara ett par minuter kan du koda loopar som upprepar en uppgift hundratals eller tusentals gånger på en gång!
Nedan hittar du några praktiska tips för att optimera din makrokod, samt verktyg för att få dina makron att arbeta hårdare och smartare.
Vanliga makroredigeringsexempel
Snabba upp makron
Om du har ett makro som tar lång tid att köra kan det finnas ett par anledningar till att det går långsamt.
För det första: när ett makro körs kommer Excel att visa allt som det händer i realtid - medan det kan se snabbt till dig, faktisktsom visar verket är en betydande prestationshit. Ett sätt att få Excel att köra betydligt snabbare är att berätta det för sluta uppdatera skärmen:
'Disable Screen Updating Application.ScreenUpdating = False' Aktivera Screen Updating Application.ScreenUpdating = True
Raden "Application.ScreenUpdating = False" betyder att du inte kommer att se makrot fungera, men det kommer att köra mycket snabbare. Observera att du alltid bör ställa in ScreenUpdating till True i slutet av ditt makro, annars fungerar Excel kanske inte som du förväntar dig senare!
Ett annat sätt att påskynda makron:inaktivera automatisk beräkning i makrot. Om du har arbetat med komplexa kalkylblad vet du att små ändringar kan utlösa tusentals beräkningar som tar tid att slutföra, varför många stänger av automatisk beräkning i Excel-alternativ. Du kan också växla detta med VBA -kod, så att ditt makro fortfarande fungerar snabbt på andra datorer. Detta hjälper i fall när du kopierar och klistrar in många formelceller eller får många beräkningar att aktiveras när du klistrar in data i ett intervall:
'Inaktivera automatisk beräkningsprogram. Beräkning = xlCalculationManual' Aktivera automatisk beräkningsapplikation. Beräkning = xlCalculationAutomatic
Lägg till slingor och logik (om uttalanden)
Makroinspelaren sparar alla dina handlingar som kod på ett språk som kallas VBA. VBA är mer än bara ett sätt att spela in åtgärder i Excel - det är ett programmeringsspråk, vilket innebär att den kan innehålla kod för att fatta beslut om vilka åtgärder som ska utföras eller upprepa åtgärder tills ett villkor är uppfyllt.
Looping
Säg att du ville göra ett makro som utarbetade en rapport, och som en del av det makrot måste du lägga till nitton blad i arbetsboken, totalt tjugo. Du kan spela in dig själv genom att klicka på (+) -knappen om och om igen, eller så kan du skriva en loop som upprepar åtgärden för dig, så här:
Sub ReportPrep () Dim i Så länge för i = 1 till 19 ark. Lägg till nästa i Avsluta sub
I det här exemplet använder vi a För slinga, som är en slags loop som iterates genom en rad objekt. Här är vårt intervall siffrorna 1 till 19, med en variabel som heter 'i' så att slingan kan hålla reda på. Inne i vår slinga är det bara en åtgärd som upprepas mellan för ochNästa rader (arket lägger till), men du kan lägga till så mycket kod inuti slingan som du vill göra saker som att formatera arket eller kopiera och klistra in data på varje ark - vad du än vill upprepa.
If uttalanden
Ett If uttalande används för att avgöra om någon kod körs eller inte, med hjälp av ett logiskt test för att fatta beslutet. Här är ett enkelt exempel:
Sub ClearIfSmall () If Selection.Value <100 Then Selection.Clear End If End Sub
Detta enkla exempel visar hur If -satsen fungerar - du testar något villkor som är antingen sant eller falskt (är värdet på den valda cellen mindre än 100?), och om testet returnerar True körs koden inuti.
En brist på denna kod är att den bara testar en cell i taget (och skulle misslyckas om du markerade flera celler). Detta skulle vara mer användbart om du kunde … gå igenom varje vald cell och testa var och en …
Sub ClearIfSmall () Dim c Som intervall för varje c i Selection.Cells Om c.Value <100 Sedan c.Clear End Om Next c End Sub
I det här exemplet finns det en något annorlunda For -loop - den här går inte igenom ett antal nummer, utan går istället igenom alla celler i urvalet, med hjälp av en variabel med namnet 'c' för att hålla reda på. Inuti slingan används värdet 'c' för att avgöra om cellen ska rensas eller inte.
Loops och If -satser kan kombineras hur du vill - du kan lägga loopar inuti loopar, eller en If inuti en annan, eller använda ett If för att avgöra om en loop ska köras alls.
<<>>
Ta bort rullningseffekter
En vanlig anledning att redigera makrokod är att ta bort skärmbläddring. När du spelar in ett makro kan du behöva nå andra områden i ett kalkylblad genom att rulla, men makron behöver inte rulla för att komma åt data.
Rullning kan störa din kod med hundratals eller till och med tusentals rader med onödig kod. Här är ett exempel på koden som spelas in när du klickar och drar i rullningslisten:
Denna typ av kod är helt onödig och kan raderas utan att påverka någon annan funktionalitet. Även om du ville behålla rullningen kan den här koden fortfarande kondenseras till en loop.
Ta bort redundant kod
Inspelade makron tenderar att lägga till mycket redundant kod som inte nödvändigtvis återspeglar vad du vill att makrot ska göra. Ta till exempel följande inspelade kod som registrerar ändring av ett teckensnittsnamn på en cell:
Även om endast teckensnittsnamnet ändrades registrerades elva (11) teckensnittsändringar som teckensnittsstorlek, texteffekter etc. Om makroens avsikt bara var att ändra teckensnittsnamnet (samtidigt som alla andra egenskaper lämnas ensamma) inspelat makro skulle inte fungera!
Det är möjligt att ändra detta makro så att det endast ändrar typsnittet:
Detta makro fungerar inte bara som det är tänkt nu, det är också mycket lättare att läsa.
Ta bort markörrörelser
En annan sak som registreras i makron är kalkylblad och cellval. Detta är ett problem eftersom en användare lätt kan tappa koll på vad de just arbetade med om markören flyttar till en annan position efter att ett makro körts.
Som med rullning, du kan behöva flytta markören och välja olika celler för att utföra en uppgift, men makron behöver inte använda markören för att komma åt data. Tänk på följande kod, som kopierar ett intervall och sedan klistrar in det i tre andra ark:
Det finns några problem med den här koden:
- Användaren förlorar sin tidigare plats i arbetsboken
- Makrot anger inte vilket blad vi kopierarfrån - detta kan vara ett problem om makrot kördes på fel ark
Dessutom är koden svårläst och slöseri. Dessa problem kan lösas enkelt nog:
I den här koden är det tydligt att se att vi kopierar från Sheet1, och varken det aktiva kalkylbladet eller det valda intervallet behöver ändras för att klistra in data. (En viktig förändring är användningen av "PasteSpecial" istället för "Paste" - Range -objekt, som "Range (" C4 ″) ", har bara åtkomst till PasteSpecial -kommandot.)
När koden blir full av referenser till ".Select" och "Selection" är det en aning om att det finns utrymme att optimera den koden och göra den mer effektiv.
