Variabler och konstanter i VBA

I VBA, som i alla andra programmeringsspråk, används variabler och konstanter för att lagra alla värden. Som namnet antyder kan variabler ändras, medan konstanter lagrar fasta värden.

Till exempel en konstant Pi lagrar värdet 3,14159265... Siffran "Pi" kommer inte att ändras under körningen av programmet, men det är fortfarande bekvämare att lagra ett sådant värde som en konstant.

Samtidigt kan vi använda variabeln sVAT_Rate att lagra momssatsen på köpta varor. Variabelt värde sVAT_Rate kan variera beroende på den köpta produkten.

Datatyper

Alla variabler och konstanter är av en viss datatyp. Tabellen nedan listar de datatyper som används i VBA med en beskrivning och ett intervall av möjliga värden:

Data typ StorlekBeskrivningVärdeintervall
Byte1 bitgrupperPositiva heltal; används ofta för binära datafrån 0 till 255
Boolean2 bitgrupperKan vara antingen sant eller falsktSant eller falskt
Heltal2 bitgrupperHeltal (ingen bråkdel)från -32 till +768
Lång4 bitgrupperStora heltal (ingen bråkdel)от -2 147 483 648 до +2 147 483 647
enda4 bitgrupperEnkelt precisionsflyttalfrån -3.4e38 till +3.4e38
Dubbelklicka8 bitgrupperFlyttal med dubbel precisionfrån -1.8e308 till +1.8e308
Valuta8 bitgrupperFlyttal, med ett fast antal decimalerот -922 337 203 685 477.5808 до +922 337 203 685 477.5807
Datum8 bitgrupperDatum och tid – Data av typen Datum representeras av ett flyttal. Heltalsdelen av detta tal uttrycker datumet och bråkdelen uttrycker tiden.från 1 januari 100 till 31 december 9999
Ändamålet4 bitgrupperObjektreferensAlla objektreferenser
SträngförändrasKaraktärsuppsättning. Strängtypen kan vara av fast eller variabel längd. Mer vanligt med variabel längdFast längd – upp till cirka 65 tecken. Variabel längd – upp till cirka 500 miljarder tecken
VariantförändrasKan innehålla ett datum, en flytande eller en teckensträng. Denna typ används i de fall det inte är känt i förväg vilken typ av data som kommer att matas in.Nummer – Dubbel, sträng – String

Uppenbarligen, genom att använda tabellen ovan och välja rätt datatyp, kan du använda minnet mer ekonomiskt (välj till exempel datatypen Heltal istället Lång or enda istället Dubbelklicka). Men när du använder mer kompakta datatyper måste du vara försiktig så att din kod inte försöker passa in oproportionerligt stora värden i dem.

Deklarera variabler och konstanter

Översättarens anmärkning: På tal om variabler i VBA är det värt att nämna ytterligare en mycket viktig punkt. Om vi ​​deklarerar en variabel men inte tilldelar något värde till den, initieras den med ett standardvärde:

• textsträngar initieras med tomma strängar;

• siffror — värde 0;

• typ variabler Boolean — Falskt;

• datum – 30 december 1899.

Innan en variabel eller konstant kan användas måste den deklareras. För att göra detta, lägg till följande enkla kodrad till makrot:

Dim Имя_Переменной As Тип_Данных

I kodraden ovan Variabel_namn är namnet på variabeln som kommer att användas i koden, och Data typ är en av datatyperna från tabellen som ges lite tidigare i den här artikeln. Till exempel:

Dim sVAT_Rate As Single Dim i As Integer

Konstanter deklareras på liknande sätt, men när konstanter deklareras måste deras värde omedelbart anges. Till exempel, så här:

Const iMaxCount = 5000 Const iMaxScore = 100

Det är inte nödvändigt att deklarera variabler i Excel. Som standard kommer alla inmatade men inte deklarerade variabler i Excel att ha typen Variant och kommer att kunna acceptera både numeriska och textvärden.

Således kan programmeraren använda den nya variabeln när som helst (även om den inte har deklarerats), och Excel kommer att behandla den som en variabel av typen Variant. Det finns dock flera skäl till varför detta inte bör göras:

  1. Minnesanvändning och beräkningshastighet. Om du inte deklarerar en variabel med en indikation på datatypen, kommer den som standard att vara inställd på typen Variant. Denna datatyp använder mer minne än andra datatyper. Några extra byte per variabel kanske inte låter så mycket, men i praktiken kan program ha tusentals variabler (särskilt när man arbetar med arrayer). Därför är det extra minne som används av variabler som Variant, jämfört med variabler av typ Heltal or enda, kan uppgå till ett betydande belopp. Dessutom operationer med variabler av typ Variant exekveras mycket långsammare än med variabler av andra typer, respektive ett extra tusen variabler av typen Variant kan avsevärt bromsa beräkningar.
  2. Förebyggande av stavfel i variabelnamn. Om alla variabler är deklarerade kan VBA-satsen användas − Explicit alternativ (vi kommer att prata om det senare) för att identifiera alla odeklarerade variabler. Detta eliminerar uppkomsten av ett fel i programmet som ett resultat av ett felaktigt skrivet variabelnamn. Till exempel att använda en variabel som heter sVAT_Rate, kan du göra ett stavfel och, tilldela ett värde till denna variabel, skriva: "VATRate = 0,175". Det förväntas att från och med nu, variabeln sVAT_Rate bör innehålla värdet 0,175 – men det gör det naturligtvis inte. Om läget för obligatorisk deklaration av alla använda variabler är aktiverat, kommer VBA-kompilatorn omedelbart att indikera ett fel, eftersom den inte hittar variabeln Skattesats bland de aviserade.
  3. Markera värden som inte matchar den deklarerade typen av en variabel. Om du deklarerar en variabel av en viss typ och försöker tilldela data av en annan typ till den får du ett felmeddelande som, om det inte korrigeras, kan få programmet att krascha. Vid en första anblick kan detta tyckas vara en bra anledning att inte deklarera variabler, men faktiskt än tidigare visar det sig att en av variablerna fick fel data som den var tänkt att ta emot – så mycket bättre! Annars, om programmet fortsätter att köras, kan resultaten bli felaktiga och oväntade, och det blir mycket svårare att hitta orsaken till felen. Det är också möjligt att makrot kommer att "framgångsrikt" köras. Som ett resultat kommer felet att förbli obemärkt och arbetet kommer att fortsätta med felaktig data!

