|
||||
|
Disse websidene oppdateres ikke lengre og er kun tilgjengelig for historikken sin skyld. MatrisevariablerStatiske matrisevariablerI 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 matrisevariablerDynamiske 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 funksjonerNedenfor 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
|
![]() |
|||
| ||||