ExcelVBA操作文件大全_第1页
ExcelVBA操作文件大全_第2页
ExcelVBA操作文件大全_第3页
ExcelVBA操作文件大全_第4页
ExcelVBA操作文件大全_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、丄Excel-VBA操作文件四大方法之一利用Excel对象来处理文件在我们日常使用Excel的时候,不仅会用到当前Excel文件的数据,还经常需要访问其他的数据文件。这些数据文件可能是Excel文件、文本文件或数据库文件等。经常有朋友会问如何在vba代码里操作这些数据文件?本文就系统地介绍一下在Excel中应用VBA操作数据文件的方法。本文主要介绍四种常用的方法:1、利用Excel对象来处理文件;2、利用VBA文件处理语句来处理文件;3、利用FileSystemObject对象来处理文件;4、利用API函数来处理文件。当然对于数据库文件,还可以利用ADO+SQL的方法操作,不过论坛已经有前辈详

2、细介绍过此类方法,本文就不再重复了。一、利用Excel对象来处理文件利用Excel对象自带的方法来操作文件是最方便,也是最简单的。我们主要利用Workbooks集合和Workbook对象的方法来操作文件。1、打开Excel文件我们可以用Workbooks.Open方法打开一个Excel工作簿。Workbooks.Open(FileName,UpdateLinks,ReadOnly,Format,Password,WriteResPassword,IgnoreReadOnlyRecommended,Origin,Delimiter,Editable,Notify,Converter,AddToM

3、ru,Local,CorruptLoad)其中FileName是必选的参数,表示要打开的工作簿名,如果没有指定路径,则代表当前路径。另外14个是可选参数,除了密码参数,其他的一般很少用。具体的含义可以参看VBA的帮助。例:Workbooks.OpenF:test.xls可以打开F盘的test.xls文件。2、打开文本文件使用Open方法也可以打开文本文件,但建议使用OpenText方法。此方法是载入一个文本文件,并将其作为包含单个工作表的工作簿进行分列处理,然后在此工作表中放入经过分列处理的文本文件数据。完整语法如下:Workbooks.OpenText(FileName,Origin,Sta

4、rtRow,DataType,TextQualifier,ConsecutiveDelimiter,Tab,Semicolon,Comma,Space,Other,OtherChar,FieldInfo,TextVisualLayout,DecimalSeparator,ThousandsSeparator,TrailingMinusNumbers,Local)关于以上参数的具体含义可以参看VBA的帮助,这里就不重复了。在实际的编程中,一般无需对这些复杂的参数进行处理。可以通过录制宏来得到打开一个文本文件的VBA代码。具体方法就是选择文件打开”然后选择打开文本文件,就会出现文本导入向导,一步一

5、步执行完,直到文本打开后,停止录制。以下是录制宏得到的代码:SubMacro1()!Macro1Macro宏由MCSYSTEM录制,时间:2007-3-29Workbooks.OpenTextFilename:=F:CallWindowProc.txt,Origin:=xlWindows,_StartRow:=1,DataType:=xlDelimited,TextQualifier:=xlDoubleQuote,_ConsecutiveDelimiter:=False,Tab:=True,Semicolon:=False,Comma:=False_,Space:=False,Other:=F

6、alse,FieldInfo:=Array(1,1),_TrailingMinusNumbers:=TrueEndSub在实际编程中只要做相应的修改就可以使用了。3、打开其他文件利用Excel对象还可以打开XML文件和一些数据库(如Access)文件,对应XML文件,需要Excel2003以上的版本。OpenXML方法的语法如下:Workbooks.OpenXML(Filename,Stylesheets,LoadOption)FileNameString类型,必需。要打开的文件名。StylesheetsVariant类型,可选。单个值或值的数组,用于指定要应用哪些XSL转换(XSLT)样式表