I detta avseende är det önskvärt att upptäcka en felaktig datatyp och korrigera sådana fel i koden så tidigt som möjligt. Av dessa skäl rekommenderas det att du deklarerar alla variabler när du skriver ett VBA-makro.

Explicit alternativ

Operatör Explicit alternativ gör att alla variabler som kommer att användas i VBA-kod deklareras, och flaggar alla odeklarerade variabler som fel under kompileringen (innan kodexekveringen startar). Det är inte svårt att använda den här operatorn – skriv bara den här raden längst upp i VBA-filen:

Option Explicit

Om du vill alltid infoga Explicit alternativ till toppen av varje ny VBA-modul som skapas, kan detta göras automatiskt. För att göra detta måste du aktivera alternativet Kräv variabeldeklaration i VBA-redigerarens inställningar.

Detta görs så här:

  • Från Visual Basic Editor-menyn, klicka verktyg > Tillbehör
  • Öppna fliken i dialogrutan som visas redaktör
  • Markera rutan Kräv variabeldeklaration och tryck OK

När den är aktiverad, strängen Explicit alternativ kommer automatiskt att infogas i början av varje ny modul som skapas.

Omfattning av variabler och konstanter

Varje deklarerad variabel eller konstant har sin egen begränsade omfattning, det vill säga en begränsad del av programmet där denna variabel finns. Omfattningen beror på var deklarationen av variabeln eller konstanten gjordes. Ta till exempel variabeln sVAT_Rate, som används i funktionen Total kostnad. Följande tabell diskuterar två alternativ för variabel omfattning sVAT_Ratedeklareras i två olika positioner i modulen:

Alternativ Explicit Dim sVAT_Rate As Single Function Total_Cost() As Double ... End Function
Om variabeln sVAT_Rate deklareras i början av modulen, då kommer omfattningen av denna variabel att vara hela modulen (dvs variabeln sVAT_Rate kommer att kännas igen av alla procedurer i denna modul).

Därför, om i funktionen Total kostnad variabel sVAT_Rate kommer att tilldelas något värde, då kommer nästa funktion som körs inom samma modul att använda variabeln sVAT_Rate med samma betydelse.

Men om någon funktion som finns i en annan modul anropas, då är variabeln för den sVAT_Rate kommer inte att bli känt.

Alternativ Explicit funktion Total_Cost() As Double Dim sVAT_Rate As Single ... End Function
Om variabeln sVAT_Rate deklareras i början av funktionen Total kostnad, då begränsas dess omfattning endast till denna funktion (dvs. inom funktionen Total kostnad, kan du använda variabeln sVAT_Rate, men inte utanför).

När du försöker använda sVAT_Rate i en annan procedur kommer VBA-kompilatorn att rapportera ett fel eftersom denna variabel inte deklarerades utanför funktionen Total kostnad (förutsatt att operatören används Explicit alternativ).

I exemplet som visas ovan deklareras variabeln på modulnivå med nyckelordet Dim. Det kan dock vara nödvändigt att deklarerade variabler kan användas i andra moduler. I sådana fall att deklarera en variabel istället för ett nyckelord Dim nyckelord måste användas offentliga.

Förresten, för att deklarera en variabel på modulnivå, istället för nyckelordet Dim nyckelord kan användas Privat, vilket indikerar att denna variabel endast är avsedd att användas i den aktuella modulen.

Du kan också använda nyckelord för att deklarera konstanter. offentliga и Privat, men inte istället för nyckelordet const, tillsammans med den.

Följande exempel visar användningen av nyckelord offentliga и Privat tillämpas på variabler och konstanter.

Alternativ Explicit offentlig sVAT_Rate As Single Public Const iMax_Count = 5000 ...    
I det här exemplet är nyckelordet offentliga används för att deklarera en variabel sVAT_Rate och konstanter iMax_Count. Omfattningen av delar som deklareras på detta sätt kommer att vara hela det pågående projektet.

Detta innebär att sVAT_Rate и iMax_Count kommer att vara tillgänglig i alla projektmoduler.

Alternativ Explicit privat sVAT_Rate As Single Private Const iMax_Count = 5000 ...    
I det här exemplet, för att deklarera en variabel sVAT_Rate och konstanter iMax_Count nyckelord som används Privat. Omfattningen av dessa element är den aktuella modulen.

Detta innebär att sVAT_Rate и iMax_Count kommer att vara tillgänglig i alla procedurer i den aktuella modulen, men kommer inte att vara tillgängliga för procedurer i andra moduler.

Kommentera uppropet