Så här använder du variabler i Excel-underprocedurer i VBA (Visual Basic for Applications)

Artikelöversättning Artikelöversättning
Artikel-id: 843144 - Visa produkter som artikeln gäller.
Visa alla | Dölj alla

På den här sidan

INLEDNING

I denna artikel beskrivs hur du använder variabler i Microsoft Excel-underprocedurer i VBA (Visual Basic for Applications)

Mer Information

Variabler i en underprocedur

En kraftfull funktion i programmeringsspråk är möjligheten att lagra innehåll i variabler så att det kan användas eller ändras senare under proceduren. I detta dokument behandlas förljande användning av variabler i Visual Basic:
  • Så deklareras variabler.
  • Procedurer och projekt som variabler skan användas i.
  • En variabels livstid.

Deklarera en variabel i ett makro

Det enklaste sättet att deklarera en variabel i ett makro är att använda uttrycket Dim. På följande rad deklareras två variabler, x och y, som heltal:
Dim x As Integer, y As Integer
Med x och y angivna som heltal instrueras Visual Basic att reservera tillräckligt med minne för en heltalsvariabel (2 byte var för x och y) och informationen som lagras i antingen x eller y är ett heltal mellan -32 768 och 32 767.

Obs! Om du deklarerar fler än en variabel med ett enda Dim-uttryck, måste du ange datatyp för var och en av variablerna.

Om du inte anger datatyp för varje variabel, som i följande Visual Basic-kod, anges endast variabel y som en heltalsvariabel. Variabel x blir en varianttyp:
Dim x, y As Integer
Det finns mer information i avsnittet "Variantdatatyp".

Så här utför du ett varianttest:
  1. Spara och stäng eventuella öppna arbetsböcker och öppna sedan en ny.
  2. Start the Visual Basic Editor (tryck på ALT+F11).
  3. Klicka på ModulInfoga-menyn.
  4. Skriv följande kod:
    Sub Variable_Test()
    Dim x As Integer, y As Integer
    x = 10
    y = 100
    MsgBox "värdet på x är " & x & _
    Chr(13) & "värdet på y är " & y
    End Sub
  5. Kör makrot Variable_Test. Följande meddelande visas:
    värdet på x är 10
    värdet på y är 100
  6. Klicka på OK.
  7. Ändra följande rad i makrot Variable_Test:
    x = 10
    

    till:
    x = "fel"
    
  8. Kör makrot Variable_Test.
Ett körtidsfel kommer att inträffa eftersom "fel" inte är ett heltal och du försöker tilldela detta strängvärde till heltalsvariabeln x.

Sammanfattning av datatyp

I följande tabell visas vanliga variabeldatatyper:

Dölj tabellenVisa tabellen
DatatypLagringsstorlekTillåtet intervall
Boolesk 2 byte True eller False
Heltal 2 byte -32 768 till 32 767
Långt 4 byte -2 147 483 648 till 2 147 483 647
Dubbelt 8 byte -1.79769313486232E308 till -4.94065645841247E-324 för negativa värden; 4.94065645841247E-324 till 1.79769313486232E308 för positiva värden
Valuta 8 byte -922 337 203 685 477,5808 till 922 337 203 685 477,5807
Datum 8 byte 1 januari 100 till 31 december 9999
Sträng 10 byte + stränglängd

Variantdatatyp

Om du inte anger någon datatyp när du deklarerar en variabel, eller om du inte deklarerar en variabel alls, anges variantdatatypen automatiskt för variabeln i Visual Basic. Här följer fördelar med variabler som deklareras som denna datatyp:
  • Variablerna kan innehålla sträng-, datum- och tidsvärden, samt booleska och numeriska värden.
  • Värden i variblerna kan konverteras automatiskt.
Nackdelen är att variantvariabler kräver minst 16 byte minne, vilket kan vara mycket i stora procedurer och komplexa moduler.

Gör så här för att granska hur detta fungerar i makrot Variable_Test:
  1. Ändra koden i makrot Variable_Test till:
    Sub Variable_Test()
    Dim x, y
    x = "string"
    y = 1,23
    MsgBox "värdet på x är " & x & _
    Chr(13) & "värdet på y är " & y
    End Sub
    
  2. Kör makrot Variable_Test.
Det visas inget felmeddelande eftersom du kan tilldela valfria värden till variantvariablerna x och y.

Obs! Även om du utelämnar följande rad fortsätter makrot att fungera, eftersom variablerna x och y behandlas som variantdatatyper:
Dim x, y

En variabels omfång

När du deklarerar en variabel, kanske den kan tolkas i andra makron i samma modul eller andra projekt. En variabels tillgänglighet i modeuler kallas för omfång. Det fiunns tre omfångstyper: procedurnivå, privat modulnivå och publik modulnivå. Omfånget beror på hur och var du deklarerar variablerna.

