Excel VBA 学习总结 - 文件系统
文件系统是平时任务中用到的相当多的一个方面,所以这里专门给总结一下文件系统方面的操作。数据库文件(例如Access文件) 其实也是一种特殊的文件格式,也可以通过这里介绍的方式处理,但是作为特殊的数据格式文件,VBA中有特别的方式处理它,这个会在后面数据处理中总结。这里的文件指的就是普通的Excel文件、文本文件、二进制文件、XML文件等。
  在VBA中操作文件主要是通过以下几种方式:
一、使用Excel中的对象处理文件
  Excel中代表Excel文件的对象是Workbook,所以操作文件的主要手段也就是利用Workbook或者Workbooks集合的相关方法。主要的方法总结如下:
1、打开文件
打开Excel文件:Workbooks.Open。
打开文本文件:Workbooks.OpenText。
打开XML文件:Workbooks.OpenXML。
打开数据库文件:Workbooks.OpenDatabase。
注意:使用Open方法也可以打开文本文件,但建议使用OpenText方法。此方法是载入一个文
本文件,并将其作为包含单个工作表的工作簿进行分列处理,然后在此工作表中放入经过分列处理的文本文件数据。
2、保存文件
文件的保存可以通过几种方式实现:
使用Workbook对象的Save或SaveAs方法。
使用Application.Dialogs,显示标准的“另存为”对话框。
使用Application.GetSaveAsFilename可以调出标准的“另存为”对话框,获取用户文件名,但并不真正保存任何文件,然后可以使用代码保存文件。还有Application.GetOpenFileName也可以调出标准的“打开”对话框,返回用户选中或填写的文件名,但是返回后并不真打开选中文件。
3、关闭文件
关闭文件可以使用Workbooks集合或Workbook对象的 Close 方法。前者是关闭所有打开的工作簿,后者关闭特定的工作簿。
总结:利用Excel对象的方法进行Excel文件的操作是最简单,也是最方便的。虽然利用Workbook对象也可以打开其他的一些文件,但是都不是最佳的手段,而且这个对象对文件的操控性很弱,无法实现很多文件系统的操作,所以一般操作文件的时候,都要结合其他的集中手动来共同协作完成任务。
 
二、使用VBA内置的文件处理函数处理文件
VBA内置了很多用于文件操作的语句和函数,可以满足大多数情况下的文件的相关操作。下面我总结一下。
(一)文件处理
打开文件:Open…For…AS…
For后面的打开模式不同,决定了后面的内容处理方式也不同,常用的有打开成读入模式,写入模式,追加模式,二进制模式,随机模式等等。如果要打开二进制文件,则可以选择后两种模式。As后面可以指定打开后的文件号(1到511),指定了文件号以后,VBA几乎所有内置的文件处理函数就都使用这个文件号处理文件。一般可以用FreeFile函数获得没有使用的文件号。
以Open语句打开文件,并不是我们通常的双击一个文件打开显示到屏幕上,而是将其存放在磁盘上的数据读入到缓冲区,不是可视化的打开。这种打开是不需要密码的,即使你的Excel文件设置了打开密码,还是照打开不误,这也正是Excel文件不安全的根源所在。
辅助函数:
FreeFile函数:获得没有使用的文件号
Width函数:设置文档中每行的宽度(0~255)。如果 width 等于 0,则行的长度不受限制。width 的缺省值为 0。
关闭文件:Close,Reset
说明:打开文件后,必须在使用完后关闭文件,这里的文件名可以传入打开时指定的文件号。
如果使用Close语句,但是关闭的文件名省略,则会关闭所有使用Open语句打开的文件。使用Reset函数会关闭所有Open语句打开的文件,并将文件缓冲区的数据全部写入磁盘。
重命名文件:Name
拷贝文件:FileCopy
移动文件:Name函数也可以,修改全路径即可。
判断文件是否存在:Dir
删除文件:Kill
读取文件内容
  读取文件的内容通常需要的辅助函数(一般用于标识读取的位置):
    EOF 函数:EOF(filenumber)
    功能:返回一个 Integer,它包含 Boolean 值 True,表明已经到达为 Random 或顺序 Input 打开的文件的结尾。
    LOF 函数:LOF(filenumber)
    功能:返回一个 Long,表示用 Open 语句打开的文件的大小,该大小以字节为单位。
    Loc 函数:LOc(filenumber)
    功能:返回一个 Long,在已打开的文件中指定当前读/写位置。
    Seek#语句
    功能:可以用Seek语句指定Get/Input语句的读取位置;一般结合使用LOF函数,使用循环读取所有数据。
    Seek函数
    功能:返回一个Long值,在用Open 语句打开的文件中指定当前的读/写位置。
    说明:在使用Get语句读取文件时,必须用LOF函数来判断是否到达文件末尾,而不是用EOF函数。可以使用Seek函数判断当前位置,然后与LOF的值比较。
    例如:Do While Seek(1) < LOF(1)
           '继续读取
           ......
        Loop
  读取文本文件内容:
    Input #语句
    功能:从已打开的顺序文件中读出数据并将数据指定给变量。
    Line Input函数
    功能:从已打开的顺序文件中读出一行并将它分配给 String 变量。
    Input函数
    功能:返回包含指定数目的字符的字符串,它包含以 Input 或 Binary 方式打开的文件中的字符。
    说明:通常用 Print # 或 Put 将 Input 函数读出的数据写入文件。Input 函数只用于以 Input 或 Binary 方式打开的文件。与 Input # 语句不同,Input 函数返回它所读出的所有字符,包括逗号、回车符、空白列、换行符、引号和前导空格等。

  读取二进制文件内容:
    Get语句
    功能:将一个已打开的磁盘文件读入一个变量之中。

