|
||||
Disse websidene oppdateres ikke lengre og er kun tilgjengelig for historikken sin skyld.Klikk her for å gå til den oppdaterte informasjonen. 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
|
||||
|