7、处理指令。LoadOptionVariant类型,转换。指定Excel打开XML数据文件的方式可为XlXmlLoadOption常量之一。XlXmlLoadOption可为以下XlXmlLoadOption常量之一:xlXmlLoadImportToList将XML数据文件的内容置于XML列表中。xIXmlLoadMapXml在XML结构任务窗格中显示XML数据文件的架构。xlXmlLoadOpenXml打开XML数据文件。文件的内容将展开。xlXmlLoadPromptUser提示用户选择打开文件的方式。示例下面的代码打开了XML数据文件customers.xml并在XML列表中显示了此文件

8、的内容。SubUseOpenXML()Application.Workbooks.OpenXML_Filename:=customers.xml,_LoadOption:=xlXmlLoadImportToListEndSubOpenDatabase方法语法如下:Workbooks.OpenDatabase(FileName,CommandText,CommandType,BackgroundQuery,ImportDataAs)FileNameString类型,必需。连接字符串。CommandTextVariant类型,可选。查询的命令文本。CommandTypeVariant类型,可选。查

9、询的命令类型。以下是可用的命令类型:Default、SQL和Table。BackgroundQueryVariant类型,可选。查询的背景。ImportDataAsVariant类型,可选。确定查询的格式。示例本示例中,Excel打开了northwind.mdb文件。SubOpenDatabase()Workbooks.OpenDatabaseFileName:=C:northwind.mdbEndSub4、保存文件文件的保存使用Workbook对象的Save或SaveAs方法。Save方法使用简单,语法为expression.Save,expression是某个Workbook对象。如:Ac

10、tiveWorkbook.Save即保存当前活动工作簿。如果是第一次保存工作簿或要另存为,请使用SaveAs方法为该文件指定文件名。其语法为:expression.SaveAs(FileName,FileFormat,Password,WriteResPassword,ReadOnlyRecommended,CreateBackup,AccessMode,ConflictResolution,AddToMru,TextCodepage,TextVisualLayout,Local)具体参数含义可参看VBA帮助,使用都比较简单。示例本示例新建一个工作簿,提示用户输入文件名,然后保存该工作簿。Se

11、tNewBook=Workbooks.AddDofName=Application.GetSaveAsFilenameLoopUntilfNameFalseNewBook.SaveAsFilename:=fNameApplication.GetSaveAsFilename为调出标准的“另存为”对话框,获取用户文件名,但并不真正保存任何文件,然后使用代码保存文件。还有Application.GetOpenFileName可以调出标准的“打开”对话框。5、关闭文件关闭文件可以使用Workbooks集合或Workbook对象的Close方法。前者是关闭所有打开的工作簿,后者关闭特定的工作簿。Work

12、book对象的Close方法语法为:expression.Close(SaveChanges,Filename,RouteWorkbook)SaveChanges参数表示是否保存更改,对许多不需要更改的操作,可设置为False以免弹出保存更改提示的对话框。FileName可选。以此文件名保存所做的更改。RouteWorkbook可选。如果指定工作簿不需要传送给下一个收件人(没有传送名单或已经传送),则忽略该参数。示例本示例关闭Book1.xls,并放弃所有对此工作簿的更改。Workbooks(BOOK1.XLS).CloseSaveChanges:=False本示例关闭所有打开的工作簿。如果某

13、个打开的工作簿有改变,MicrosoftExcel将显示询问是否保存更改的对话框和相应提示。Workbooks.Close6、综合实例假如F盘有一个Excel文件test.xls,现在有另一个Excel文件要访问test.xls的数据,我们来看用VBA代码如何操作。代码如下:PublicSubtest()Application.ScreenUpdating=FalseWorkbooks.Openf:test.xlsThisWorkbook.Sheets(1).Range(b1)=ActiveWorkbook.Sheets(1).Range(a2)ActiveWorkbook.CloseAppl

14、ication.ScreenUpdating=TrueEndSub首先关闭屏幕刷新,是为了防止test.xls在打开时被看见(有时候还是看的见)。打开后,见test.xls的Sheetl的单元格A2中的值赋给当前工作簿的Sheetl的单元格B2,然后关闭test.xls。当要打开的工作簿不确定的时候,可以通过调用打开对话框来让用户自己选择。可改为如下:PublicSubtest()Application.ScreenUpdating=FalseDimFilenameasStringFilename=Application.GetOpenFileNameWorkbooks.OpenFilenam

