文件处理
VBA OPEN函数读写文本文件或日志文件的说明和示例
2018-02-03 17:24:43

VBA或VB的 Open 文件函数 打开、关闭、读、写文件的详细操作说明及示例

主要用途:

  1. 读写文本文件

  2. 读写日志文件

  3. 读写INI配置文件

往文件尾部添加内容

  1. Function AddtoFile(FileName, Optional AddFileBody As StringAs Boolean  

  2.    '[mycode_id:370],edittime:2011-1-16 下午 12:40:15  

  3.    On Error GoTo Err  

  4.    Dim FileObj  

  5.    Dim FOpenFile  

  6.    Set FileObj = CreateObject("Scripting.FileSystemObject")  

  7.    Set FOpenFile = FileObj.OpenTextFile(FileName, 8, -1, 0) '8以添加(ForAppending)的模式打开文件  

  8.    FOpenFile.WriteLine AddFileBody  

  9.    FOpenFile.Close  

  10.    AddtoFile=True  

  11.    Exit Function  

  12.    Err:  

  13.    'MsgBox Err.Description  

  14. End Function  

读写操作日志的类

Option ExplicitPublic gstrLogPath As String

Private Sub Class_Initialize()    gstrLogPath = App.Path & "/Log"     'Log路径End Sub

'*************************************************************************************************'*函数名:  WriteErrLog'*程序功能:写日志'*开发人员:inrg'*异动人员:无'*传入值:  1.strProgramName -- 类模块名'*          2.strProcName -- 函数名'*          3.strErrLog -- ErrorLog內容 eg:Err.Description'*          4.strErrNumber -- Err对象的错误编号(可选) eg:Err.Number'*          5.strErrDesc -- Err对象的错误描叙(可选) eg:Err.Description'*回传值:  boolean  成功 = true,失败 = false'*************************************************************************************************Public Static Function WriteErrLog(ByVal strProgramName As String, ByVal strProcName As String, ByVal strErrLog As String, Optional ByVal strErrNumber As String, Optional ByVal strErrDesc As String) As Boolean    Dim FileHandle As Long    Dim strTxtName As String        '    Dim FSOLog As Object            '        On Error GoTo WriteLogFileErr:

    Set FSOLog = CreateObject("Scripting.FileSystemObject")        WriteErrLog = True

    If (gstrLogPath = "") Then        WriteErrLog = False        GoTo WriteLogFileErr:    End If        '文件名    strTxtName = Format(Date, "YYYYMMDD") & ".log"        '判断是否有Log文件夹    If Dir(gstrLogPath, vbDirectory) = "" Then            MkDir gstrLogPath    End If

    FileHandle = FreeFile    Open (gstrLogPath & "/" & strTxtName) For Append As #FileHandle    Lock #FileHandle        Print #FileHandle, "************************************************************************"        Print #FileHandle, "Date & Time: " & Format(Time, "HH:MM:SS")        Print #FileHandle, "Program Name: " & strProgramName        Print #FileHandle, "Procedure Name: " & strProcName        Print #FileHandle, "Error Number: " & strErrNumber        Print #FileHandle, "Error Desc: " & strErrDesc        Print #FileHandle, "Log: " & strErrLog        Print #FileHandle, "************************************************************************" & vbNewLine    Unlock #FileHandle    Close #FileHandle        Set FSOLog = Nothing    Exit Function

WriteLogFileErr:        WriteErrLog = FalseEnd Function

详细使用方法和教程

(一)打开和关闭文件     1、顺序文件     打开顺序文件,我们可以使用Open语句。它的格式如下:Open pathname For [Input |Output |Append] As [#]filenumber [Len = buffersize]      说明:     (1)参数pathname 表示要打开的文件名,文件名可以包含有驱动器和目录     (2)Input Output 和Append用于设置顺序文件的打开方式。其中,Input表示从打开的文件中读取数据。以这种方式打开文件时,文件必须存在,否则会产生错误。Output表示向打开的文件中写入数据。以这种方式打开文件时,文件中原有的数据将被覆盖,新的数据将从文件开始写入。如果文件不存在,则创建一个新文件。Append表示向打开的文件中添加数据。以这种方式打开时,文件中原有的数据将被保留,新的数据将从文件为开始添加。如果文件不存在,则创建一个新文件。     (3)As[#]filenumber 子句用于为打开的文件指定文件号.对文件进行读写操作时,要用文件号表示该文件.文件号是介于1~511之间的整数,既可以是数字,又可以是变量.也可以省略不用.     (4)当在文件与程序之间拷贝数据时,Len=buffersize子句指定缓冲区的字符数.     例如:Open App.Path + "\test.dat" For Output As 1Open App.Path + "\test.dat" For Output As 1      这两句代码在当前应用程序所在目录下创建了一个名为test.dat的文本文件,分配文件号为1.Open App.Path + "\test.dat" For Input As [#]filenumber      这条语句是从文本文件中读取数据.Open App.Path + "\test.dat" For Append As [#]filenumber      这条语句则是像文本文件中添加数据     2、随机文件     操作随机文件之前,首先必须定义用于保存数据项的记录类型.该记录是用户自定义数据类型,他们是随机文件中存储数据的基本结构.例如:Type Student   No As Integer   Name As String * 20   age As IntegerEnd TypeDim Stud As Student ‘定义一个可以存放学生材料的变量      随机文件中,所有的数据都将保存到若干个结构为Student类型的记录中, 而从随机文件中读出的数据则可以存放到变量Stud中.     之后我们就可以打开并读写文件了.下面是打开随机文件的语法格式:Open filename For Random as [#]filenumber Len = Reclength      说明:     (1)参数filename 和filenumber 分别表示文件名或文件号.     (2)关键字Random 表示打开的是随机文件     (3)Len子句用于设置记录长度,长度由参数Reclength指定.Reclength的值必须大于0,而且必须与定义的记录结构的长度一致.计算记录长度的方法是将记录结构中每个元素的长度相加.例如前面声明的Student的长度应该是2+20+2=24字节.     打开一个记录类型为Student 的随机文件的方法是:Open "c:\Student.txt " For Random As #1 Len = 25      3、二进制文件     打开二进制文件的语法格式如下:Open pathname For Binary As [#]filenumber 

     说明:     (1) 参数filename 和filenumber 分别表示文件名或文件号.     (2)关键字Binary 表示打开的是二进制文件     (3)对于二进制文件,不能指定字节长度.每个打开的二进制文件都有一个自己的指针,文件指针是一个数字值,指向下一次读写操作的文件中的位置.二进制文件中的每个”位置”对应一个数据字节,因此,有n个字节的文件,就有1到n个位置.     我们可以用Seek()函数返回当前的文件指针位置(即下一个要读写的字节 );用Loc()函数返回上一次读写的字节位置,除非用Seek语句移动了指针,Loc()返回值总比Seek()的小1.我们来看下面的例子:Open “student.txt” for Binary as #1      该语句用二进制的方式打开了student.txt文件.     (二)读文件     1、顺序文件     顺序文件的读取有三种方式:     (1)Line Input # 语句     该语句从打开的顺序文件中读取一行数据。这里的一行指的是从当前指针位置开始到回车符或回车换行符之间的所有数据。Line Input # 语句的语法格式如下:Line Input # 文件号,变量号      说明:“文件号”是打开文件时所用的文件号;“变量号”使用来存放读出数据的一个或多个变量,如果有多个变量,中间用空格分割开。Input# 语句为参数列表中的每一个变量读取文件的一个域,并将读出的域存入变量中。该语句只能顺序的从第一个域开始,直到读取想要的域。     请看下面代码:Dim strLine As StringOpen "c:\vb\test.txt" For Input As #1Do Until EOF(1)   Line Input #1, strLine   text1.Text = text1.Text + strLine + Chr(13) + Chr(10)LoopClose #1      此段代码逐行读取一个文件到文本框中。     (2)Input函数     此函数可以从顺序文件中一次读取指定长度的字符串。具体地说,就是从文件的当前位置开始,读取指定个数的字符,然后将他们返回。Input函数可以读取包括换行符,回车符,空格符等在内的各种字符。下面是它的语法格式:     变量 = Input(串长度,文件号)     例如,要从一个打开文件中读取12个字符并复制到变量file中,我们可以这样写:file = Input(12,filenum)      如果要将整个文件复制到变量,请使用InputB函数将字节从文件复制到变量。由于InputB函数返回一个ASCII字符串,因此,必须用StrCopy函数将ASCII字符串转换为Unicode字符串。代码如下:file = StrCopy (Input (LOF(filenanum),filenum),vbUnicode)      (3)Input # 语句     Input #语句可以从文件中同时向多个变量内读入数据,而且读入的数据可以是不同类型的。       下面使它的语法格式:Input # 文件号,变量列表      例如,我们要在文件student.txt中写入数据,下面是代码:Open "student.txt" For Output As #filenumWrite #filenum, "张三", "初一年级", 14Write #filenum, "李四", "职业高中", 18Dim name As String, nianji As String, age As IntegerDim name1 As String, nianji1 As String, age1 As IntegerOpen "student.txt" For Input As #filenumInput #filenum, name, nianji, ageInput #filenum, name1, nianji1, age1Close #filenum      执行结果:name=”张三” ,nianji = “初一年级” ,age =14 name=”李四” ,nianji = “职业高中” ,age =18      2、随机文件     读取随机文件是可以使用Get # 语句,数据从文件的一个指定记录中读出后,存入一个用户自定义的变量中.     语法格式: Get # FileNum ,[RecNum],UserType     说明:     (1)FileNum 是要打开的文件号;RecNum是要读取的记录号,若省略,则读取下一个记录     (2)UserType 是一个用来存放读出数据的用户自定义的数据类型变量.     下面是一个例子:Get # 1,5,Student      该语句读取文件号为1的文件中的第5条记录.     3、二进制文件     读写二进制文件的方法和读写随机文件的方法基本相同,下面是相关的语句格式及其说明:     格式: Get [#]fileNumber ,[Pos], Var     功能: 用二进制方式,从文件的中指定的位置开始读取,所给变量长度的数据     说明:     (1)FileNumber是以二进制方式打开的文件号.     (2)Pos用来指定读写操作发生时的字节位置,若省略,则使用当前文件指针位置.     (3)Var是用来存放读出的数据的变量.该语句会自动根据var变量包含的字节长度读取适当的文件,如果Var是一个可变长度的字符串变量,则传送的字节数等于Var中目前的字节数.对于文件长度的判断我们可以使用Lof()函数,Eof()函数检查文件的结尾位置.     下面的代码复制studert.txt文件到student1.txt文件中Dim ar As String * 1, i As IntegerOpen "c:\student.txt" For Binary As #1Open "c:\student2.txt" For Binary As #2For i = 1 To LOF(1)   Get #1, , ar   Put #2, , arNext iClose #1, #2      (三)写文件     1、 顺序文件     写顺序文件我们可以用Write # 和Print #语句向一个已经打开的文件中写入数据.     下面是他们的格式和说明:     Print # 的语法格式:     Print # 文件号,变量列表      例如,将文本框中的文本写到文件中,代码如下:Open "file.txt" For Output As #filenumInput #filenum, text1.text      Write # 语句的语法格式:Write # 文件号,变量列表      说明:用Write # 语句写入的信息便于以后用Input #语句来读取数据,因为Write #语句自动将写入到文件中的信息用逗号分开,并为字符串数据加上双引号.例如:Open "student.txt" For Output As #filenumWrite #filenum, "张三", "初一年级", 14Write #filenum, "李四", "职业高中", 18      2、 随机文件     向随机文件中写入数据,使用Put   #语句.语法格式如下:Put [#] FileNum ,[RecNum],UserType      说明:     (1) FileNum 是要打开的文件号;RecNum是要写入的记录号,若省略,则再上一次用Get 和Put语句所读写过的记录的后一条记录中写入,如果没有执行过Get 和Put语句,就从第一条记录开始     (2)UserType 是包含要写入数据的用户自定义的数据类型变量.例如:我们向前面的student.txt文件中的第5个记录写入数据,可用这些语句:stud.No = 0301stud.Name = “王武”stud.Age =20Put #1 ,5,stud      如果要插入的数据不只一两条的话,首先要确定文件和每条记录的长度,这样就可以计算出文件中究竟有多少条记录.我们可以用Lof()函数返回文件的长度,Len()函数返回每个记录的长度,计算文件中的记录个数可以用文件的长度除以给个记录的长度.示例如下:Nextrec= (Lof(1)\Len(UserType))+1Put #1,Nextrec,UserType      3、二进制文件     下面是以二进制方式写入文件的语句格式及其说明:     格式:Put [#]fileNumber ,[Pos], Var      功能: 用二进制方式,从文件的中指定的位置开始写入,所给变量长度的数据     说明:     (1)FileNumber是以二进制方式打开的文件号.     (2)Pos用来指定写操作发生时的字节位置,若省略,则使用当前文件指针位置.     (3)Var是用来存放写入的数据的变量.该语句会自动根据var变量包含的字节长度写入文件,如果Var是一个可变长度的字符串变量,则传送的字节数等于Var中目前的字节数  

VB读写文件要用到以下语句:     1、Open语句打开文件。     2、读文件使用Line Input、Input #,(以上为文本方式)和Get(以上为二进制方式)。     3、写文件使用Print #、Write(以上为文本方式)和Put(以上为二进制方式)。     4、Close语句关闭文件     5、二进制方式下移动文件位置使用Seek语句。     所有这些语句在VB的帮助中都有详细说明和例子。     文本文件的示例:     Open "TESTFILE" For Output As #1 ' 打开输出文件。     Print #1, "This is a test" ' 将文本数据写入文件。     Print #1, ' 将空白行写入文件。     Print #1, "Zone 1"; Tab ; "Zone 2" ' 数据写入两个区(print zones)。     Print #1, "Hello" ; " " ; "World" ' 以空格隔开两个字符串。     Print #1, Spc(5) ; "5 leading spaces " ' 在字符串之前写入五个空格。          Print #1, Tab(10) ; "Hello" ' 将数据写在第十列。          ' 赋值 Boolean、Date、Null 及 Error 等。     Dim MyBool, MyDate, MyNull, MyError     MyBool = False : MyDate = #February 12, 1969# : MyNull = Null     MyError = CVErr(32767)     ' True、False、Null 及 Error 会根据系统的地区设置自动转换格式。     ' 日期将以标准的短式日期的格式显示。     Print #1, MyBool ; " is a Boolean value"          Print #1, MyDate ; " is a date"     Print #1, MyNull ; " is a null value"     Print #1, MyError ; " is an error value"     Close #1 ' 关闭文件。          读文件示例     使用 Line Input # 语句从顺序文件中读入一行数据,并将该行数据赋予一个变量。本示例假设 TESTFILE 文件内含数行文本数据。     Dim TextLine     Open "TESTFILE" For Input As #1 ' 打开文件。     Do While Not EOF(1) ' 循环至文件尾。      Line Input #1, TextLine ' 读入一行数据并将其赋予某变量。      Debug.Print TextLine ' 在调试窗口中显示数据。     Loop     Close #1 ' 关闭文件。

 

追加文件示例

Open   "A.txt"   For   append   As   #1         Print   #1,"303   (吴志坤)是个大笨蛋!,居然不知道append是追加。"         Print   #1,"从QBASIC时代就有这个语句了。"         Print   #1,"Output是从头写,Input是读,Append是追加。"         Print   #1,"Print   #文件号,是写文件。"         Print   #1,"Line   Input   #文件号,是成行读文件。"         Print   #1,"你地明白否?"     Close   #1