写入文件内容
  写入文本文件内容:
    Write # 语句
    功能:将数据写入顺序文件。
    如果省略写入的内容,并在文件号之后加上一个逗号,则会将一个空白行打印到文件中。多个表达式之间可用空白、分号或逗号隔开。空白和分号等效。与 Print # 语句不同,当要将数据写入文件时,Write # 语句会在项目和用来标记字符串的引号之间插入逗号。没有必要在列表中键入明确的分界符。Write # 语句在将 outputlist 中的最后一个字符写入文件后会插入一个新行字符,即回车换行符,(Chr(13) + Chr(10))。
    Print # 语句
    功能:将格式化显示的数据写入顺序文件中。
    说明:通常用 Line Input # 或 Input 读出 Print # 在文件中写入的数据。
    说明:通常用 Write # 将 Input # 语句读出的数据写入文件。为了能够用 Input # 语句将文件的数据正确读入到变量中,在将数据写入文件时,要使用 Write # 语句而不使用 Print # 语句。使用 Write # 语句可以确保将各个单独的数据域正确分隔开。


  写入二进制文件内容
    Put 语句
    说明:通常用Put 把二进制内容写入到文件。
获取和设置文件/文件夹属性:GetAttr,SetAttr
返回文件长度(字节):FileLen
获取文件的创建或最后修改时间:FileDateTime
Name不能移动一个目录或文件夹。
如果对一个已打开的文件使用 FileCopy 语句,则会产生错误。
Kill 支持多字符 (*) 和单字符 (?) 的统配符来指定多重文件。如果使用 Kill 来删除一个已打开的文件,则会产生错误。
若要判断是否设置了某个属性,在 GetAttr 函数与想要得知的属性值之间使用 And 运算符与逐位比较。如果所得的结果不为零,则表示设置了这个属性值。
vba计算字符串长度如果想要使用SetAttr给一个已打开的文件设置属性,则会产生运行时错误。可以一次设置多个属性,属性值相加即可。例如设置文件为隐藏和只读
SetAttr "F:\", vbHidden + vbReadOnly      ' 设置隐藏并只读。
当调用 FileLen 函数时,不需要打开文件,如果所指定的文件已经打开,则返回的值是这个文件在打开前的大小。
重量级选手:Dir语法:Dir[(pathname[, attributes])] ,两个参数都是可选的,attributes表示文件属性。
功能:返回一个文件名、目录名或文件夹名称,它必须与指定的模式或文件属性、或磁盘卷标相匹配。
说明:在第一次调用 Dir 函数时,必须指定 pathname,否则会产生错误。如果也指定了文件属性,那么就必须包括 pathname。
Dir 会返回匹配 pathname 的第一个文件名。若想得到其它匹配 pathname 的文件名,再一次调用 Dir,且不要使用参数。如果已没有合乎条件的文件,则 Dir 会返回一个零长度字符串 ("")。一旦返回值为零长度字符串,并要再次调用 Dir 时,就必须指定 pathname,否则会产生错误。不必访问到所有匹配当前 pathname 的文件名,就可以改变到一个新的 pathname 上。但是,不能以递归方式来调用 Dir 函数。以 vbDirectory 属性来调用 Dir 不能连续地返回子目录。

(二)目录处理
1、返回当前的路径:CurDir
说明:drive 参数是可选的,它指定一个存在的驱动器。如果没有指定驱动器,或 drive 是零长度字符串 (""),则 CurDir 会返回当前驱动器的路径。
2、改变当前的目录或文件夹:ChDir
说明:ChDir 语句改变缺省目录位置,但不会改变缺省驱动器位置。缺省驱动器一般是C。
3、改变当前的驱动器:ChDrive
说明:如果使用零长度的字符串 (""),则当前的驱动器将不会改变。如果 drive 参数中有多个字符,则 ChDrive 只会使用首字母。
4、判断文件夹是否存在:Dir
5、重命名文件夹:Name
6、创建一个新的目录或文件夹:MkDir
说明:path 可以包含驱动器。如果没有指定驱动器,则 MkDir 会在当前驱动器上创建新的目录或文件夹。
7、删除一个存在的目录或文件夹:RmDir
说明:如果想要使用 RmDir 来删除一个含有文件的目录或文件夹,则会发生错误。在试图删除目录或文件夹之前,先使用 Kill 语句来删除所有文件。
函数的具体使用可以参考人气链接:lhome/forum.php?mod=viewthread&tid=230215
 
三、使用FileSystemObject对象处理文件
FileSystemObject(简称为FSO,需Office 2000以后版本)对象模型,是微软提供的专门用来访问计算机文件系统的,具有大量的属性、方法和事件。
FileSystemObject对象模型
FileSystemObject主对象,包含用来创建、删除和获得有关信息,以及用来操作驱动器、文件夹和文件的方法和属性。
Drive对象,包含用来获得和操作驱动器的方法和属性。驱动器不一定是硬盘,也可以是CD-ROM、U盘甚至是网络硬盘。
Drives 集合,提供驱动器的列表,这些驱动器以实物或在逻辑上与系统相连接。Drives集合包括所有驱动器,与类型无关。
File对象,包含用来创建、删除或移动文件的方法和属性。
Files集合,提供包含在文件夹内的所有文件的列表。
Folder对象,包含用来创建、删除或移动文件夹的方法和属性。
Folders集合,提供包含在文件夹内的所有文件夹的列表。
TextStream对象,用来读写文本文件。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。