Omfång på procedurnivå

En variabel med omfång på procedurnivå kan inte tolkas utanför proceduren där den är deklarerad. Om du anger värdet för en variabel som har omfång på procedurnivå, kan inte variabelinnehållet tolkas i andra makron.

Gör så här för att bekräfta att en variabel med omfång på procedurnivå inte kan tolkas utanför proceduren där den är deklarerad:
  1. Infoga en ny modul i projektet.
  2. Skriv följande två makron i modulen:
    Sub Makro1()
    Dim x As Integer
    x = 10
    MsgBox "x som den tolkas i Makro1 är " & x
    'med nästa rad körs Makro2
    Makro2
    End Sub
    Sub Makro2()
    MsgBox "x som den tolkas i Makro2 är " & x
    End Sub
    
  3. Kör Makro1.

    Följande meddelande visas:
    x, som det tolkas i Makro1 är 10
  4. Klicka på OK.

    Följande meddelande visas:
    x, som det tolkas i Makro2 är
  5. Klicka på OK.
I Makro2 visas inget värde för variabeln x eftersom denna är lokal i Makro1.

Omfång på privat och publik modulnivå

Du kan ange variabler i en moduls deklarationsavsnitt (längst upp i modulen, ovanför alla underprocedurer) och ange variablens omfång smed uttrycket Public,Dim eller Private. Om du infogar uttrycket Public framför variabeln, blir den tillgänglig för alla makron i alla moduler i projektet. Om du infogar Dim eller Private, bir variabeln endast tillgänglig till makron i moduken där den deklareras.

Gör så här för att visa skillnaden mellan Public och Dim:
  1. Spara och stäng eventuella öppna arbetsböcker och öppna sedan en ny.
  2. Starta Visual Basic Editor.
  3. Infoga en modul i projektet.
  4. Skriv följande kod i modulen:
    Public x As Integer
    Sub Makro_1a()
    x = 10
    MsgBox x
    Makro_1b
    End Sub
    Sub Makro_1b()
    x = x * 2
    MsgBox x
    Makro2
    End Sub
    
  5. Infoga yterligare en modul i projektet.
  6. Skriv följande kod i modulen:
    Sub Makro2()
    x = x * 3
    MsgBox x
    End Sub
    
  7. Kör Makro_1a i den första modulen.

    Med variablen x deklarerad som "Public x As Integer", har alla tre makron i projektet tillgång till värdet för x. I den första meddelanderutan visas värdet 10. I den andra visas 20 (eftersom x multipliceras med 2 i Makro_1b). I den tredje meddelanderutan visas värdet m60 (eftersom värdet för x ändrades till 20 i Makro_1b och sedan multiplicerades med tre i Makro2).
  8. Ändra deklarationsraden i den första modulen från:
    Public x As Integer

    till:
    Dim x As Integer
  9. Kör makrot Makro_1a.

    Med variabeln x deklarerad som "Dim x As Integer", har endast makron i den första modulen tillgång till värdet för x. Därför visas värdet 10 i den första meddelanderutan och 20 i den andra, (eftersom x multipliceras med 2 i Makro_1b) och i den tredje meddelanderutan visas värdet 0 (eftersom värdet för x inte där tillgängligt i Makro2 och det oinitierade värdet noll används i Makro 2).
  10. Ändra deklarationsraden i den första modulen från:
    Dim x As Integer

    till:
    Private x As Integer
  11. Kör makrot Makro_1a.
Samma meddelanderutor visas med uttrycksomfånget Private som med uttrycket Dim. Variablen x har samma omfång, vilket är privat för modulen där den är deklarerad.

Obs! Om du vill att variabelns omfång ska begränsas till modulen där den är deklarerad ska du använda uttrycket Private i stället för Dim. De ger samma resultat men omfånget är tydligare när du läser koden om du använder Private.

En variabels livstid

Den tid som variabeln behåller sitt värde kallas för dess livstid. Värdet för en variabel kan ändras under dess livstid, men den behåller ett värde. När variabeln förlorar sitt omfång har den inte längre något värde.

Initiera en variabels värde

När du kör ett makro initieras alla variabler till ett värde. En numerisk variabel initieras till noll, en sträng med variabel längd initieras till en sträng med noll-längd ("") och en sträng med fast längd fylls med ASCII-kod 0. Variantvariabler initieras till Empty. En Empty-variabel representeras av en nolla i numerisk kontext och en sträng med noll-längd ("") i en strängkontext.

Variabler på procedurnivå