15、eThisWorkbook.Sheets(1).Range(b1)=ActiveWorkbook.Sheets(1).Range(a2)ActiveWorkbook.CloseApplication.ScreenUpdating=TrueEndSub7、总结利用Excel对象的方法进行文件操作是最简单,也是最方便的,适合初学者。对于Excel文件格式,如果我们仅仅是读取其表格中的内容,这种方法也是首选。对于文本文件的操作,使用第二种方法比较方便,若要将文本转换成表格,那么使用此方法也是合适的。丄Excel-VBA操作文件四大方法之二利用VBA文件处理语句来处理文件VBA包含了许多用于文件操作的

16、语句和函数,可以满足绝大多数情况下的文件操作要求。下面我们按照操作目的进行一一介绍。(一)文件处理1.Name语句语法:NameoldpathnameAsnewpathname功能:重命名一个文件、目录、或文件夹,移动一个文件。说明:在一个已打开的文件上使用Name,将会产生错误。进行文件操作时,一定要注意错误处理。示例:OnErrorResumeNext错误处理Namef:TEST.xlsAsf:TEST123.xls重命名Namef:TEST.xlsAsf:dllTEST.xls移动文件Namef:TEST.xlsAsd:TEST123.xls跨驱动器移动并重命名文件注意:Name不能移动

17、一个目录或文件夹。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、GetAtt

18、r函数语法:GetAttr(pathname)功能:获取一个文件、目录、或文件夹的属性。返回一个Integer值。返回值由GetAttr返回的值,是下面这些属性值的总和:常数值描述vbNormal0常规vbReadOnly1只读vbHidden2隐藏vbSystem4系统文件vbDirectory16目录或文件夹vbArchive32存档文件vbalias64指定的文件名是别名。只在Macintosh中可用。说明:若要判断是否设置了某个属性,在GetAttr函数与想要得知的属性值之间使用And运算符与逐位比较。如果所得的结果不为零,则表示设置了这个属性值。示例:Debug.PrintGetAt

19、tr(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

20、+vbReadOnly设置隐藏并只读。6、FileLen函数语法:FileLen(pathname)功能:获取一个文件的长度,单位是字节。说明:当调用FileLen函数时,不需要打开文件,如果所指定的文件已经打开,则返回的值是这个文件在打开前的大小。7、FileDateTime函数语法:FileDateTime(pathname)功能:获取一个文件被创建或最后修改后的日期和时间。示例:Debug.PrintFileDateTime(F:TEST.xls)在立即窗口可看到2007-3-2919:28:27二)目录处理1、CurDir函数语法:CurDir(drive)功能:返回当前的路径。说明:

21、drive参数是可选的,它指定一个存在的驱动器。如果没有指定驱动器,或drive是零长度字符串(),则CurDir会返回当前驱动器的路径。示例:Debug.PrintCurDir返回CDocumentsandSettingsycMyDocuments。Debug.PrintCurDir(C)返回CDocumentsandSettingsycMyDocuments。Debug.PrintCurDir(D)返回D:。2、ChDir语句语法:ChDirpath功能:改变当前的目录或文件夹。说明:ChDir语句改变缺省目录位置,但不会改变缺省驱动器位置。缺省驱动器一般是C。示例:ChDirD:temp

22、Debug.PrintCurDir返回CDocumentsandSettingsycMyDocuments0Debug.PrintCurDir(D)返回Dtemp。与上例比较,此时D盘的当前目录已经变为Dtemp”,但是缺省驱动器还是C。3、ChDrive语句语法:ChDrivedrive功能:改变当前的驱动器。说明:如果使用零长度的字符串(),则当前的驱动器将不会改变。如果drive参数中有多个字符,则ChDrive只会使用首字母。示例:ChDriveDChDirD:tempDebug.PrintCurDir返回Dtemp。Debug.PrintCurDir(D)返回Dtemp。与上例比较,

