ERLANDSEN DATA CONSULTING Excel & VBA Tips   Information in English / Informasjon på engelsk

Disse websidene oppdateres ikke lengre og er kun tilgjengelig for historikken sin skyld.

Klikk her for å gå til den oppdaterte informasjonen.

Matrisevariabler

Statiske matrisevariabler

I stedet for å benytte flere enkeltvariabler til å lagre informasjon, kan du benytte en matrisevariabel. Når du vet hvor mange elementer du trenger å lagre i matrisevariabelen kan du benytte en statisk (eller vanlig) matrisevariabel på følgende måte:

Sub TestStatiskMatrise()
' lagrer 5 regnearknavn i matrisevariabelen Navn()
Dim Navn(1 to 5) As String ' deklarerer en statisk matrisevariabel
Dim iCount As Integer
    For iCount = 1 To 5
        Navn(iCount) = ThisWorkbook.Worksheets(iCount).Name
    Next iCount
    For iCount = 1 To 5
        MsgBox "Navn(" & iCount & ") = " & Navn(iCount)
    Next iCount
    Erase Navn() ' sletter variablen, frigjør minnet
End Sub

Dynamiske matrisevariabler

Dynamiske matrisevariabler er nyttige når du ikke vet på forhånd hvor mange elementer som skal lagres. Du deklarerer dynamiske variabler på samme måte som statiske, bortsett fra at du ikke oppgir størrelsen. Her er et eksempel:

Sub TestDynamiskMatrise()
Dim Navn() As String ' deklarerer en dynamisk matrisevariabel
Dim iCount As Integer
Dim Max As Integer
    Max = ThisWorkbook.Worksheets.Count ' finner maksimal størrelse på matrisen
    ReDim Navn(1 to Max) ' deklarerer matrisevariabelen med den nødvendige størrelsen.
    For iCount = 1 To Max
        Navn(iCount) = ThisWorkbook.Worksheets(iCount).Name
    Next iCount
    ' den neste linjen er nyttig dersom man ikke kjenner til 
    ' øvre eller nedre grense for matrisevariabelen
    For iCount = LBound(Navn) To UBound(Navn)
        MsgBox "Navn(" & iCount & ") = " & Navn(iCount)
    Next iCount
    Erase Navn() ' sletter variablen, frigjør minnet
End Sub

Dersom du vet at du maksimal størrelse på matrisevariablen er 1000, kan du bruke en statisk matrisevariabel. Ulempen er at du alltid vil bruke minne for 1000 variabler, også i de tilfellene du bare trenger 10. Dersom du bruker en dynamisk matrisevariabel bruker du minnet mer effektivt.

Noen ganger kan man ikke på forhånd beregne hvor stor matrisevariablen skal være. Da må man øke størrelsen på variabelen etter hvert som det trengs. Når du benytter ReDim-setningen for å endre størrelsen på matrisevariabelen nullstilles også innholdet i variabelen. For å unngå at variabelen nullstilles må du benytte ReDim Preserve-setningen. Her er et eksempel:

Sub HentFilnavn()
' henter alle filnavnene i den aktive mappen
Dim FilNavn() As String ' deklarerer en dynamisk variabel
Dim tmp As String, fCount As Integer
    fCount = 0
    tmp = Dir("*.*")
    Do While tmp <> Empty
        fCount = fCount + 1
        ReDim Preserve FilNavn(1 to fCount) 
        ' deklarerer matrisevariabelen på nytt
        FilNavn(fCount) = tmp
        tmp = Dir
    Loop
    For fCount = LBound(FolderFiles) To UBound(FolderFiles)
        Debug.Print "Filnavn #" & fCount, FolderFiles(fCount)
    Next fCount
    MsgBox fCount & " filnavn er funnet i " & CurDir
    Erase FilNavn ' sletter variabelen, frigjør minnet
End Sub

Sende matrisevariabler til prosedyrer og funksjoner

Nedenfor finner du noen eksempler på hvordan du kan sende matrisevariabler til prosedyrer og funksjoner:

Sub PassingArraysToFunctionsAndProcedures()
Dim arrVariantArray As Variant ' kan lagre tall og tekst
Dim arrNumericArray(0 To 9) As Long ' kan kun lagre tall
Dim arrDynamicArray() As Long ' kan kun lagre tall
Dim i As Long
    ' fyll en variant-variabel med matrisedata
    arrVariantArray = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, "one", "two", "three")
    i = AddVariantArrayItems(arrVariantArray)
    MsgBox "Variant Array Items Sum: " & i, vbInformation, "Før oppdatering"
    
    ' send variabelen til en prosedyre uten at innholdet endres
    NonValueChangingProcedure arrVariantArray
    i = AddVariantArrayItems(arrVariantArray)
    MsgBox "Variant Array Items Sum: " & i, vbInformation, "Etterpå (ingen endring)"
    
    ' fyll en numerisk matrisevariabel
    For i = LBound(arrNumericArray) To UBound(arrNumericArray)
        arrNumericArray(i) = i * 10
    Next i
    i = AddVariantArrayItems(arrNumericArray)
    MsgBox "Numeric Array Items Sum: " & i, vbInformation
    
    ' fyll en dynamisk numerisk matrisevariabel
    ReDim arrDynamicArray(0 To 100)
    For i = LBound(arrDynamicArray) To UBound(arrDynamicArray)
        arrDynamicArray(i) = i * 10
    Next i
    i = AddVariantArrayItems(arrDynamicArray)
    MsgBox "Dynamic Numeric Array Items Sum: " & i, vbInformation, "Før oppdatering"
    
    ValueChangingProcedure arrDynamicArray
    i = AddVariantArrayItems(arrDynamicArray)
    MsgBox "Dynamic Numeric Array Items Sum: " & i, vbInformation, "Etterpå (ny sum)"
    
End Sub

Function AddVariantArrayItems(arrItems As Variant) As Long
Dim i As Long, lngSum As Long
    If IsArray(arrItems) Then
        For i = LBound(arrItems) To UBound(arrItems)
            On Error Resume Next ' ignorer feil ved ikke-numeriske data
            lngSum = lngSum + arrItems(i)
            On Error GoTo 0
        Next i
    End If
    AddVariantArrayItems = lngSum
End Function

Function AddNumericArrayItems(arrInput() As Long) As Long
Dim i As Long, lngSum As Long
    For i = LBound(arrInput) To UBound(arrInput)
        lngSum = lngSum + arrInput(i)
    Next i
    AddNumericArrayItems = lngSum
End Function

Sub ValueChangingProcedure(arrInput() As Long) 
' matrisevariabler må sendes ByRef (default i VBA)
Dim i As Long
    For i = LBound(arrInput) To UBound(arrInput)
        arrInput(i) = arrInput(i) + 1
    Next i
End Sub

Sub NonValueChangingProcedure(ByVal arrInput As Variant) 
' variant variabler (inkludert matriser) kan sendes ByVal eller ByRef
Dim i As Long
    If IsArray(arrInput) Then
        For i = LBound(arrInput) To UBound(arrInput)
            On Error Resume Next ' ignorer feil ved ikke-numeriske data
            arrInput(i) = arrInput(i) + 1
            On Error GoTo 0
        Next i
    End If
End Sub

 

Dokumentet er sist oppdatert 2006-07-31 21:06:49      Utskriftsvennlig versjon

 

Erlandsen Data Consulting     http://www.erlandsendata.no/   
Excel & VBA Tips   Copyright ©1999-2017    Ole P. Erlandsen   All rights reserved
E-post kontaktadresse