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.

Binær filtilgang (binary access)

Ved hjelp av binær tilgang er det mulig å lagre informasjon på akkurat den måten du selv ønsker, du er ikke avhengig av å benytte en fast postlengde på den informasjonen du lagrer. Dette betyr igjen at du må vite hvordan informasjonen er lagret for å kunne lese innholdet i en binær fil på en fornuftig måte. Filer laget for binær tilgang benytter minst lagringsplass siden man kan benytte poster av forskjellig størrelse. Man kan også lese og skrive informasjon samtidigi slik man kan med tilfeldig tilgang.

Postene i en binær fil kan være av en variable størrelse. Dette kan man oppnå ved å benytte en brukerdefinert datatype. Brukerdefinerte datatyper defineres i modulens deklarasjonsdel (på toppen av modulen) på denne måten:

Type MyBinaryRecordInfo
    ID As String ' variabel lengde
    LastName As String ' variabel lengde
    FirstName As String ' variabel lengde
    BirthDate As Date ' fast lengde
End Type

For å åpne en fil for binær tilgang fra VBA benyttes følgende syntaks:
Open filename For Binary As filenumber
Det er ikke nødvendig å spesifisere Buffersize, dette argumentet ignoreres for binære filer.
Du må lukke alle filer som åpnes før du åpner filen på nytt med en annen tilgangstype.

Siden postene i en binær fil kan være av variabel lengde må man lagre informasjon om størrelsen på hvert av de variable feltene i posten slik at informasjonen kan leses senere. En enkel måte å gjøre dette på er å lagre et heltall som indikerer størrelsen på de variable feltene i posten. Makroene nedenfor viser hvordan man kan lagre informasjon i en binær fil ved hjelp av den brukerdefinerte datatypen MyBinRecordInfo som er definert ovenfor:

Sub WriteBinaryFile()
Dim MyRecord As MyBinaryRecordInfo, f As Integer, i As Integer
    If Len(Dir("C:\FOLDERNAME\BINFILE.DAT")) > 0 Then
        ' sletter filen dersom den finnes
        Kill "C:\FOLDERNAME\BINFILE.DAT"
    End If
    f = FreeFile ' neste ledige filnummer
    ' oppretter den nye filen
    Open "C:\FOLDERNAME\BINFILE.DAT" For Binary As #f
    ' skriver innhold til den binære filen
    For i = 1 To 100
        With MyRecord
            .ID = RandomLengthString(10, 3) ' bare en dummy
            .LastName = "LastName" & i
            .FirstName = "FirstName" & i
            .BirthDate = Date - i
        End With
        WriteBinaryRecord MyRecord, f ' lagrer informasjonen
    Next i
    Close #f ' lukker filen
End Sub

Sub WriteBinaryRecord(MyRecord As MyBinaryRecordInfo, f As Integer)
' skriver innholdet i MyRecord til en åpnet binær fil
Dim intSize As Integer
    With MyRecord
        intSize = Len(.ID) ' bestemmer lengden av innholdet i variabelen
        Put f, , intSize ' lagrer lengden av variabelen
        Put f, , .ID ' lagrer innholdet i variabelen
        
        intSize = Len(.LastName) ' bestemmer lengden av innholdet i variabelen
        Put f, , intSize ' lagrer lengden av variabelen
        Put f, , .LastName ' lagrer innholdet i variabelen
        
        intSize = Len(.FirstName) ' bestemmer lengden av innholdet i variabelen
        Put f, , intSize ' lagrer lengden av variabelen
        Put f, , .FirstName ' lagrer innholdet i variabelen
        
        Put f, , .BirthDate ' lagrer innholdet i variabelen (fast lengde variabel)
    End With
End Sub

Private Function RandomLengthString(Optional lngMax As Long = 100, Optional lngMin As Long = 1) As String
Dim i As Long, j As Long, c As Integer, strResult As String
' returnerer en tilfeldig tekst med tilfeldig lengde, har ingen praktisk betydning utenom dette eksempelet
    Randomize
    j = Int(Rnd * (lngMax - lngMin + 1) + lngMin)
    strResult = vbNullString
    For i = 1 To j
        c = Int(Rnd * (122 - 97 + 1) + 97)
        strResult = strResult & Chr(c)
    Next i
    RandomLengthString = strResult
End Function

Fra eksempelmakroen ovenfor kan man se at en binær fil trenger mer kode for å håndtere lesing og skriving enn det som kreves for en fil åpnet for tilfeldig tilgang som kan lese og skrive hele poster ved hjelp av ett enkelt funksjonkall.

For å lese informasjon fra en binær fil benytter man Get. Når man leser informasjon med Get sammen med en variabel av variabel lengde, vil antall bytes som leses fra filen være likt med lengden på den variabelen som benyttes sammen med Get. For å midlertidig angi en lengde til en variabel benyttes String$ funksjonen. String$ funksjonen kan angi lengden til en variabel til et bestemt antall mellomromstegn (eller et annet tegn). Makroen nedenfor viser hvordan man kan lese informasjon fra en binær fil:

Sub ReadBinaryFile()
Dim MyRecord As MyBinaryRecordInfo, f As Integer, i As Long
    f = FreeFile ' neste ledige filnummer
    ' åpner den binære filen
    Open "C:\FOLDERNAME\BINFILE.DAT" For Binary As #f
    ' leser informasjon fra den binære filen
    i = 0
    Do While Loc(f) < LOF(f)
        i = i + 1
        ReadBinaryRecord MyRecord, f
        ' gjør et eller annet med informasjonen
        With MyRecord
            Debug.Print "Record #" & i, .ID, .LastName, .FirstName, .BirthDate
        End With
    Loop
    Close #f ' lukker filen
End Sub

Sub ReadBinaryRecord(MyRecord As MyBinaryRecordInfo, f As Integer)
' leser neste record fra en binær fil
Dim intSize As Integer
    With MyRecord
        Get f, , intSize ' les lengden på variabelen
        .ID = String(intSize, " ") ' sett lengden på variabelen
        Get f, , .ID ' les informasjon til variabelen
        
        Get f, , intSize ' les lengden på variabelen
        .LastName = String(intSize, " ") ' sett lengden på variabelen
        Get f, , .LastName ' les informasjon til variabelen
        
        Get f, , intSize ' les lengden på variabelen
        .FirstName = String(intSize, " ") ' sett lengden på variabelen
        Get f, , .FirstName ' les informasjon til variabelen
        
        Get f, , .BirthDate ' les informasjon til variabelen (fast lengde variabel)
    End With
End Sub

 

Dokumentet er sist oppdatert 1999-12-17 12:33:11      Utskriftsvennlig versjon

 

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