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

Introduktion

I den här artikeln beskrivs hur du använder variabler i Underprocedurer för Microsoft Excel i Microsoft Visual Basic for Applications.

Mer information

Variabler i en underprocedur

En kraftfull funktion i programmeringsspråk är möjligheten att lagra något i en variabel så att innehållet i variabeln kan användas eller kan ändras senare i proceduren. I det här dokumentet beskrivs följande användning av variabler i Visual Basic:

  • Hur variabler deklareras.
  • Procedurerna och de projekt som kan använda variabeln.
  • Livslängden för en variabel.

Deklarera en variabel i ett makro

Det enklaste sättet att deklarera en variabel i ett makro är att använda dim-instruktionen. Följande rad förklarar två variabler, som heltal:

    Dim x As Integer, y As Integer

När x och y har angetts som heltal säger du till Visual Basic att reservera tillräckligt med minne för en heltalsvariabel (2 byte vardera för x och y) och att informationen som lagras i antingen x eller y är ett heltal mellan -32768 och 32767.

OBSERVERA: Om du deklarerar fler än en variabel med ett enda Dim-uttryck måste du ange datatypen för varje variabel.

Om du inte anger datatypen för varje variabel, som i följande Visual Basic-kod, konfigureras endast variabeln y som en heltalsvariabel. Variabeln x kommer att vara en varianttyp:

    Dim x, y As Integer

Mer information finns i Datatypen Variant nedan.
 

Gör så här om du vill utföra ett variabeltest:

  1. Spara och stäng alla öppna arbetsböcker och öppna sedan en ny arbetsbok.

  2. Starta 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 för x är " & x & _
        Chr(13) & "värdet på y är " & y
    End Sub

  5. Kör makrot Variable_Test . Du får följande meddelande:

    the value of x is 10
    the value of y is 100

  6. Klicka på OK.

  7. Ändra följande rad i Variable_Test makro:

    x = 10

  8. Att:

    x = "error"

  9. Kör makrot Variable_Test .

Du får ett körningsfel eftersom "fel" inte är ett heltal och du försöker tilldela strängvärdet till heltalsvariabeln x.
 

Sammanfattning av datatyp

Det här är de vanligaste variabla datatyperna:

vanliga datatyper

Variant-datatyp

Om du inte anger någon datatyp när du deklarerar en variabel, eller om du inte deklarerar en variabel alls, anger Visual Basic automatiskt variantdatatypen för den här variabeln. Följande är fördelarna med variabler som deklareras som den här datatypen:

  • Variablerna kan innehålla sträng, datum, tid, booleska eller numeriska värden.
  • Variablerna kan konvertera värdena som de innehåller automatiskt.

Nackdelen är att variantvariabler kräver minst 16 byte minne. 16 byte minne kan vara betydande i stora procedurer eller i komplexa moduler.

Gör så här om du vill se hur det fungerar i Variable_Test makrot:

Ändra koden i det Variable_Test makrot till:


Sub Variable_Test()
    Dim x, y
    x = "string"
    y = 1.23
    MsgBox "the value of x is " & x & _
    Chr(13) & "the value of y is " & y
End Sub

Kör makrot Variable_Test .

Du får inget felmeddelande eftersom du kan tilldela något till variantvariablerna x och y.

OBSERVERA: Du kan också utelämna följande rad och makrot fungerar fortfarande eftersom variablerna x och y behandlas som datatyper av typen Variant:

    Dim x, y

En variabels omfattning

När du deklarerar en variabel kanske den eller kanske inte syns av andra makron i samma modul, i andra moduler eller i andra projekt. Den här variabelns tillgänglighet i moduler kallas för omfattning. De tre typerna av omfattning är procedurnivå, privat modulnivå och offentlig modulnivå. Omfattningen beror på hur och var du deklarerar variabeln eller variablerna.

Omfattning på procedurnivå

En variabel med omfattning på procedurenivå visas inte utanför förfarandet där den deklareras. Om du anger värdet för en variabel med omfattning på procedurnivå visas inte variabelns innehåll i andra makron.

