How to create an excel file without using Microsoft Excel
Posted on January 4, 2009
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 | 'MS Office - How to create an excel file without using Microsoft Excel Option Explicit Private Sub cmdCreate_Click() Dim myExcelFile As New ExcelFile With myExcelFile 'Create the new spreadsheet FileName$ = ".\vbtest.xls" 'create spreadsheet in the current directory .CreateFile FileName$ 'set a Password for the file. If set, the rest of the spreadsheet will 'be encrypted. If a password is used it must immediately follow the 'CreateFile method. 'This is different then protecting the spreadsheet (see below). 'NOTE: For some reason this function does not work. Excel will 'recognize that the file is password protected, but entering the password 'will not work. Also, the file is not encrypted. Therefore, do not use 'this function until I can figure out why it doesn't work. There is not 'much documentation on this function available. '.SetFilePassword "Test" 'specify whether to print the gridlines or not 'this should come before the setting of fonts and margins .PrintGridLines = False 'it is a good idea to set margins, fonts and column widths 'prior to writing any text/numerics to the spreadsheet. These 'should come before setting the fonts. .SetMargin xlsTopMargin, 1.5 'set to 1.5 inches .SetMargin xlsLeftMargin, 1.5 .SetMargin xlsRightMargin, 1.5 .SetMargin xlsBottomMargin, 1.5 'to insert a Horizontal Page Break you need to specify the row just 'after where you want the page break to occur. You can insert as many 'page breaks as you wish (in any order). .InsertHorizPageBreak 10 .InsertHorizPageBreak 20 'Up to 4 fonts can be specified for the spreadsheet. This is a 'limitation of the Excel 2.1 format. For each value written to the 'spreadsheet you can specify which font to use. .SetFont "Arial", 10, xlsNoFormat 'font0 .SetFont "Arial", 10, xlsBold 'font1 .SetFont "Arial", 10, xlsBold + xlsUnderline 'font2 .SetFont "Courier", 12, xlsItalic 'font3 'Column widths are specified in Excel as 1/256th of a character. .SetColumnWidth 1, 5, 18 'set any header or footer that you want to print on 'every page. This text will be centered at the top and/or 'bottom of each page. The font will always be the font that 'is specified as font0, therefore you should only set the 'header/footer after specifying the fonts through SetFont. .SetHeader "This is the header" .SetFooter "This is the footer" 'write some data to the spreadsheet 'Use the default format #3 "#,##0" (refer to the WriteDefaultFormats function) 'The WriteDefaultFormats function is compliments of Dieter Hauk in Germany. .WriteValue xlsInteger, xlsFont0, xlsLeftAlign, xlsNormal, 6, 1, 2000, 3 'write a cell with a shaded number with a bottom border .WriteValue xlsnumber, xlsFont1, xlsrightAlign + xlsBottomBorder + xlsShaded, _ xlsNormal, 7, 1, 12123.456, 4 'write a normal left aligned string using font2 (bold & underline) .WriteValue xlsText, xlsFont2, xlsLeftAlign, xlsNormal, 8, 1, "This is a test string" 'write a locked cell. The cell will not be able to be overwritten, BUT you 'must set the sheet PROTECTION to on before it will take effect!!! .WriteValue xlsText, xlsFont3, xlsLeftAlign, xlsLocked, 9, 1, "This cell is locked" 'fill the cell with "F"'s .WriteValue xlsText, xlsFont0, xlsFillCell, xlsNormal, 10, 1, "F" 'write a hidden cell to the spreadsheet. This only works for cells 'that contain formulae. Text, Number, Integer value text can not be hidden 'using this feature. It is included here for the sake of completeness. .WriteValue xlsText, xlsFont0, xlsCentreAlign, xlsHidden, 11, 1, _ "If this were a formula it would be hidden!" 'PROTECT the spreadsheet so any cells specified as LOCKED will not be 'overwritten. Also, all cells with HIDDEN set will hide their formulae. 'PROTECT does not use a password. .ProtectSpreadsheet = True 'Finally, close the spreadsheet .CloseFile MsgBox "Excel BIFF Spreadsheet created." & vbCrLf & "Filename: " & FileName$, _ vbInformation + vbOKOnly, "Excel Class" End With End Sub Private Sub cmdCancel_Click() Unload Me End Sub Private Sub Form_Load() ChDir App.Path End Sub 'Code in Class file: 'Class file for writing Microsoft Excel BIFF 2.1 files. 'This class is intended for users who do not want to use the huge Jet or ADO 'providers if they only want to export their data to an Excel compatible file. 'Newer versions of Excel use the OLE Structure Storage methods which are quite 'complicated. 'the memory copy API is used in the MKI$ function which converts an integer 'value to a 2-byte string value to write to the file. (used by the Horizontal 'Page Break function). Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (lpvDest As Any, _ lpvSource As Any, ByVal cbCopy As Long) 'enum to handle the various types of values that can be written to the excel file. Public Enum ValueTypes xlsInteger = 0 xlsnumber = 1 xlsText = 2 End Enum 'enum to hold cell alignment Public Enum CellAlignment xlsGeneralAlign = 0 xlsLeftAlign = 1 xlsCentreAlign = 2 xlsrightAlign = 3 xlsFillCell = 4 xlsLeftBorder = 8 xlsRightBorder = 16 xlsTopBorder = 32 xlsBottomBorder = 64 xlsShaded = 128 End Enum 'enum to handle selecting the font for the cell Public Enum CellFont 'used by rgbAttr2 'bits 0-5 handle the *picture* formatting, not bold/underline etc... 'bits 6-7 handle the font number xlsFont0 = 0 xlsFont1 = 64 xlsFont2 = 128 xlsFont3 = 192 End Enum Public Enum CellHiddenLocked 'used by rgbAttr1 'bits 0-5 must be zero 'bit 6 locked/unlocked 'bit 7 hidden/not hidden xlsNormal = 0 xlsLocked = 64 xlsHidden = 128 End Enum 'set up variables to hold the spreadsheet's layout Public Enum MarginTypes xlsLeftMargin = 38 xlsRightMargin = 39 xlsTopMargin = 40 xlsBottomMargin = 41 End Enum Public Enum FontFormatting 'add these enums together. For example: xlsBold + xlsUnderline xlsNoFormat = 0 xlsBold = 1 xlsItalic = 2 xlsUnderline = 4 xlsStrikeout = 8 End Enum Private Type FONT_RECORD opcode As Integer '49 length As Integer '5+len(fontname) FontHeight As Integer 'bit0 bold, bit1 italic, bit2 underline, bit3 strikeout, bit4-7 reserved FontAttributes1 As Byte FontAttributes2 As Byte 'reserved - always 0 FontNameLength As Byte End Type Private Type PASSWORD_RECORD opcode As Integer '47 length As Integer 'len(password) End Type Private Type HEADER_FOOTER_RECORD opcode As Integer '20 Header, 21 Footer length As Integer '1+len(text) TextLength As Byte End Type Private Type PROTECT_SPREADSHEET_RECORD opcode As Integer '18 length As Integer '2 Protect As Integer End Type Private Type FORMAT_COUNT_RECORD opcode As Integer '1f length As Integer '2 Count As Integer End Type Private Type FORMAT_RECORD opcode As Integer '1e length As Integer '1+len(format) FormatLenght As Byte 'len(format) End Type '+ followed by the Format-Picture Private Type COLWIDTH_RECORD opcode As Integer '36 length As Integer '4 col1 As Byte 'first column col2 As Byte 'last column ColumnWidth As Integer 'at 1/256th of a character End Type 'Beginning Of File record Private Type BEG_FILE_RECORD opcode As Integer length As Integer version As Integer ftype As Integer End Type 'End Of File record Private Type END_FILE_RECORD opcode As Integer length As Integer End Type 'true/false to print gridlines Private Type PRINT_GRIDLINES_RECORD opcode As Integer length As Integer PrintFlag As Integer End Type 'Integer record Private Type tInteger opcode As Integer length As Integer row As Integer 'unsigned integer col As Integer 'rgbAttr1 handles whether cell is hidden and/or locked rgbAttr1 As Byte 'rgbAttr2 handles the Font# and Formatting assigned to this cell rgbAttr2 As Byte 'rgbAttr3 handles the Cell Alignment/borders/shading rgbAttr3 As Byte intValue As Integer 'the actual integer value End Type 'Number record Private Type tNumber opcode As Integer length As Integer row As Integer col As Integer rgbAttr1 As Byte rgbAttr2 As Byte rgbAttr3 As Byte NumberValue As Double '8 Bytes End Type 'Label (Text) record Private Type tText opcode As Integer length As Integer row As Integer col As Integer rgbAttr1 As Byte rgbAttr2 As Byte rgbAttr3 As Byte TextLength As Byte End Type Private Type MARGIN_RECORD_LAYOUT opcode As Integer length As Integer MarginValue As Double '8 bytes End Type Private Type HPAGE_BREAK_RECORD opcode As Integer length As Integer NumPageBreaks As Integer End Type Private FileNumber As Integer Private BEG_FILE_MARKER As BEG_FILE_RECORD Private END_FILE_MARKER As END_FILE_RECORD Private HORIZ_PAGE_BREAK As HPAGE_BREAK_RECORD 'create an array that will hold the rows where a horizontal page 'break will be inserted just before. Private HorizPageBreakRows() As Integer Private NumHorizPageBreaks As Integer Public Function CreateFile(ByVal FileName As String) As Integer On Error GoTo Write_Error If Dir$(FileName) > "" Then Kill FileName End If FileNumber = FreeFile Open FileName For Binary As #FileNumber Put #FileNumber, , BEG_FILE_MARKER 'must always be written first Call WriteDefaultFormats 'create the Horizontal Page Break array ReDim HorizPageBreakRows(0) NumHorizPageBreaks = 0 OpenFile = 0 'return with no error Exit Function Write_Error: OpenFile = Err.Number Exit Function End Function Public Function CloseFile() As Integer On Error GoTo Write_Error If FileNumber = 0 Then Exit Function 'write the horizontal page breaks if necessary If NumHorizPageBreaks > 0 Then 'the Horizontal Page Break array must be in sorted order. 'Use a simple Bubble sort because the size of this array would 'be pretty small most of the time. A QuickSort would probably 'be overkill. Dim lLoop1 As Long Dim lLoop2 As Long Dim lTemp As Long For lLoop1 = UBound(HorizPageBreakRows) To LBound(HorizPageBreakRows) Step -1 For lLoop2 = LBound(HorizPageBreakRows) + 1 To lLoop1 If HorizPageBreakRows(lLoop2 - 1) > HorizPageBreakRows(lLoop2) Then lTemp = HorizPageBreakRows(lLoop2 - 1) HorizPageBreakRows(lLoop2 - 1) = HorizPageBreakRows(lLoop2) HorizPageBreakRows(lLoop2) = lTemp End If Next lLoop2 Next lLoop1 'write the Horizontal Page Break Record With HORIZ_PAGE_BREAK .opcode = 27 .length = 2 + (NumHorizPageBreaks * 2) .NumPageBreaks = NumHorizPageBreaks End With Put #FileNumber, , HORIZ_PAGE_BREAK 'now write the actual page break values 'the MKI$ function is standard in other versions of BASIC but 'VisualBasic does not have it. A KnowledgeBase article explains 'how to recreate it (albeit using 16-bit API, I switched it 'to 32-bit). For x% = 1 To UBound(HorizPageBreakRows) Put #FileNumber, , MKI$(HorizPageBreakRows(x%)) Next End If Put #FileNumber, , END_FILE_MARKER Close #FileNumber CloseFile = 0 'return with no error code Exit Function Write_Error: CloseFile = Err.Number Exit Function End Function Private Sub Class_Initialize() 'Set up default values for records 'These should be the values that are the same for every record of these types With BEG_FILE_MARKER 'beginning of file .opcode = 9 .length = 4 .version = 2 .ftype = 10 End With With END_FILE_MARKER 'end of file marker .opcode = 10 End With End Sub Public Function InsertHorizPageBreak(lrow As Long) As Integer On Error GoTo Page_Break_Error 'the row and column values are written to the excel file as 'unsigned integers. Therefore, must convert the longs to integer. If lrow > 32767 Then row% = CInt(lrow - 65536) - 1 'rows/cols in Excel binary file are zero based Else row% = CInt(lrow) - 1 End If NumHorizPageBreaks = NumHorizPageBreaks + 1 ReDim Preserve HorizPageBreakRows(NumHorizPageBreaks) HorizPageBreakRows(NumHorizPageBreaks) = row% Exit Function Page_Break_Error: InsertHorizPageBreak = Err.Number Exit Function End Function Public Function WriteValue(ValueType As ValueTypes, CellFontUsed As CellFont, _ Alignment As CellAlignment, HiddenLocked As CellHiddenLocked, lrow As Long, _ lcol As Long, value As Variant, Optional CellFormat As Long = 0) As Integer On Error GoTo Write_Error 'the row and column values are written to the excel file as 'unsigned integers. Therefore, must convert the longs to integer. If lrow > 32767 Then row% = CInt(lrow - 65536) - 1 'rows/cols in Excel binary file are zero based Else row% = CInt(lrow) - 1 End If If lcol > 32767 Then col% = CInt(lcol - 65536) - 1 'rows/cols in Excel binary file are zero based Else col% = CInt(lcol) - 1 End If Select Case ValueType Case ValueTypes.xlsInteger Dim INTEGER_RECORD As tInteger With INTEGER_RECORD .opcode = 2 .length = 9 .row = row% .col = col% .rgbAttr1 = CByte(HiddenLocked) .rgbAttr2 = CByte(CellFontUsed + CellFormat) .rgbAttr3 = CByte(Alignment) .intValue = CInt(value) End With Put #FileNumber, , INTEGER_RECORD Case ValueTypes.xlsnumber Dim NUMBER_RECORD As tNumber With NUMBER_RECORD .opcode = 3 .length = 15 .row = row% .col = col% .rgbAttr1 = CByte(HiddenLocked) .rgbAttr2 = CByte(CellFontUsed + CellFormat) .rgbAttr3 = CByte(Alignment) .NumberValue = CDbl(value) End With Put #FileNumber, , NUMBER_RECORD Case ValueTypes.xlsText Dim b As Byte st$ = CStr(value) l% = Len(st$) Dim TEXT_RECORD As tText With TEXT_RECORD .opcode = 4 .length = 10 'Length of the text portion of the record .TextLength = l% 'Total length of the record .length = 8 + l .row = row% .col = col% .rgbAttr1 = CByte(HiddenLocked) .rgbAttr2 = CByte(CellFontUsed + CellFormat) .rgbAttr3 = CByte(Alignment) 'Put record header Put #FileNumber, , TEXT_RECORD 'Then the actual string data For a = 1 To l% b = Asc(Mid$(st$, a, 1)) Put #FileNumber, , b Next End With End Select WriteValue = 0 'return with no error Exit Function Write_Error: WriteValue = Err.Number Exit Function End Function Public Function SetMargin(Margin As MarginTypes, MarginValue As Double) As Integer On Error GoTo Write_Error 'write the spreadsheet's layout information (in inches) Dim MarginRecord As MARGIN_RECORD_LAYOUT With MarginRecord .opcode = Margin .length = 8 .MarginValue = MarginValue 'in inches End With Put #FileNumber, , MarginRecord SetMargin = 0 Exit Function Write_Error: SetMargin = Err.Number Exit Function End Function Public Function SetColumnWidth(FirstColumn As Byte, LastColumn As Byte, WidthValue As Integer) On Error GoTo Write_Error Dim COLWIDTH As COLWIDTH_RECORD With COLWIDTH .opcode = 36 .length = 4 .col1 = FirstColumn - 1 .col2 = LastColumn - 1 .ColumnWidth = WidthValue * 256 'values are specified as 1/256 of a character End With Put #FileNumber, , COLWIDTH SetColumnWidth = 0 Exit Function Write_Error: SetColumnWidth = Err.Number Exit Function End Function Public Function SetFont(FontName As String, FontHeight As Integer, _ FontFormat As FontFormatting) As Integer On Error GoTo Write_Error 'you can set up to 4 fonts in the spreadsheet file. When writing a value such 'as a Text or Number you can specify one of the 4 fonts (numbered 0 to 3) Dim FONTNAME_RECORD As FONT_RECORD l% = Len(FontName) With FONTNAME_RECORD .opcode = 49 .length = 5 + l% .FontHeight = FontHeight * 20 .FontAttributes1 = CByte(FontFormat) 'bold/underline etc... .FontAttributes2 = CByte(0) 'reserved-always zero!! .FontNameLength = CByte(Len(FontName)) End With Put #FileNumber, , FONTNAME_RECORD 'Then the actual font name data Dim b As Byte For a = 1 To l% b = Asc(Mid$(FontName, a, 1)) Put #FileNumber, , b Next SetFont = 0 Exit Function Write_Error: SetFont = Err.Number Exit Function End Function Public Function SetHeader(HeaderText As String) As Integer On Error GoTo Write_Error Dim HEADER_RECORD As HEADER_FOOTER_RECORD l% = Len(HeaderText) With HEADER_RECORD .opcode = 20 .length = 1 + l% .TextLength = CByte(Len(HeaderText)) End With Put #FileNumber, , HEADER_RECORD 'Then the actual Header text Dim b As Byte For a = 1 To l% b = Asc(Mid$(HeaderText, a, 1)) Put #FileNumber, , b Next SetHeader = 0 Exit Function Write_Error: SetHeader = Err.Number Exit Function End Function Public Function SetFooter(FooterText As String) As Integer On Error GoTo Write_Error Dim FOOTER_RECORD As HEADER_FOOTER_RECORD l% = Len(FooterText) With FOOTER_RECORD .opcode = 21 .length = 1 + l% .TextLength = CByte(Len(FooterText)) End With Put #FileNumber, , FOOTER_RECORD 'Then the actual Header text Dim b As Byte For a = 1 To l% b = Asc(Mid$(FooterText, a, 1)) Put #FileNumber, , b Next SetFooter = 0 Exit Function Write_Error: SetFooter = Err.Number Exit Function End Function Public Function SetFilePassword(PasswordText As String) As Integer On Error GoTo Write_Error Dim FILE_PASSWORD_RECORD As PASSWORD_RECORD l% = Len(PasswordText) With FILE_PASSWORD_RECORD .opcode = 47 .length = l% End With Put #FileNumber, , FILE_PASSWORD_RECORD 'Then the actual Password text Dim b As Byte For a = 1 To l% b = Asc(Mid$(PasswordText, a, 1)) Put #FileNumber, , b Next SetFilePassword = 0 Exit Function Write_Error: SetFilePassword = Err.Number Exit Function End Function Public Property Let PrintGridLines(ByVal newvalue As Boolean) On Error GoTo Write_Error Dim GRIDLINES_RECORD As PRINT_GRIDLINES_RECORD With GRIDLINES_RECORD .opcode = 43 .length = 2 If newvalue = True Then .PrintFlag = 1 Else .PrintFlag = 0 End If End With Put #FileNumber, , GRIDLINES_RECORD Exit Property Write_Error: Exit Property End Property Public Property Let ProtectSpreadsheet(ByVal newvalue As Boolean) On Error GoTo Write_Error Dim PROTECT_RECORD As PROTECT_SPREADSHEET_RECORD With PROTECT_RECORD .opcode = 18 .length = 2 If newvalue = True Then .Protect = 1 Else .Protect = 0 End If End With Put #FileNumber, , PROTECT_RECORD Exit Property Write_Error: Exit Property End Property Public Function WriteDefaultFormats() As Integer Dim cFORMAT_COUNT_RECORD As FORMAT_COUNT_RECORD Dim cFORMAT_RECORD As FORMAT_RECORD Dim lIndex As Long Dim aFormat(0 To 23) As String Dim l As Long Dim q As String q = Chr$(34) aFormat(0) = "General" aFormat(1) = "0" aFormat(2) = "0.00" aFormat(3) = "#,##0" aFormat(4) = "#,##0.00" aFormat(5) = "#,##0\ " & q & "$" & q & ";\-#,##0\ " & q & "$" & q aFormat(6) = "#,##0\ " & q & "$" & q & ";[Red]\-#,##0\ " & q & "$" & q aFormat(7) = "#,##0.00\ " & q & "$" & q & ";\-#,##0.00\ " & q & "$" & q aFormat(8) = "#,##0.00\ " & q & "$" & q & ";[Red]\-#,##0.00\ " & q & "$" & q aFormat(9) = "0%" aFormat(10) = "0.00%" aFormat(11) = "0.00E+00" aFormat(12) = "dd/mm/yy" aFormat(13) = "dd/\ mmm\ yy" aFormat(14) = "dd/\ mmm" aFormat(15) = "mmm\ yy" aFormat(16) = "h:mm\ AM/PM" aFormat(17) = "h:mm:ss\ AM/PM" aFormat(18) = "hh:mm" aFormat(19) = "hh:mm:ss" aFormat(20) = "dd/mm/yy\ hh:mm" aFormat(21) = "##0.0E+0" aFormat(22) = "mm:ss" aFormat(23) = "@" With cFORMAT_COUNT_RECORD .opcode = &H1F .length = &H2 .Count = CInt(UBound(aFormat)) End With Put #FileNumber, , cFORMAT_COUNT_RECORD For lIndex = LBound(aFormat) To UBound(aFormat) l = Len(aFormat(lIndex)) With cFORMAT_RECORD .opcode = &H1E .length = CInt(l + 1) .FormatLenght = CInt(l) End With Put #FileNumber, , cFORMAT_RECORD 'Then the actual format Dim b As Byte, a As Long For a = 1 To l b = Asc(Mid$(aFormat(lIndex), a, 1)) Put #FileNumber, , b Next Next lIndex Exit Function End Function Function MKI$(x As Integer) 'used for writing integer array values to the disk file temp$ = Space$(2) CopyMemory ByVal temp$, x%, 2 MKI$ = temp$ End Function |