Skrivning af VBA -makroer fra bunden

Excels makrooptager har meget kraft, men den har sine begrænsninger. Som dækket i en anden artikel, optager makrooptageren ofte unødvendig kode og kan ikke registrere ting som logik eller interaktioner med andre programmer. Det kan også være svært at bruge til længere makroer - du kan finde dig i at storyboarde dine handlinger på forhånd bare for at undgå at lave dyre fejl.

Denne artikel har til formål at hjælpe dig med at begynde at kode makroer fra bunden i VBA. Du lærer, hvor makroer er gemt, skriver en grundlæggende makro og lærer det grundlæggende i programmering i VBA ved hjælp af variabler, logik og sløjfer.

Kom godt i gang

VBA og Visual Basic Editor

VBA eller Visual Basic for Applications er det sprog, makroer skrives på. Alle makroer gemmes som VBA-kode, uanset om de er håndkodet eller oprettet med makrooptageren.

Du kan få adgang til alle VBA -koder i en projektmappe ved hjælp af Visual Basic Editor. Dette er en særlig tekstredigerer og debugger, der er indbygget i alle kontorapps, inklusive Excel. Normalt åbner du denne editor med ALT+F11 tastaturgenvej i Excel, men du kan også få adgang til den fra Excel Udvikler fane, hvis du har den aktiveret.

Projekt Explorer

Det Projekt Explorer er et vindue inde i VB Editor, der viser dig alle de elementer, der kan have VBA -kode i dem. Hvis du ikke kan se dette vindue, skal du trykke på F5 for at få det vist eller vælge Projekt Explorer fra Udsigt menu.

Dobbeltklik på et element i Project Explorer viser koden for det pågældende element. Der er flere typer elementer, der kan vises i Project Explorer:

  • Arbejdsbøger
  • Arbejdsark
  • UserForms
  • Klassemoduler
  • Moduler (makroer gemmes i disse emner)

Selvom alle disse varetyper kan indeholde VBA -kode, er den bedste praksis at kode makroer i moduler.

Lav din første makro

Brug af makrolisten

Makrolisten viser dig alle makroerne i din projektmappe. Fra denne liste kan du redigere en eksisterende makro eller oprette en ny.

Sådan opretter du en ny makro ved hjælp af makrolisten:

  • Vælg fanen Udvikler, og klik på Makroer (eller tryk på ALT+F8)

  • Indtast et nyt navn til din makro, og klik derefter på "Opret"

Efter at have klikket på “Opret” vises VB Editor, der viser den nyoprettede makro. Excel opretter om nødvendigt et nyt modul til makroen.

Manuelt i VB Editor

Du kan tilføje en ny makro manuelt uden listen over makroer. Dette er den bedre mulighed, hvis du gerne vil angive det modul, makroen er gemt i.

Sådan tilføjes en makro manuelt:

  • Åbn VB Editor (ALT+F11)
  • Enten:
    • Tilføj et nyt modul ved at klikke Indsæt> Modul i menuen (modulet åbnes automatisk)

    • ELLER dobbeltklik på et eksisterende modul i Project Explorer for at åbne det

  • Indtast koden til din nye makro i modulet
Sub MyMacro () End Sub

Disse to linjer angiver begyndelsen og slutningen af ​​en makro med navnet "MyMacro" (bemærk de parenteser, der kræves). Dette vises i dialogboksen "Vis makroer" i Excel og kan tildeles en knap (selvom det ikke gør noget endnu).

Tilføj en kode til makroen

Lad os nu tilføje en kode mellem linierne "Sub" og "End Sub" for at få denne makro til at gøre noget:

Sub MyMacro () Område ("A1"). Værdi = "Hej verden!" Afslut Sub

Grundlæggende kodestrukturer

Range -objektet

Excel VBA bruger Range Object til at repræsentere celler på et regneark. I eksemplet ovenfor oprettes et Range -objekt med koden Område ("A1") for at få adgang til værdien af ​​celle A1.
Områdeobjekter bruges primært til at angive celleværdier:

Område ("A1"). Værdi = 1
Område ("A1"). Værdi = "Første celle"

Bemærk, at når du definerer celleværdier som tal, skal du bare indtaste tallet, men når du indtaster tekst, skal du omgive teksten med citater.