Så här kontrollerar du att en variabel med omfattning på procedurnivå inte visas utanför proceduren där den deklareras:

  1. Infoga en ny modul i projektet.

  2. Skriv båda följande makron i den här modulen:
      Sub Macro1() Dim x As Integer x = 10 MsgBox "x, as seen by Macro1 is " & x 'the next line runs Macro2 Macro2 End Sub Sub Macro2() MsgBox "x, as seen by Macro2 is " & x End Sub

  3. Kör Makro1 så visas följande meddelande:

    x, as seen by Macro1 is 10

  4. Klicka på OK så visas följande meddelande:

    x, as seen by Macro2 is

  5. Klicka på OK.

Makro2 visar inte ett värde för variabeln x eftersom variabeln x är lokal för Makro1.

Omfattning på privat och offentlig modulnivå

Du kan definiera variabler i deklarationsavsnittet i en modul (högst upp i en modul, framför allt underprocedurer), och ange variabelns omfattning med hjälp av den offentliga instruktionen, dim-instruktionen eller den privata instruktionen. Om du placerar den offentliga instruktionen framför variabeln är variabeln tillgänglig för alla makron i alla moduler i projektet. Om du placerar antingen uttrycket Dim eller Private framför variabeln är variabeln endast tillgänglig för makron i modulen där den deklareras.

Gör så här om du vill se skillnaden mellan den offentliga policyn och dim-instruktionen:

  1. Spara och stäng alla öppna arbetsböcker och öppna sedan en ny arbetsbok.

  2. Starta Visual Basic Editor.

  3. Infoga en modul i projektet.

  4. Type the following code into this module:
    
    Public x As Integer
    Sub Macro_1a()
         x = 10
         MsgBox x
         Macro_1b
    End Sub
    Sub Macro_1b()
         x = x * 2
         MsgBox x
         Macro2
    End Sub
    
  5. Infoga ytterligare en modul i projektet.

  6. Skriv in följande kod i den här modulen:
    Sub Macro2()
        x = x * 3
        MsgBox x
    End Sub

  7. Kör Macro_1a makro i den första modulen.

  8. Med variabeln x deklarerad som "Offentligt x som heltal" 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 meddelanderutan visas värdet 20 (eftersom x multipliceras med 2 i Macro_1b). I den tredje meddelanderutan visas värdet 60 (eftersom värdet på x har ändrats till 20 i Macro_1b och sedan multiplicerats med 3 i Makro2).

  9. Ändra deklarationsraden i den första modulen från:

       Public x As Integer

    Att:

       Dim x As Integer

  10. Kör makrot Macro_1a .

  11. Med variabeln x deklarerad som "Dim x As Integer" har bara makrona i den första modulen åtkomst till värdet av x. I den första meddelanderutan visas alltså värdet 10. I den andra meddelanderutan visas värdet 20 (eftersom x multipliceras med 2 i Macro_1b) och i den tredje meddelanderutan visas värdet 0 (eftersom Makro2 inte ser värdet för x och det oinitierade värdet på noll används av Makro 2).

  12. Ändra deklarationsraden i den första modulen från:

      Dim x As Integer

    Att:

        Private x As Integer

  13. Kör makrot Macro_1a .

  14. Samma meddelanderutor visas med den privata instruktionens omfattning som de använde dim-instruktionen. Variabeln x har samma omfattning, privat för modulen där den deklareras.

OBSERVERA: Om du vill att variabelns omfattning ska begränsas till modulen där den deklareras använder du privatestatement i stället för dim-instruktionen. Båda får samma effekt, men omfattningen blir tydligare när du läser koden om du använder den privata instruktionen.
 

Livslängd för en variabel

Den tid under vilken en variabel behåller sitt värde kallas dess livslängd. Värdet på en variabel kan ändras under dess livslängd, men det behåller ett värde. När en variabel förlorar sin omfattning har den inte längre något värde.
 

Initiera värdet för en variabel

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

Variabler på procedurnivå