23、用CurDir返回的是Dtemp”,当前驱动器已经变为D了。4、Dir函数语法:Dir(pathname,attributes)两个参数都是可选的,attributes表示文件属性。功能:返回一个文件名、目录名或文件夹名称,它必须与指定的模式或文件属性、或磁盘卷标相匹配。说明:在第一次调用Dir函数时,必须指定pathname,否则会产生错误。如果也指定了文件属性,那么就必须包括pathname。Dir会返回匹配pathname的第一个文件名。若想得到其它匹配pathname的文件名,再一次调用Dir,且不要使用参数。如果已没有合乎条件的文件,则Dir会返回一个零长度字符串()。一旦返回值为零

24、长度字符串,并要再次调用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

25、=dir(MyPath,vbDirectory)找寻第一项。DoWhileMyName开始循环。跳过当前的目录及上层目录。IfMyName.AndMyName.Then使用位比较来确定MyName代表一目录。If(GetAttr(MyPath&MyName)AndvbDirectory)=vbDirectoryThenDebug.PrintMyName如果它是一个目录,将其名称显示出来。EndIfEndIfMyName=dir查找下一个目录。LoopEndSub以下过程利用递归可以查找目录和子目录下的所有文件。PublicSubFindFile(mPathAsString,OptionalsF

26、ileAsString=)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+vbRead

27、Only+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

28、、RmDir语句语法:RmDirpath功能:删除一个存在的目录或文件夹。说明:如果想要使用RmDir来删除一个含有文件的目录或文件夹,则会发生错误。在试图删除目录或文件夹之前,先使用Kill语句来删除所有文件。示例:RmDirMYDIR将MYDIR删除。(三)处理文本文件1、Open语句语法:OpenpathnameFormodeAccessaccesslockAs#filenumberLen=reclength其中access、lock、reclength为可选参数,一般不用。mode指定打开文件的方式。有5种:Input:以输入方式打开,即读取方式。Output:以输出方式打开,即写入方

29、式。Append:以追加方式打开,即添加内容到文件末尾。Binary:以二进制方式打开。Random:以随机方式打开,如果未指定方式,则以Random方式打开文件。filenumber是一个有效的文件号,范围在1到511之间。可以指定,也可使用FreeFile函数可得到下一个可用的文件号。说明:如果pathname指定的文件不存在,那么,在用Append、Binary、Output、或Random方式打开文件时,可以建立这一文件。示例:OpenF:TEST.txtForInputAs#1以输入方式打开OpenF:TEST.xlsForBinaryAs#1以二进制方式打开2、Close语句语法:

30、Closefilenumberlistfilenumberlist参数为一个或多个文件号,若省略filenumberlist,则将关闭Open语句打开的所有活动文件。说明:打开文件后,必须在使用完后关闭文件。示例:DimI,FileNameForI=1To3FileName=TEST&I创建文件名。OpenFileNameForOutputAs#I打开文件。Print#I,Thisisatest.将字符串写入文件。NextIClose将三个已打开的文件全部关闭。3、Reset语句语法:Reset功能:关闭所有用Open语句打开的磁盘文件。说明:Reset语句关闭Open语句打开的所有活动文件,

31、并将文件缓冲区的所有内容写入磁盘。示例:DimFileNumberForFileNumber=1To5OpenTEST&FileNumberForOutputAs#FileNumberWrite#FileNumber,HelloWorld将数据写入文件。NextFileNumberReset关闭文件并将缓冲区内的数据写到磁盘中。4、FreeFile函数语法:FreeFile(rangenumber)参数rangenumber指定一个范围,以便返回该范围之内的下一个可用文件号。指定0(缺省值)则返回一个介于1-255之间的文件号。指定1则返回一个介于256-511之间的文件号。功能:提供一个尚未

