




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Excel-VBA操作文件四大方法之二、利用VBA文件处理语句来处理文件VBA包含了许多用于文件操作的语句和函数,可以满足绝大多数情况下的文件操作要求。面我们按照操作目的进行一一介绍。一)文件处理1、Name 语句语法: Name oldpathname As newpathname 功能:重命名一个文件、目录、或文件夹,移动一个文件。说明:在一个已打开的文件上使用Name,将会产生错误。进行文件操作时,一定要注意错误处理。示例:On Error Resume Next '错误处理Name "f:TEST.xls" As "f:TEST123.xls&qu
2、ot; '重命名Name "f:TEST.xls" As "f:dllTEST.xls" '移动文件Name "f:TEST.xls" As "d:TEST123.xls" '跨驱动器移动并重命名文件注意: Name 不能移动一个目录或文件夹。2、FileCopy 语句语法: FileCopy source, destination 功能:复制一个文件。说明:如果对一个已打开的文件使用 FileCopy 语句,则会产生错误。示例:FileCopy "f:TEST.xls"
3、, "e:TEST.xls"从 F盘复制 TEST.xls到 E盘3、Kill 语句语法: Kill pathname 功能:从磁盘中删除文件。说明: Kill 支持多字符 (*) 和单字符 (?) 的统配符来指定多重文件。如果使用 Kill 来删除 一个已打开的文件,则会产生错误。示例:Kill "f:TEST.xls"'删除 F盘的 TEST.xls文件Kill "f:*.xls"'删除F盘所有xls文件4、GetAttr 函数语法: GetAttr(pathname) 功能:获取一个文件、目录、或文件夹的属性。返
4、回一个Integer 值。返回值由 GetAttr 返回的值,是下面这些属性值的总和:常数 值 描述 vbNormal 0 常规 vbReadOnly 1 只读 vbHidden 2 隐藏 vbSystem 4 系统文件 vbDirectory 16 目录或文件夹 vbArchive 32 存档文件vbalias 64 指定的文件名是别名。只在 Macintosh 中可用。 说明:若要判断是否设置了某个属性,在GetAttr 函数与想要得知的属性值之间使用And运算符与逐位比较。如果所得的结果不为零,则表示设置了这个属性值。示例:Debug.Print GetAttr("F:test
5、.txt") ' 若为存档文件,在立即窗口可看到值为 32Debug.Print GetAttr("F:test.txt") ' 将属性 高级 可存档文件的勾去掉后,值为 0 为判断一个文件是否只读,可用下法 :Debug.Print GetAttr("F:test.txt") And vbReadOnly 若值非零,说明时只读的。5、SetAttr 语句语法: SetAttr pathname, attributes 功能:为一个文件设置属性。 说明:如果想要给一个已打开的文件设置属性,则会产生运行时错误。 示例:SetAtt
6、r"F:test.txt", vbHidden ' 设置隐藏属性。SetAttr"F:test.txt", vbHidden + vbReadOnly' 设置隐藏并只读。6、FileLen 函数 语法: FileLen(pathname)功能:获取一个文件的长度,单位是字节。说明:当调用 FileLen 函数时,不需要打开文件,如果所指定的文件已经打开,则返回的值 是这个文件在打开前的大小。7、FileDateTime 函数语法: FileDateTime(pathname) 功能:获取一个文件被创建或最后修改后的日期和时间。示例:Deb
7、ug.Print FileDateTime("F:TEST.xls") '在立即窗口可看到 2007-3-29 19:28:27(二)目录处理1、CurDir 函数 语法: CurDir(drive) 功能:返回当前的路径。说明: drive 参数是可选的,它指定一个存在的驱动器。如果没有指定驱动器,或 drive 是 零长度字符串 ("") ,则 CurDir 会返回当前驱动器的路径。示例:Debug.Print CurDir ' 返回 “ C:My Documents ”。Debug.Print CurDir("C"
8、;) ' 返回 “C: My Documents ”。 Debug.Print CurDir("D") ' 返回 “ D:”。2、ChDir 语句 语法: ChDir path 功能:改变当前的目录或文件夹。说明: ChDir 语句改变缺省目录位置,但不会改变缺省驱动器位置。缺省驱动器一般是C。示例:ChDir "D:temp"Debug.Print CurDir ' 返回 “ C:My Documents ”。Debug.Print CurDir("D") ' 返回 “ D:temp ”。与上例比较,
9、此时 D盘的当前目录已经变为“Dtemp”,但是缺省驱动器还是 C。3、ChDrive 语句语法:ChDrive drive功能:改变当前的驱动器。说明: 如果使用零长度的字符串 (""),则当前的驱动器将不会改变。 如果 drive 参数中有多 个字符,则 ChDrive 只会使用首字母。示例:ChDrive "D"ChDir "D:temp"Debug.Print CurDir '返回 “ Dtemp ”。Debug.Print CurDir("D") ' 返回 “D:temp”。与上例比较,用
10、 CurDir返回的是“Dtemp”,当前驱动器已经变为D 了。4、Dir 函数语法: Dir(pathname, attributes)两个参数都是可选的, attributes 表示文件属性。功能: 返回一个文件名、 目录名或文件夹名称,它必须与指定的模式或文件属性、或磁盘卷标相匹配。说明:在第一次调用Dir函数时,必须指定 path name,否则会产生错误。如果也指定了文件属性,那么就必须包括 pathname。Dir 会返回匹配 pathname 的第一个文件名。 若想得到其它匹配 pathname 的文件名, 再一 次调用Dir,且不要使用参数。如果已没有合乎条件的文件,则Dir会
11、返回一个零长度字符串(”)。一旦返回值为零长度字符串,并要再次调用 Dir时,就必须指定path name,否则会产生错误。不必访问到所有匹配当前pathname 的文件名,就可以改变到一个新的pathname 上。但是,不能以递归方式来调用 Dir 函数。以 vbDirectory 属性来调用 Dir 不 能连续地返回子目录。示例:Debug.Print Dir("F:TEST.xls") '返回 "TEST.xls"Debug.Print Dir("F:*.xls") '返回按条件第一个找到的文件名。Debug.P
12、rint Dir("F:*.txt",vbReadOnly) '返回第一个只读的 txt 文件以下过程可显示 C盘根目录下的所有目录.Sub DirC()MyPath = "c:"MyName = dir(MyPath, vbDirectory) ' 找寻第一项。Do While MyName <> ""' 开始循环。' 跳过当前的目录及上层目录。If MyName <> "." And MyName <> "." Then
13、39; 使用位比较来确定 MyName 代表一目录。If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory ThenDebug.Print MyName ' 如果它是一个目录,将其名称显示出来。End IfEnd IfMyName = dir ' 查找下一个目录。LoopEnd Sub 以下过程利用递归可以查找目录和子目录下的所有文件。Public Sub FindFile(mPath As String, Optional sFile As String = "")On Error R
14、esume NextDim s As String, sDir() As StringDim i As Long, d As LongIf Right(mPath, 1) <> "" ThenmPath = mPath & ""End If'查找目录下的文件s = dir(mPath & sFile, vbArchive + vbDirectory + vbHidden + vbNormal + vbReadOnly + vbSystem) Do While s <> ""Debug.P
15、rint mPath & ss = dirLoop'查找目录下的子目录s = dir(mPath, vbArchive + vbDirectory + vbHidden + vbNormal + vbReadOnly + vbSystem) Do While s <> ""If s <> "." And s <> "." ThenIf (GetAttr(mPath & s) And vbDirectory) = vbDirectory Thend = d + 1ReDim P
16、reserve sDir(d)sDir(d) = mPath & sEnd IfEnd Ifs = dirLoop'开始递归For i = 1 To dFindFile sDir(d) & ""NextEnd Sub5、MkDir 语句语法: MkDir path 功能:创建一个新的目录或文件夹。说明: path 可以包含驱动器。如果没有指定驱动器,则 MkDir 会在当前驱动器上创建新的 目录或文件夹。示例:MkDir "MYDIR" '在当前目录建立新的目录或文件夹。6、RmDir 语句语法: RmDir path 功
17、能:删除一个存在的目录或文件夹。说明:如果想要使用 RmDir 来删除一个含有文件的目录或文件夹,则会发生错误。在试图 删除目录或文件夹之前,先使用 Kill 语句来删除所有文件。示例:RmDir "MYDIR" ' 将 MYDIR 删除。 (三)处理文本文件1、Open 语句语法: Open pathname For mode Access access lock As #filenumber Len=reclength 其中 access、 lock、reclength 为可选参数,一般不用。mode 指定打开文件的方式。有 5 种:Input :以输入方式打开
18、,即读取方式。Output :以输出方式打开,即写入方式。Append :以追加方式打开,即添加内容到文件末尾。Binary:以二进制方式打开。Ran do m:以随机方式打开,如果未指定方式,则以Ran dom方式打开文件。filenumber 是一个有效的文件号, 范围在 1 到 511 之间。可以指定, 也可使用 FreeFile 函 数可得到下一个可用的文件号。说明:如果 pathname 指定的文件不存在, 那么,在用 Append、Binary、Output 、或 Random 方式打开文件时,可以建立这一文件。示例:Open "F:TEST.txt" For
19、Input As #1 '以输入方式打开Open "F:TEST.xls" For Binary As #1 以' 二进制方式打开2、Close 语句语法: Close filenumberlistfilenumberlist 参数为一个或多个文件号, 若省略 filenumberlist ,则将关闭 Open 语句打 开的所有活动文件。说明:打开文件后,必须在使用完后关闭文件。示例:Dim I, FileNameFor I = 1 To 3FileName = "TEST" & I ' 创建文件名。Open FileNa
20、me For Output As #I ' 打开文件。Print #I, "This is a test." ' 将字符串写入文件。Next IClose ' 将三个已打开的文件全部关闭。3、Reset 语句语法: Reset 功能:关闭所有用 Open 语句打开的磁盘文件。说明: Reset 语句关闭 Open 语句打开的所有活动文件, 并将文件缓冲区的所有内容写入磁 盘。示例:Dim FileNumberFor FileNumber = 1 To 5Open "TEST" & FileNumber For Output
21、 As #FileNumberWrite #FileNumber, "Hello World" ' 将数据写入文件。Next FileNumberReset ' 关闭文件并将缓冲区内的数据写到磁盘中。4、FreeFile 函数 语法: FreeFile(rangenumber)参数 rangenumber 指定一个范围,以便返回该范围之内的下一个可用文件号。指定 0 (缺省值)则返回一个介于1 -255之间的文件号。指定1则返回一个介于 256 -511之间的文件号。功能:提供一个尚未使用的文件号。示例:Dim fnum As Integer fnum =
22、FreeFile Open "F:TEST.txt" For Input As #fnum Close #fnum5、EOF 函数语法: EOF(filenumber)功能:返回一个In teger,它包含 Boolean值True,表明已经到达为 Ra ndom或顺序In put 打开的文件的结尾。6、LOF 函数语法: LOF(filenumber)功能:返回一个 Long,表示用 Open语句打开的文件的大小,该大小以字节为单位。7、Loc 函数语法: LOc(filenumber)功能:返回一个 Lo ng,在已打开的文件中指定当前读/写位置。8、Input # 语
23、句语法: Input #filenumber, varlist功能:从已打开的顺序文件中读出数据并将数据指定给变量。说明:通常用 Write # 将 Input # 语句读出的数据写入文件。为了能够用 Input # 语句将文 件的数据正确读入到变量中,在将数据写入文件时,要使用Write # 语句而不使用 Print #语句。使用 Write # 语句可以确保将各个单独的数据域正确分隔开。示例:本示例使用In put #语句将文件内的数据读入两个变量中。本示例假设TESTFILE文件内含数行以 Write # 语句写入的数据; 也就是说, 每一行数据中的字符串部分都是用双引号括起 来,而与数
24、字用逗号隔开,例如, ("Hello", 234 )。Dim MyString, MyNumberOpen "TESTFILE" For Input As #1' 打开输入文件。Do While Not EOF(1) ' 循环至文件尾。Input #1, MyString, MyNumber ' 将数据读入两个变量。Debug.Print MyString, MyNumber ' 在立即窗口中显示数据。LoopClose #1' 关闭文件。9、Write # 语句语法: Write #filenumber, out
25、putlist 功能:将数据写入顺序文件。说明:通常用 Input # 从文件读出 Write # 写入的数据。如果省略 outputlist ,并在 filenumber 之后加上一个逗号, 则会将一个空白行打印到文件中。 多个表达式之间可用空白、分号或逗号隔开。空白和分号等效。用 Write # 将数据写入文件时将遵循几个通用的约定, 使得无论什么区域都可用 Input # 读 出并正确解释数据:在写入数值数据时总使用句号作为十进制分隔符。对于Boolean类型的数据,或者打印#TRUE#或者打印#FALSE#无论在什么地区,都不将 True 和 False 这两个关键字翻译出来。使用通用
26、的日期格式将Date类型的数据写入文件中。当日期或时间的部件丢失或为零时,只将现有部分写入文件中。如果outputlist的数据为 Empty,则不将任何数据写入文件。但对Null数据,则要写入#NULL#。如果outputlist数据为Null数据,则将 #NULL#写入文件中。对于Error类型的数据,输出看起来与#ERRORerrorcode# 样。无论在什么地区,都不将关键字 Error 翻译出来。与 Print # 语句不同,当要将数据写入文件时, Write # 语句会在项目和用来标记字符串的 引号之间插入逗号。没有必要在列表中键入明确的分界符。Write # 语句在将 outpu
27、tlist 中的最后一个字符写入文件后会插入一个新行字符,即回车换行符,(Chr(13) + Chr(10)。示例:Open "F:test.txt" For Output As #1' 打开输出文件。Write #1, "Hello World", 1234' 写入以逗号隔开的数据。Write #1,' 写入空白行。Dim MyBool, MyDate, MyNull, MyError' 赋值 Boolean 、Date、Null 及 Error 等。MyBool = False : MyDate = #February
28、 12, 1969# : MyNull = NullMyError = CVErr(32767)' Boolean 数据以 #TRUE# 或 #FALSE# 的格式写入。' 日期以通用日期格式写入,例如: #1994-07-13# 代表' 1994 年 1 月 13 日。 Null 数据以 #NULL# 格式写入。'Error数据以#ERROR错误代号#的格式写入。Write #1, MyBool; " is a Boolean value"Write #1, MyDate; " is a date"Write #1, M
29、yNull; " is a null value"Write #1, MyError; " is an error value"Close #1' 关闭文件。我们可以看到写入的内容为:"Hello World",1234#FALSE#," is a Boolean value"#1969-02-12#," is a date"#NULL#," is a null value" #ERROR 32767#," is an error value"10
30、、Line Input # 语句 语法: Line Input #filenumber, varnameString 变量。功能:从已打开的顺序文件中读出一行并将它分配给说明:通常用 Print # 与 Line Input # 语句配合使用。Line In put #语句一次只从文件中读出一个字符,直到遇到回车符(Chr(13)或回车换行符(Chr(13) + Chr(10)为止。回车-换行符将被跳过,而不会被附加到字符串上。示例:Dim TextLineOpen "TESTFILE" For Input As #1' 打开文件。Do While Not EOF(
31、1) ' 循环至文件尾。Line Input #1, TextLine ' 读入一行数据并将其赋予某变量。Debug.Print TextLine ' 在立即窗口中显示数据。LoopClose #1' 关闭文件。11、Input 函数语法: Input(number, #filenumber)其中 number 指定要返回的字符个数。功能:返回Strin g,它包含以In put或Binary方式打开的文件中的字符。说明:通常用 Print # 或 Put 将 Input 函数读出的数据写入文件。 Input 函数只用于以 Input 或 Binary 方式打开
32、的文件。与 Input # 语句不同, Input 函数返回它所读出的所有字符,包括逗号、回车符、空白列、 换行符、引号和前导空格等。示例:Dim MyCharOpen "f:test.txt" For Input As #1Do While Not EOF(1) ' 循环至文件尾。MyChar = Input(1, #1)' 读入一个字符。Debug.Print MyChar ' 显示到立即窗口。LoopClose #1下面这个函数可以将文本文件的数据一次读入到一个字符串 (但是若包含中文时会出错, 因 为一个中文字占 2 个字节)。Public
33、Function ReadText(FileName As String)Dim fnum%, isopen As BooleanOn Error GoTo errofnum = FreeFile()Open FileName For Input As #fnumisopen = TrueReadText = Input(LOF(fnum), fnum)erro:If isopen Then Close #fnumIf err Then Debug.Print err.Number, err.DescriptionEnd Function12、Print # 语句语法: Print #file
34、number, outputlistoutputlist 参数的设置如下:Spc(n) | Tab(n) expression charposSpc(n) 用来在输出数据中插入空白字符,而 n 指的是要插入的空白字符数。Tab(n) 用来将插入点定位在某一绝对列号上,这里, n 是列号。使用无参数的 Tab 将插入 点定位在下一个打印区的起始位置。expression 要打印的数值表达式或字符串表达式。charpos 指定下一个字符的插入点。 使用分号将插入点定位在上一个显示字符之后。 用 Tab(n) 将插入点定位在某一绝对的列号上,用无参数的 Tab 将插入点定位在下一个打印区的起始 处。
35、如果省略 charpos,则在下一行打印下一个字符。功能:将格式化显示的数据写入顺序文件中。说明 :通常用 Line Input # 或 Input 读出 Print # 在文件中写入的数据。示例:Open "F:test.txt" For Output As #1' 打开输出文件。Print #1, "This is a test"' 将文本数据写入文件。Print #1,' 将空白行写入文件。Print #1, "Zone 1" Tab; "Zone 2"' 数据写入两个区( p
36、rint 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, MyErrorMyBool = False: MyDate
37、 = #2/12/1969#: MyNull = NullMyError = 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
38、"Close #1以上代码写入的内容如下:This is a testZone 1 Zone 2Hello World5 leading spacesHelloFalse is a Boolean value1969-2-12 is a dateNull is a null valueError 32767 is an error value13、Width # 语句语法: Width #filenumber, widthwidth必要。范围在 0 -255之间的数值表达式,在新的一行开始之前,指出在该行上可出 现多少字符。如果 width 等于 0,则行的长度不受限制。 width
39、 的缺省值为 0。 功能:将一个输出行的宽度指定给用 Open 语句打开的文件。示例:Dim IOpen "f:TESTFILE.txt" For Output As #1' 设置输出行宽为 5。' 循环 10 次。' 每行输出五个字符。Width #1, 5For I = 0 To 9Print #1, Chr(48 + I);Next IClose #1 以上代码写入的内容如下:01234Open 语句的 Random 和 Binary 方式打开。二进制文件读写使用56789 (四)处理二进制文件 打开二进制文件可以使用 Get 和 Put 语句
40、。1、Put 语句 语法: Put #filenumber, recnumber, varname recnumber 可选。 Variant (Long) 。记录号( Random 方式的文件)或字节数( Binary 方式的 文件),指明在此处开始写入。说明:通常用 Get 将 Put 写入的文件数据读出来。 示例:Dim num As Long, text As String num = 12345 text = "a string"Open "f:data.bin" For Binary As #1 ' 打开或创建一个二进制文件Put #
41、1, , num' 写入 4 个字节Put #1, , text'写入 8 个字节(字符串长为 8)Close #12、Get 语句语法: Get #filenumber, recnumber, varnamerecnumber 可选。 Variant (Long) 。记录号( Random 方式的文件)或字节数( Binary 方式的 文件),以表示在此处开始读出数据。功能:将一个已打开的磁盘文件读入一个变量之中。说明:通常用 Put 将 Get 读出的数据写入一个文件。 示例:读取以上代码写入的内容Dim num As Long, text As StringOpen "f:data.bin" For Binary As #1Get #1, , numtext = Space$(8)' 准
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版出租车司机劳动合同标准模板
- 2025年车辆抵押贷款客户隐私保护合同范本
- 2025年大模型知识蒸馏(含答案与解析)
- 2025标识牌安全警示标识设计制作及售后服务合同范本
- 2025独家婚庆策划广告代理服务合同范本
- 2019年江西省中考物理模拟试卷及答案(组合)
- 2019年福建省漳州市毕业生学业水平考试物理仿真试题(一)附答案
- 2025年太空探索AI应用习题(含答案与解析)
- 《病区医院感染管理规范》试题及答案
- 石材台阶施工方案
- 七年级体育 立定跳远测验教案 人教新课标版
- 学校保洁外包服务投标方案(技术方案)
- Pep小学英语六年级上册教案-全册
- 人教鄂教版六年级科学上册全册教学设计教案
- 关爱流浪小动物(教学设计)-2024-2025学年三年级上册综合实践活动教科版
- 2024年新高考试题分析及2025届备考策略建议课件
- 中东及非洲天然甜菊行业现状及发展机遇分析2024-2030
- 《山区公路桥梁典型病害手册(试行)》
- 临床中医适宜技术书
- 矿山生态环境保护与恢复治理技术规范(试行)(HJ 651-2013)
- 新译林版高一必修三单词表全套
评论
0/150
提交评论