Om du har en variabel som deklareras i ett makro med uttrycket Dim, behåller variabeln sitt värde så länge makrot körs. Om andra makron anropas med detta makro, behålls variabelns värde (men det är inte tillgängligt för andra makron) under tiden dessa makron körs.

Gör så här för att granska hur variabler på procedsurnivå fungerar:
  1. Infoga en ny modul i projektet.
  2. Skriv följande två makron i modulen:
    Sub Makro1()
    'ange x som en variabel på procedurnivå
    Dim x As Integer
       MsgBox "det initierade värdet för x är " & x
    x = 10
    MsgBox "x är " & x
    'med nästa rad körs Makro2
    Makro2
    MsgBox "x är fortfarande " & x
    End Sub
    Sub Makro2()
    MsgBox "x som den tolkas i Makro2 är " & x
    End Sub
    
  3. Kör Makro1.

    Följande meddelande visas:
    det initierade värdet på x är 0
  4. Klicka på OK.

    Följande meddelande visas:
    x är 10
  5. Klicka på OK.

    Följande meddelande visas:
    x, som det tolkas i Makro2 är
  6. Klicka på OK.

    I Makro2 visas inget värde för variabeln x eftersom denna är lokal i Makro1. Följande meddelande visas:
    x är fortfarande 10
  7. Klicka på OK.
  8. Kör Makro1.
Samma meddelande som beskrivs i steg 3 till och med 6 visas, på grund av variablen x förlorades när Makro1 slutade köras i steg 6. Det innebär att värdet för x visas som noll (det initierade värdet) i det första meddelandet när du kör Makro1 på nytt i steg 7.

Statiskt nyckelord

Om en variabel på procedurnivå deklarerars med det statiska nyckelordet, behåller variabeln sitt värde tills projektet återställs. Det innebär att om du har en statisk variabel så initieras den till sitt sista värde nästa gång du anropar proceduren.

Gör så här om du vill granska funktionen hos det statiska nyckelordet:
  1. Ändra koden i Makro1 till:
    Sub Makro1()
    'ange x som en variabel på procedurnivå
    Static x As Integer
       MsgBox "det initierade värdet för x är " & x
    x = x + 10
    MsgBox "x är " & x
    End Sub
    
  2. Kör Makro1.

    Följande meddelande visas:
    det initierade värdet på x är 0
  3. Klicka på OK.

    Följande meddelande visas:
    x är 10
  4. Klicka på OK.
  5. Kör Makro1.

    Följande meddelande visas:
    det initierade värdet på x är 10
  6. Klicka på OK.

    Följande meddelande visas:
    x är 20
  7. Klicka på OK.
De värden som visas i meddelandena skiljer sig åt den andra gången eftersom variabeln x deklareras som en statisk variabel och variabeln behåller sitt värde efter första körningen av Makro1.

Obs! Om du har en variabel på modulnivå är dess livstid densamma som om den vore en statisk variabel på procedurnivå.

Gör så här för att granska livstiden för en variabel på modulnivå:
  1. Ändra koden i modulen som innehåller Makro1 till följande:
    Dim x As Integer  'skapa en variabel på modulnivå
    Sub Makro1()
       MsgBox "det initierade värdet för x är " & x
    x = x + 10
    MsgBox "x är " & x
    End Sub
    
  2. Kör Makro1.

    Följande meddelande visas:
    det initierade värdet på x är 0
  3. Klicka på OK.

    Följande meddelande visas:
    x är 10
  4. Klicka på OK.
  5. Kör Makro1.

    Följande meddelande visas:
    det initierade värdet på x är 10
  6. Klicka på OK.

    Följande meddelande visas:
    x är 20
  7. Klicka på OK.
De värden som visas i meddelandena skiljer sig åt den andra gången eftersom variabeln x deklareras som en statisk variabel och den behåller sitt värde efter första körningen av Makro1.

Återställa ett projekt för att återställa variabler

Om du vill återställa värdet för en statisk variabel eller en variabel på modulnivå, klickar du på Reset-knappen i Standard-verktygsfältet eller så klickar du på ResetRun-menyn.

Om du gör detta för Makro1-projektet och sedan kör Makro1 på nytt, initieras värdet för variabel x tillbaka till noll och det första meddelandet visas:
det initierade värdet på x är 0
Om du vill veta mer klickar du på artikelnumret nedan och läser artikeln i Microsoft Knowledge Base:
843145 Beskrivning av Excel-underprocedurer i Visual Basic for Applications (matriser) (Länken kan leda till en webbplats som är helt eller delvis på engelska)
Överst på sidan

Egenskaper

Artikel-id: 843144 - Senaste granskning: den 13 december 2006 - Revision: 2.0
Informationen i denna artikel gäller:
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
Nyckelord: 
kbvba kbprogramming kbinfo KB843144

Ge feedback

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com