32、使用的文件号。示例:DimfnumAsIntegerfnum=FreeFileOpenF:TEST.txtForInputAs#fnumClose#fnum5、EOF函数语法:EOF(filenumber)功能:返回一个Integer,它包含Boolean值True,表明已经到达为Random或顺序Input打开的文件的结尾。6、LOF函数语法:LOF(filenumber)功能:返回一个Long,表示用Open语句打开的文件的大小,该大小以字节为单位。7、Loc函数语法:LOc(filenumber)功能:返回一个Long,在已打开的文件中指定当前读/写位置。8、Input#语句语法:Inp

33、ut#filenumber,varlist功能:从已打开的顺序文件中读出数据并将数据指定给变量。说明:通常用Write#将Input#语句读出的数据写入文件。为了能够用Input#语句将文件的数据正确读入到变量中,在将数据写入文件时,要使用Write#语句而不使用Print#语句。使用Write#语句可以确保将各个单独的数据域正确分隔开。示例:本示例使用Input#语句将文件内的数据读入两个变量中。本示例假设TESTFILE文件内含数行以Write#语句写入的数据;也就是说,每一行数据中的字符串部分都是用双引号括起来,而与数字用逗号隔开,例如,(Hello,234)。DimMyString,M

34、yNumberOpenTESTFILEForInputAs#1打开输入文件。DoWhileNotEOF(1)循环至文件尾。Input#1,MyString,MyNumber将数据读入两个变量。Debug.PrintMyString,MyNumber在立即窗口中显示数据。LoopClose#1关闭文件。9、Write#语句语法:Write#filenumber,outputlist功能:将数据写入顺序文件。说明:通常用Input#从文件读出Write#写入的数据。如果省略outputlist,并在filenumber之后加上一个逗号,则会将一个空白行打印到文件中。多个表达式之间可用空白、分号或逗

35、号隔开。空白和分号等效。用Write#将数据写入文件时将遵循几个通用的约定,使得无论什么区域都可用Input#读出并正确解释数据:在写入数值数据时总使用句号作为十进制分隔符。对于Boolean类型的数据,或者打印#TRUE#或者打印#FALSE#。无论在什么地区,都不将True和False这两个关键字翻译出来。使用通用的日期格式将Date类型的数据写入文件中。当日期或时间的部件丢失或为零时,只将现有部分写入文件中。如果outputlist的数据为Empty,则不将任何数据写入文件。但对Null数据,则要写入#NULL#。如果outputlist数据为Null数据,则将#NULL#写入文件中。对

36、于Error类型的数据,输出看起来与#ERRORerrorcode#一样。无论在什么地区,都不将关键字Error翻译出来。与Print#语句不同,当要将数据写入文件时,Write#语句会在项目和用来标记字符串的引号之间插入逗号。没有必要在列表中键入明确的分界符。Write#语句在将outputlist中的最后一个字符写入文件后会插入一个新行字符,即回车换行符,(Chr(13)+Chr(10)。示例:OpenF:test.txtForOutputAs#1打开输出文件。Write#1,HelloWorld,1234写入以逗号隔开的数据。Write#1,写入空白行。DimMyBool,MyDate,

37、MyNull,MyError赋值Boolean、Date、Null及Error等。MyBool=False:MyDate=#February12,1969#:MyNull=NullMyError=CVErr(32767)Boolean数据以#TRUE#或#FALSE#的格式写入。日期以通用日期格式写入,例如:#1994-07-13#代表1994年1月13日。Null数据以#NULL#格式写入。Error数据以#ERROR错误代号#的格式写入。Write#1,MyBool;isaBooleanvalueWrite#1,MyDate;isadateWrite#1,MyNull;isanullval

38、ueWrite#1,MyError;isanerrorvalueClose#1关闭文件。我们可以看到写入的内容为:HelloWorld,1234#FALSE#,isaBooleanvalue#1969-02-12#,isadate#NULL#,isanullvalue#ERROR32767#,isanerrorvalue10、LineInput#语句语法:LineInput#filenumber,varname功能:从已打开的顺序文件中读出一行并将它分配给String变量。说明:通常用Print#与LineInput#语句配合使用。LineInput#语句一次只从文件中读出一个字符,直到遇到回