Områder kan også bruges til at få adgang til mange egenskaber ved celler som deres skrifttype, grænser, formler og mere.
For eksempel kan du indstille skrifttypen for en celle til fed sådan:

Område (“A1”). Font.Bold = True

Du kan også indstille formlen for en celle:

Område ("A1"). Formel = "= Sum (A2: A10)"

I Excel kan du vælge en blok af celler med markøren (f.eks. Fra A1 til D10) og indstille dem alle til fed. Range -objekter har adgang til blokke af celler som denne:

Område ("A1: D10"). Font.Bold = True

Du kan også referere til flere celler/blokke på én gang:

Område (“A1: D10, A12: D12, G1”). Font.Bold = True

Formatet for dette er det samme som det format, du ville bruge, når du vælger celler til formlen SUM () i Excel. Hver blok adskilles med et komma, og blokke betegnes med cellerne øverst til venstre og nederst til højre adskilt med et kolon.

Endelig har Range-objekter indbyggede metoder til at udføre almindelige operationer på et regneark. For eksempel vil du måske kopiere nogle data fra et sted til et andet. Her er et eksempel:

Område ("A1: D10"). Kopieringsområde ("F1"). PasteSpecial xlPasteValues ​​Range ("F1"). PasteSpecial xlPasteFormats

Dette kopierer cellerne A1: D10 til udklipsholderen og laver derefter en PasteSpecial (), der starter i celle C1 - ligesom du ville gøre det manuelt i Excel. Bemærk, at dette eksempel viser, hvordan du bruger PasteSpecial () til kun at indsætte værdier og formater - der er parametre for alle de muligheder, du vil se i dialogboksen Indsæt special.

Her er et eksempel, der sætter "Alt" til et andet regneark:

Område ("A1: D10"). Kopiark ("Ark2"). Område ("A1"). IndsætSpecial xlPasteAll

Hvis erklæringer

Med en Hvis erklæring, kan du kun få en sektion med kode til at køre “hvis” en bestemt sætning er sand.

For eksempel kan du gøre en celle fed og farve den rød, men kun "hvis" værdien i cellen er mindre end 100.

Hvis område (“A4”). Værdi <100 Så område (“A4”). Font.Bold = True Range (”A4”). Interior.Color = vbRød ende Hvis 

Den korrekte struktur af en If -sætning er som følger (firkantede parenteser angiver valgfrie komponenter):

Hvis så

[Ellers Hvis Så]

[Andet]

Afslut Hvis

Du kan inkludere så mange Ellers hvis blokke, som du gerne vil teste flere forhold. Du kan også tilføje en Andet blok, der kun kører, hvis ingen af ​​de andre betingelser i If -sætningen er opfyldt.

Her er et andet eksempel baseret på den forrige, hvor cellen formateres på flere forskellige måder afhængigt af værdien:

Hvis område ("A4"). Værdi <100 Så område ("A4"). Font.Bold = True Range ("A4"). Interior.Color = vbRed ElseIf Range ("A4"). Værdi <200 Then Range ( "A4"). Font.Bold = Falskt område ("A4"). Interior.Color = vbGul Else Range ("A4"). Font.Bold = Falsk Range ("A4"). Interior.Color = vbGrøn ende Hvis

I ovenstående eksempel er cellen ikke-fed i ElseIf-blokke, hvor værdien ikke er under 100. Du kan rede Hvis udsagn for at undgå kopiering af kode, som denne:

Hvis område ("A4"). Værdi <100 Så område ("A4"). Font.Bold = True Range ("A4"). Interior.Color = vbRødt andet område ("A4"). Font.Bold = Falsk ' fjernelse af skrifttypen kun én gang, hvis område ("A4"). Værdi <200 derefter område ("A4"). Interior.Color = vbGult andet område ("A4"). Interior.Color = vbGreen End If End Hvis

Variabler

EN Variabel er et stykke hukommelse, der bruges til at gemme midlertidige oplysninger, mens en makro kører. De bruges ofte i sløjfer som iteratorer eller til at holde resultatet af en operation, som du vil bruge flere gange gennem en makro.

Her er et eksempel på en variabel, og hvordan du kan bruge den:

Sub ExtractSerialNumber () Dim strSerial As String 'dette er variabeldeklarationen' 'As String' betyder, at denne variabel er beregnet til at holde tekst 'ved at oprette et foregivende serienummer: Range ("A4"). Value = "serial# 804567-88 ”'Analyser serienummeret fra celle A4 og tildel det variablen strSerial = Mid (Range (" A4 "). Værdi, 9)' brug nu variablen to gange, i stedet for at skulle analysere serienummeret to gange Range (" B4 ”). Værdi = strSerial MsgBox strSerial End Sub 

I dette grundlæggende eksempel bruges variablen 'strSerial' til at udtrække serienummeret fra celle A4 ved hjælp af funktionen Mid (), og bliver derefter brugt to andre steder.

Standard måde at erklære en variabel er som følger:

Svag hvilket navn [Som type]

  • hvilket navn er det navn, du beslutter dig for at give din variabel
  • type er datatypen for variablen

"[Som type] ”Del kan udelades - i så fald erklæres variablen som en varianttype, som kan indeholde enhver form for data. Selvom de er fuldstændig gyldige, bør varianttyper undgås, da de kan føre til uventede resultater, hvis du ikke er forsigtig.

Der er regler for variabelnavne. De skal starte med enten et bogstav eller et understreget tegn, kan ikke have mellemrum, punktum, kommaer, anførselstegn eller tegnene "! @ & $ #”.

Her er nogle eksempler på variable erklæringer:

Dim strFilename As String 'god navnestil - beskrivende og bruger præfiks Dim i As Long' dårlig navnestil - accepteres kun for nogle iteratorer Dim SalePrice As Double 'okay navnestil - beskrivende, men bruger ikke et præfiks Dim iCounter' okay navn - ikke for beskrivende, bruger præfiks, ingen datatype

Alle disse eksempler bruger lidt forskellige navneskemaer, men alle er gyldige. Det er ikke en dårlig idé at prefiks et variabelnavn med en kort form for dens datatype (i henhold til nogle af disse eksempler), da det gør din kode mere læsbar ved et overblik.

VBA indeholder en masse grundlæggende datatyper. De mest populære omfatter:

  • Snor (bruges til at gemme tekstdata)
  • Lang (bruges til at holde hele tal, dvs. ingen decimaler)
  • Dobbelt (bruges til at holde flydende tal, dvs. decimaler)

En fuldstændig liste over VBA-iboende datatyper findes her: https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/data-type-summary

Range Object Variables

Det er også muligt at oprette variabler, der refererer til Range Objects. Dette er nyttigt, hvis du vil henvise til et specifikt område i din kode flere steder - på den måde, hvis du skal ændre området, skal du kun ændre det ét sted.

Når du opretter en Range -objektvariabel, skal du "indstille" den til en forekomst af et Range. For eksempel:

Dim rMyRange As Range Set rMyRange = Range (“A1: A10; D1: J10”)

Hvis du forlader sætningen "Set", når du tildeler en variabel for område, vil det resultere i en fejl.

Sløjfer

Loops er blokke, der gentager koden inde i dem et bestemt antal gange. De er nyttige til at reducere mængden af ​​kode, du skal skrive, og giver dig mulighed for at skrive et stykke kode, der udfører de samme handlinger på mange forskellige relaterede emner.

For-Næste

EN For-Næste blok er en sløjfe, der gentages et bestemt antal gange. Den bruger en variabel som en iterator at tælle, hvor mange gange den er kørt, og denne iterator -variabel kan bruges inde i løkken. Dette gør For-Next loops meget nyttige til iterering gennem celler eller arrays.

Her er et eksempel, der går gennem celler i rækker 1 til 100, kolonne 1 og sætter deres værdier til værdien af ​​iteratorvariablen:

Dim i så længe i = 1 til 100 celler (i, 1) .Værdi = i Næste i

Linjen “For i = 1 til 100” betyder, at sløjfen starter fra 1 og slutter efter 100. Du kan indstille alle start- og slutnumre, du kan lide; du kan også bruge variabler til disse tal.

Som standard tæller For-Next-sløjfer med 1. Hvis du vil tælle med et andet tal, kan du skrive sløjfen med en eksplicit Trin klausul:

For i = 5 Til 100 Trin 5

