|
||||
These pages are no longer updated and are only available for archive purposes.Click here to visit the pages with updated information. Using binary file accessWith binary access it's possible to store information in any way you want, you are not limitied to a fixed record length. This means that you have to know how the information is stored in a binary file to retrieve it again. Binary access files uses less diskspace by allowing variable sized records. You can also read and write information at the same time like a random access file. In a binary file each record can be of variable size. This is achieved by using an user-defined data type. User defined data types are defined in a the declaration section of a module (at the beginning of a module) like this: Type MyBinaryRecordInfo ID As String ' variable length LastName As String ' variable length FirstName As String ' variable length BirthDate As Date ' fixed length End Type To open a file for binary access from VBA you use the Open statement: Since records with binary access can be of variable length, it is necessary to store information about the size of each field in the record so that the information can be read later. A good way to do this is to store an integer with each string to indicate the length of the string. The macros below shows how to create a new binary file using records of the userdefined type MyBinaryRecordInfo defined above: Sub WriteBinaryFile() Dim MyRecord As MyBinaryRecordInfo, f As Integer, i As Integer If Len(Dir("C:\FOLDERNAME\BINFILE.DAT")) > 0 Then ' deletes the file if it exists Kill "C:\FOLDERNAME\BINFILE.DAT" End If f = FreeFile ' next free filenumber ' create the new file Open "C:\FOLDERNAME\BINFILE.DAT" For Binary As #f ' write records to the binary file For i = 1 To 100 With MyRecord .ID = RandomLengthString(10, 3) ' just a dummy .LastName = "LastName" & i .FirstName = "FirstName" & i .BirthDate = Date - i End With WriteBinaryRecord MyRecord, f ' save the record Next i Close #f ' close the file End Sub Sub WriteBinaryRecord(MyRecord As MyBinaryRecordInfo, f As Integer) ' writes the content of MyRecord to the binary file Dim intSize As Integer With MyRecord intSize = Len(.ID) ' determine the length of the variable Put f, , intSize ' write the length of the variable Put f, , .ID ' write the variable intSize = Len(.LastName) ' determine the length of the variable Put f, , intSize ' write the length of the variable Put f, , .LastName ' write the variable intSize = Len(.FirstName) ' determine the length of the variable Put f, , intSize ' write the length of the variable Put f, , .FirstName ' write the variable Put f, , .BirthDate ' write the variable (fixed length variable) 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 ' returns a random string of random length, the function has no practical use outside this example 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 From the example macros above you can see that a binary access file requires more code to handle the read and write operations than a random access file that can read and write an entire record using a single function call. To read information from a binary file you use the Get statement. Sub ReadBinaryFile() Dim MyRecord As MyBinaryRecordInfo, f As Integer, i As Long f = FreeFile ' next free filenumber ' open the binary file Open "C:\FOLDERNAME\BINFILE.DAT" For Binary As #f ' read records from the binary file i = 0 Do While Loc(f) < LOF(f) i = i + 1 ReadBinaryRecord MyRecord, f ' do something with the input With MyRecord Debug.Print "Record #" & i, .ID, .LastName, .FirstName, .BirthDate End With Loop Close #f ' close the file End Sub Sub ReadBinaryRecord(MyRecord As MyBinaryRecordInfo, f As Integer) ' reads the next record from an open binary file Dim intSize As Integer With MyRecord Get f, , intSize ' read the size of the ID field .ID = String(intSize, " ") ' set the variable length Get f, , .ID ' read the variable string field Get f, , intSize ' read the size of the LastName field .LastName = String(intSize, " ") ' set the variable length Get f, , .LastName ' read the variable string field Get f, , intSize ' read the size of the FirstName field .FirstName = String(intSize, " ") ' set the variable length Get f, , .FirstName ' read the variable string field Get f, , .BirthDate ' read the BirtDate field (fixed length variable) End With End Sub
Document last updated 1999-12-17 12:48:50
|
||||
|