39、车符(Chr(13)或回车-换行符(Chr(13)+Chr(10)为止。回车-换行符将被跳过,而不会被附加到字符串上。示例:DimTextLineOpenTESTFILEForInputAs#1打开文件。DoWhileNotEOF(1)循环至文件尾。LineInput#1,TextLine读入一行数据并将其赋予某变量。Debug.PrintTextLine在立即窗口中显示数据。LoopClose#1关闭文件。11、Input函数语法:Input(number,#filenumber)其中number指定要返回的字符个数。功能:返回String,它包含以Input或Binary方式打开的文件中的

40、字符。说明:通常用Print#或Put将Input函数读出的数据写入文件。Input函数只用于以Input或Binary方式打开的文件。与Input#语句不同,Input函数返回它所读出的所有字符,包括逗号、回车符、空白列、换行符、引号和前导空格等。示例:DimMyCharOpenf:test.txtForInputAs#1DoWhileNotEOF(1)循环至文件尾。MyChar=Input(1,#1)读入一个字符。Debug.PrintMyChar显示到立即窗口。LoopClose#1下面这个函数可以将文本文件的数据一次读入到一个字符串(但是若包含中文时会出错,因为一个中文字占2个字节)。

41、PublicFunctionReadText(FileNameAsString)Dimfnum%,isopenAsBooleanOnErrorGoToerrofnum=FreeFile()OpenFileNameForInputAs#fnumisopen=TrueReadText=Input(LOF(fnum),fnum)erro:IfisopenThenClose#fnumIferrThenDebug.Printerr.Number,err.DescriptionEndFunction12、Print#语句语法:Print#filenumber,outputlistoutputlist参数的

42、设置如下:Spc(n)|Tab(n)expressioncharposSpc(n)用来在输出数据中插入空白字符,而n指的是要插入的空白字符数。Tab(n)用来将插入点定位在某一绝对列号上,这里,n是列号。使用无参数的Tab将插入点定位在下一个打印区的起始位置。expression要打印的数值表达式或字符串表达式。charpos指定下一个字符的插入点。使用分号将插入点定位在上一个显示字符之后。用Tab(n)将插入点定位在某一绝对的列号上,用无参数的Tab将插入点定位在下一个打印区的起始处。如果省略charpos,则在下一行打印下一个字符。功能:将格式化显示的数据写入顺序文件中。说明:通常用Lin

43、eInput#或Input读出Print#在文件中写入的数据示例:OpenF:test.txtForOutputAs#1打开输出文件。Print#1,Thisisatest将文本数据写入文件。Print#1,Print#1,Zone1;Tab;Zone2Print#1,Hello;WorldPrint#1,Spc(5);5leadingspacesPrint#1,Print#1,Zone1;Tab;Zone2Print#1,Hello;WorldPrint#1,Spc(5);5leadingspacesPrint#1,Tab(10);Hello数据写入两个区(printzones)。以空格隔开

44、两个字符串。在字符串之前写入五个空格。将数据写在第十列。赋值Boolean、Date、Null及Error等。DimMyBool,MyDate,MyNull,MyErrorMyBool=False:MyDate=#2/12/1969#:MyNull=NullMyError=CVErr(32767)True、False、Null及Error会根据系统的地区设置自动转换格式日期将以标准的短式日期的格式显示。Print#1,MyBool;isaBooleanvaluePrint#1,MyDate;isadatePrint#1,MyNull;isanullvaluePrint#1,MyError;is

45、anerrorvalueClose#1以上代码写入的内容如下:ThisisatestZone1Zone2HelloWorld5leadingspacesHelloFalseisaBooleanvalue1969-2-12isadateNullisanullvalueError32767isanerrorvalue13、Width#语句语法:Width#filenumber,widthwidth必要。范围在0-255之间的数值表达式,在新的一行开始之前,指出在该行上可出现多少字符。如果width等于0,则行的长度不受限制。width的缺省值为0。功能:将一个输出行的宽度指定给用Open语句打开的

46、文件。示例:DimIOpenf:TESTFILE.txtForOutputAs#1Width#1,5ForI=0To9Width#1,5ForI=0To9Print#1,Chr(48+I);NextI设置输出行宽为5。循环10次。每行输出五个字符。Close#1以上代码写入的内容如下0123456789(四)处理二进制文件打开二进制文件可以使用Open语句的Random和Binary方式打开。二进制文件读写使用Get和Put语句。1、Put语句语法:Put#filenumber,recnumber,varnamerecnumber可选。Variant(Long)。记录号(Random方式的文件

47、)或字节数(Binary方式的文件),指明在此处开始写入。说明:通常用Get将Put写入的文件数据读出来。示例:DimnumAsLong,textAsStringnum=12345text=astringOpenf:data.binForBinaryAs#1打开或创建一个二进制文件Put#1,numPut#1,textClose#1写入4个字节写入8个字节(字符串长为8)2、Get语句语法:Get#filenumber,recnumber,varnamerecnumber可选。Variant(Long)。记录号(Random方式的文件)或字节数(Binary方式的文件),以表示在此处开始读出数

48、据。功能:将一个已打开的磁盘文件读入一个变量之中。说明:通常用Put将Get读出的数据写入一个文件。示例:读取以上代码写入的内容DimnumAsLong,textAsStringOpenf:data.binForBinaryAs#1Get#1,numtext=Space$(8)准备8个字节的字符串Get#1,text读入Debug.Printnum,textClose#1在立即窗口可以看到如下内容:12345astring3、Seek语句语法:Seek#filenumber,position其中position为介于12,147,483,647(相当于2人31-1)之间的数字,指出下一个读写操

49、作将要发生的位置。功能:在Open语句打开的文件中,设置下一个读/写操作的位置。说明:可以用Seek语句指定Get语句的读取位置,但在Get及Put语句中指定的记录号将覆盖由Seek语句指定的文件位置。示例:DimMaxSize,NextChar,MyCharOpenTESTFILEForInputAs#1MaxSize=LOF(1)取得文件的总字符数。用循环读入所有记录,但是从最后的记录开始往前读。ForNextChar=MaxSizeTo1Step-1Seek#1,NextChar设置读写位置。MyChar=Input(1,#1)读入一字符。NextNextCharClose#14、See

50、k函数语法:Seek(filenumber)功能:返回一个Long,在Open语句打开的文件中指定当前的读/写位置。说明:在使用Get语句读取文件时,必须用LOF函数来判断是否到达文件末尾,而不是用EOF函数。可以使用Seek函数判断当前位置,然后与LOF的值比较。示例:DoWhileSeek(1)LOF(1)继续读取Loop(五)总结VBA语句的文件操作涵盖了文件操作的绝大部分内容,很多函数的使用也很简单,一般的文件读写也非常方便,特别是对文本文件。但对于复杂的文件读写,代码的结构和维护性都不好。因此在VB6之后,微软引入了FileSystemObject对象模型,提供了面向对象的类库,来操作驱动器、文件夹和文件。但对于二进制文件的操作,目前还只能用VBA语句。Excel文件本身就是二进制文件,它使用的文件格式叫做BIFF(BinaryInterchangeFileFormat),即二进制可交换文件格式(但2007开始使用OOXML格式)。关于其内部的结构,本人也在研究中。以二进制结构打开Excel文件,不但可以读取其表格中的数据,还可以读取其所有的信息(包括密码)。注意,以Open语句打开文件,并不是我们通常的双击一个文件打开显示到屏幕上,而是将其存放在磁盘上的数据读入到缓冲区,不是可视化的打开。这种打开是不需要密码的,即使你的Excel

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论