Du arbetar offline, väntar på att återansluta till Internet

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

Supporten för Office 2003 har upphört

Microsoft upphörde med supporten för Office 2003 den 8 april 2014. Denna ändring påverkar dina programuppdateringar och säkerhetsalternativ. Läs om vad detta innebär för dig och hur du behåller skyddet.

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

Överst på sidan
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.
Överst på sidan

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 Integerx = 10y = 100MsgBox "värdet på x är " & x & _Chr(13) & "värdet på y är " & yEnd 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.

Överst på sidan

Sammanfattning av datatyp

I följande tabell visas vanliga variabeldatatyper:

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

Överst på sidan

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, yx = "string"y = 1,23MsgBox "värdet på x är " & x & _Chr(13) & "värdet på y är " & yEnd 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

Överst på sidan

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.

Överst på sidan

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 Integerx = 10MsgBox "x som den tolkas i Makro1 är " & x'med nästa rad körs Makro2Makro2End SubSub Makro2()MsgBox "x som den tolkas i Makro2 är " & xEnd 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.

Överst på sidan

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 IntegerSub Makro_1a()x = 10MsgBox xMakro_1bEnd SubSub Makro_1b()x = x * 2MsgBox xMakro2End Sub
  5. Infoga yterligare en modul i projektet.
  6. Skriv följande kod i modulen:
    Sub Makro2()x = x * 3MsgBox xEnd 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.

Överst på sidan

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.

Överst på sidan

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.

Överst på sidan

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 " & xx = 10MsgBox "x är " & x'med nästa rad körs Makro2Makro2MsgBox "x är fortfarande " & xEnd SubSub Makro2()MsgBox "x som den tolkas i Makro2 är " & xEnd 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.

Överst på sidan

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 " & xx = x + 10MsgBox "x är " & xEnd 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 " & xx = x + 10MsgBox "x är " & xEnd 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.

Överst på sidan

Å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)
underprocedurer VBA variabler var
Egenskaper

Artikel-id: 843144 – senaste granskning 12/13/2006 03:34:37 – revision: 2.0

Microsoft Office Excel 2003, Microsoft Excel 2002 Standard Edition, Microsoft Excel 2000 Standard Edition, Microsoft Excel 97 Standard Edition

  • kbvba kbprogramming kbinfo KB843144
Feedback