Denne sløjfe starter med 5, og tilføjer derefter 5 til 'i' hver gang sløjfen gentages (så 'i' vil være 10 på den anden gentagelse, 15 på den tredje og så videre).

Ved brug af Trin, du kan også få en sløjfe til at tælle baglæns:

For i = 100 Til 1 Trin -1

Du kan også rede For-Næste sløjfer. Hver blok kræver sin egen variabel at tælle med, men du kan bruge disse variabler hvor som helst du vil. Her er et eksempel på, hvordan det er nyttigt i Excel VBA:

Dim i så længe, ​​j så længe til i = 1 til 100 for j = 1 til 100 celler (i, j) .Værdi = i * j Næste j Næste i

Dette giver dig mulighed for at gå gennem både rækker og kolonner.

ADVARSEL: selvom det er tilladt, bør du ALDRIG ÆNDRE iteratorvariablen inde i en For-Next-blok, da den bruger den iterator til at holde styr på sløjfen. Ændring af iteratoren kan forårsage en uendelig loop og hænge din makro. For eksempel:

For i = 1 Til 100 i = 1 Næste i

I denne sløjfe kommer 'jeg' aldrig over 2, før den nulstilles til 1, og sløjfen gentages for evigt.

For hver

For hver blokke ligner meget For-Next-blokke, bortset fra at de ikke bruger en tæller til at angive, hvor mange gange de går i loop. I stedet tager en For-Hver-blok en 'samling' af objekter (som et område af celler) og kører lige så mange gange, som der er objekter i den samling.

Her er et eksempel:

Dim r som område for hver r i område ("A15: J54") Hvis r.Value> 0 Så r.Font.Bold = True End If Next r

Bemærk brugen af ​​Range -objektvariablen 'r'. Dette er iteratorvariablen, der bruges i For -Every -løkken - hver gang gennem loop'en får 'r' en reference til den næste celle i området.

En fordel ved at bruge For-Each-sløjfer i Excel VBA er, at du kan gå gennem alle celler i et område uden at indlejre sløjfer. Dette kan være praktisk, hvis du har brug for at gå gennem alle cellerne i et komplekst område som Område (“A1: D12, J13, M1: Y12”).

En ulempe ved For-Each-sløjfer er, at du ikke har kontrol over den rækkefølge, cellerne behandles i. Selvom i praksis Excel går gennem cellerne i rækkefølge, i teorien det kunne behandle cellerne i en helt tilfældig rækkefølge. Hvis du skal behandle celler i en bestemt rækkefølge, skal du bruge For-Next-sløjfer i stedet.

Do-Loop

Mens For-Next-blokke bruger tællere til at vide, hvornår de skal stoppe, Do-Loop blokke kører, indtil en betingelse er opfyldt. For at gøre dette skal du bruge en Så længe klausul på enten begyndelsen eller slutningen af ​​blokken, som tester tilstanden og får sløjfen til at stoppe, når denne betingelse er opfyldt.

Eksempel:

Dim str As String str = "Buffalo" Do indtil str = "Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo" str = str & "" & "Buffalo" Loop Range ("A1"). Value = str

I denne sløjfe er "Buffalo" sammenkædet til 'str' hver gang gennem løkken, indtil den matcher den forventede sætning. I dette tilfælde udføres testen i starten af ​​sløjfen - hvis 'str' allerede var den forventede sætning (hvilket det ikke er fordi vi ikke startede den på den måde, men hvis) løkken ikke engang ville køre .

Du kan få løkken til at køre mindst en gang ved at flytte indtil -klausulen til slutningen, sådan her:

Gør str = str & "" & "Buffalo" Loop Indtil str = "Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo"

Du kan bruge den version, der giver mening i din makro.

ADVARSEL: Du kan forårsage en uendelig sløjfe med en Do-Loop-blok, hvis indtil betingelsen aldrig er opfyldt. Skriv altid din kode, så indtil betingelsen helt sikkert vil blive opfyldt, når du bruger denne type loop.

Hvad er det næste?

Når du først har forstået det grundlæggende, hvorfor så ikke prøve at lære nogle mere avancerede teknikker? Vores selvstudie på https://easyexcel.net/excel/learn-vba-tutorial/ vil bygge videre på alt, hvad du har lært her og udvide dine færdigheder med Events, UserForms, kodeoptimering og meget mere!

wave wave wave wave wave