Excel-VBA操作文件四大方法之二二、利用VBA文件处理语句来处理文件VBA包含了许多用于文件操作的语句和函数,可以满足绝大多数情况下的文件操作要求。下面我们按照操作目的进行一一介绍。(一)文件处理1.Name语句语法:NameoldpathnameAsnewpathname功能:重命名一个文件、目录、或文件夹,移动一个文件。说明:在一个已打开的文件上使用Name,将会产生错误。进行文件操作时,一定要注意错误处理。示例:OnErrorResumeNext'错误处理Namef:\TEST.xlsAsf:\TEST123.xls'重命名Namef:\TEST.xlsAsf:\dll\TEST.xls'移动文件Namef:\TEST.xlsAsd:\TEST123.xls'跨驱动器移动并重命名文件注意:Name不能移动一个目录或文件夹。2、FileCopy语句语法:FileCopysource,destination功能:复制一个文件。说明:如果对一个已打开的文件使用FileCopy语句,则会产生错误。示例:FileCopyf:\TEST.xls,e:\TEST.xls'从F盘复制TEST.xls到E盘3、Kill语句语法:Killpathname功能:从磁盘中删除文件。说明:Kill支持多字符(*)和单字符(?)的统配符来指定多重文件。如果使用Kill来删除一个已打开的文件,则会产生错误。示例:Killf:\TEST.xls’删除F盘的TEST.xls文件Killf:\*.xls'删除F盘所有xls文件4、GetAttr函数语法:GetAttr(pathname)功能:获取一个文件、目录、或文件夹的属性。返回一个Integer值。返回值由GetAttr返回的值,是下面这些属性值的总和:常数值描述vbNormal0常规vbReadOnly1只读vbHidden2隐藏vbSystem4系统文件vbDirectory16目录或文件夹vbArchive32存档文件vbalias64指定的文件名是别名。只在Macintosh中可用。说明:若要判断是否设置了某个属性,在GetAttr函数与想要得知的属性值之间使用And运算符与逐位比较。如果所得的结果不为零,则表示设置了这个属性值。示例:Debug.PrintGetAttr(F:\test.txt)'若为存档文件,在立即窗口可看到值为32Debug.PrintGetAttr(F:\test.txt)'将属性—高级—可存档文件的勾去掉后,值为0为判断一个文件是否只读,可用下法:Debug.PrintGetAttr(F:\test.txt)AndvbReadOnly若值非零,说明时只读的。5、SetAttr语句语法:SetAttrpathname,attributes功能:为一个文件设置属性。说明:如果想要给一个已打开的文件设置属性,则会产生运行时错误。示例:SetAttrF:\test.txt,vbHidden'设置隐藏属性。SetAttrF:\test.txt,vbHidden+vbReadOnly'设置隐藏并只读。6、FileLen函数语法:FileLen(pathname)功能:获取一个文件的长度,单位是字节。说明:当调用FileLen函数时,不需要打开文件,如果所指定的文件已经打开,则返回的值是这个文件在打开前的大小。7、FileDateTime函数语法:FileDateTime(pathname)功能:获取一个文件被创建或最后修改后的日期和时间。示例:Debug.PrintFileDateTime(F:\TEST.xls)'在立即窗口可看到2007-3-2919:28:27(二)目录处理1、CurDir函数语法:CurDir[(drive)]功能:返回当前的路径。说明:drive参数是可选的,它指定一个存在的驱动器。如果没有指定驱动器,或drive是零长度字符串(),则CurDir会返回当前驱动器的路径。示例:Debug.PrintCurDir'返回“C:\DocumentsandSettings\yc\MyDocuments”。Debug.PrintCurDir(C)'返回“C:\DocumentsandSettings\yc\MyDocuments”。Debug.PrintCurDir(D)'返回“D:\”。2、ChDir语句语法:ChDirpath功能:改变当前的目录或文件夹。说明:ChDir语句改变缺省目录位置,但不会改变缺省驱动器位置。缺省驱动器一般是C。示例:ChDirD:\tempDebug.PrintCurDir'返回“C:\DocumentsandSettings\yc\MyDocuments”。Debug.PrintCurDir(D)'返回“D:\temp”。与上例比较,此时D盘的当前目录已经变为“D:\temp”,但是缺省驱动器还是C。3、ChDrive语句语法:ChDrivedrive功能:改变当前的驱动器。说明:如果使用零长度的字符串(),则当前的驱动器将不会改变。如果drive参数中有多个字符,则ChDrive只会使用首字母。示例:ChDriveDChDirD:\tempDebug.PrintCurDir'返回“D:\temp”。Debug.PrintCurDir(D)'返回“D:\temp”。与上例比较,用CurDir返回的是“D:\temp”,当前驱动器已经变为D了。4、Dir函数语法:Dir[(pathname[,attributes])]两个参数都是可选的,attributes表示文件属性。功能:返回一个文件名、目录名或文件夹名称,它必须与指定的模式或文件属性、或磁盘卷标相匹配。说明:在第一次调用Dir函数时,必须指定pathname,否则会产生错误。如果也指定了文件属性,那么就必须包括pathname。Dir会返回匹配pathname的第一个文件名。若想得到其它匹配pathname的文件名,再一次调用Dir,且不要使用参数。如果已没有合乎条件的文件,则Dir会返回一个零长度字符串()。一旦返回值为零长度字符串,并要再次调用Dir时,就必须指定pathname,否则会产生错误。不必访问到所有匹配当前pathname的文件名,就可以改变到一个新的pathname上。但是,不能以递归方式来调用Dir函数。以vbDirectory属性来调用Dir不能连续地返回子目录。示例:Debug.PrintDir(F:\TEST.xls)’返回TEST.xlsDebug.PrintDir(F:\*.xls)’返回按条件第一个找到的文件名。Debug.PrintDir(F:\*.txt,vbReadOnly)’返回第一个只读的txt文件以下过程可显示C盘根目录下的所有目录.SubDirC()MyPath=c:\MyName=dir(MyPath,vbDirectory)'找寻第一项。DoWhileMyName'开始循环。'跳过当前的目录及上层目录。IfMyName.AndMyName..Then'使用位比较来确定MyName代表一目录。If(GetAttr(MyPath&MyName)AndvbDirectory)=vbDirectoryThenDebug.PrintMyName'如果它是一个目录,将其名称显示出来。EndIfEndIfMyName=dir'查找下一个目录。LoopEndSub以下过程利用递归可以查找目录和子目录下的所有文件。PublicSubFindFile(mPathAsString,OptionalsFileAsString=)OnErrorResumeNextDimsAsString,sDir()AsStringDimiAsLong,dAsLongIfRight(mPath,1)\ThenmPath=mPath&\EndIf'查找目录下的文件s=dir(mPath&sFile,vbArchive+vbDirectory+vbHidden+vbNormal+vbReadOnly+vbSystem)DoWhilesDebug.PrintmPath&ss=dirLoop'查找目录下的子目录s=dir(mPath,vbArchive+vbDirectory+vbHidden+vbNormal+vbReadOnly+vbSystem)DoWhilesIfs.Ands..ThenIf(GetAttr(mPath&s)AndvbDirectory)=vbDirectoryThend=d+1ReDimPreservesDir(d)sDir(d)=mPath&sEndIfEndIfs=dirLoop'开始递归Fori=1TodFindFilesDir(d)&\NextEndSub5、MkDir语句语法:MkDirpath功能:创建一个新的目录或文件夹。说明:path可以包含驱动器。如果没有指定驱动器,则MkDir会在当前驱动器上创建新的目录或文件夹。示例:MkDirMYDIR'在当前目录建立新的目录或文件夹。6、RmDir语句语法:RmDirpath功能:删除一个存在的目录或文件夹。说明:如果想要使用RmDir来删除一个含有文件的目录或文件夹,则会发生错误。在试图删除目录或文件夹之前,先使用Kill语句来删除所有文件。示例:RmDirMYDIR'将MYDIR删除。(三)处理文本文件1、Open语句语法:OpenpathnameFormode[Accessaccess][lock]As[#]filenumber[Len=reclength]其中access、lock、reclength为可选参数,一般不用。mode指定打开文件的方式。有5种:Input:以输入方式打开,即读取方式。Output:以输出方式打开,即写入方式。Append:以追加方式打开,即添加内容到文件末尾。Binary:以二进制方式打开。Random:以随机方式打开,如果未指定方式,则以Random方式打开文件。filenumber是一个有效的文件号,范围在1到511之间。可以指定,也可使用FreeFile函数可得到下一个可用的文件号。说明:如果pathname指定的文件不存在,那么,在用Append、Binary、Output、或Random方式打开文件时,可以建立这一文件。示例:OpenF:\TEST.txtForInputAs#1'以输入方式打开OpenF:\TEST.xlsForBinaryAs#1'以二进制方式打开2、Close语句语法:Close[filenumberlist]filenumberlist参数为一个或多个文件号,若省略filenumberlist,则将关闭Open语句打开的所有活动文件。说明:打开文件后,必须在使用完后关闭文件。示例:DimI,FileNameForI=1To3FileName=TEST&I'创建文件名。OpenFileNameForOutputAs#I'打开文件。Print#I,Thisisatest.'将字符串写入文件。NextIClose'将三个已打开的文件全部关闭。3、Reset语句语法:Reset功能:关闭所有用Open语句打开的磁盘文件。说明:Reset语句关闭Open语句打开的所有活动文件,并将文件缓冲区的所有内容写入磁盘。示例:DimFileNumberForFileNumber=1To5OpenTEST&FileNumberForOutputAs#FileNumberWrite#FileNumber,HelloWorld'将数据写入文件。NextFileNumberReset'关闭文件并将缓冲区内的数据写到磁盘中。4、FreeFile函数语法:FreeFile[(rangenumber)]参数rangenumber指定一个范围,以便返回该范围之内的下一个可用文件号。指定0(缺省值)则返回一个介于1–255之间的文件号。指定1则返回一个介于256–511之间的文件号。功能:提供一个尚未使