Om du har en variabel som deklareras i ett makro med hjälp av dim-instruktionen behåller variabeln sitt värde så länge makrot körs. Om det här makrot anropar andra makron behålls variabelns värde (inte tillgängligt för de andra makrona dock) så länge dessa andra makron också körs.

Så här visar du hur variabler på procedurnivå fungerar:

  1. Infoga en ny modul i projektet.

  2. Skriv båda följande makron i den här modulen:

    Sub Macro1()
        'set x as a procedure level variable
       Dim x As Heltal
       MsgBox "det initierade värdet av x är " & x
       x = 10
        MsgBox "x is " & x
        Nästa rad kör Macro2
        Makro2
        MsgBox "x is still " & x
    End Sub
    Sub Macro2()
        MsgBox "x, som ses av Macro2 är " & x
    End Sub

  3. Kör Makro1.

  4. Du får följande meddelande:

        the initialized value of x is 0

  5. Klicka på OK så visas meddelandet:

     x is 10

  6. Klicka på OK så visas följande meddelande:

    x, as seen by Macro2 is

  7. Klicka på OK.

  8. Makro2 visar inte ett värde för variabeln x eftersom variabeln x är lokal för Makro1. Du får följande meddelande:

    x is still 10

  9. Klicka på OK.

  10. Kör Makro1.

Du får samma meddelanden som beskrivs i steg 3 till 6 eftersom värdet på variabeln x gick förlorat så fort Macro1 slutade köras i steg 6. När du kör Makro1 igen i steg 7 visar därför det första meddelandet värdet på x som noll (det initierade värdet).

Statiskt nyckelord

Om en variabel på procedurnivå deklareras med nyckelordet Statisk behåller variabeln sitt värde tills projektet har återställts. Om du har en statisk variabel initieras därför den statiska variabeln till dess sista värde nästa gång du anropar proceduren.

Gör så här om du vill se hur nyckelordet Statisk fungerar:

1.

Change the code in Macro1 to:

Sub Macro1()
    'set x as a procedure level variable
    Static x As Integer
       MsgBox "the initialized value of x is " & x
    x = x + 10
    MsgBox "x is " & x
End Sub
  1. Kör Makro1.

  2. Du får meddelandet:

    the initialized value of x is 0

  3. Klicka på OK så visas meddelandet:

    x is 10

  4. Klicka på OK.

  5. Kör Makro1 så visas följande meddelande:

    the initialized value of x is 10

  6. Klicka på OK så visas följande meddelande:

    x is 20

  7. Klicka på OK.

Värdena som visas i meddelandena skiljer sig andra gången eftersom variabeln x deklareras som en statisk variabel och variabeln behåller sitt värde när du kör Makro1 första gången.

OBSERVERA: Om du har en variabel på modulnivå är dess livslängd densamma som om den vore en statisk variabel på procedurnivå.

Så här verifierar du livslängden för en variabel på modulnivå:

1.

Change the code in the module that contains Macro1 to the following:

Dim x As Integer  'create a module-level variable
Sub Macro1()
   MsgBox "the initialized value of x is " & x
   x = x + 10
   MsgBox "x is " & x
End Sub
  1. Kör Makro1 så visas följande meddelande:

    the initialized value of x is 0

  2. Klicka på OK så visas följande meddelande:

    x is 10

  3. Klicka på OK,

  4. Kör Makro1 så visas följande meddelande:

    the initialized value of x is 10

  5. Klicka på OK.

  6. Du får följande meddelande:

    x is 20

  7. Klicka på OK.

Värdena som visas i meddelandena skiljer sig andra gången eftersom variabeln x deklareras som en statisk variabel och behåller sitt värde när du kör Makro1 första gången.
 

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

Om du vill återställa värdet för en statisk variabel eller för en variabel på modulnivå klickar du på knappen Återställ
Standardverktygsfältet eller klicka på Återställ på menyn Kör .

Om du gör detta för Macro1-projektet och sedan kör Makro1 igen initieras värdet för variabeln x tillbaka till noll och du får det första meddelandet:

    the initialized value of x is 0