大家好,我们今日讲解“VBA信息获取与处理”教程中第十七个专题“文件及文件夹信息的获取及操作”的第三节“利用VBA获取文件的信息和属性”,这个专题是非常实用的知识点,希望大家能掌握利用。教程会提供配套的程序文件。
第三节 利用VBA获取文件的信息和属性
我们在识别某个文件的时候,基本的操作首先是看资源管理器中的信息,其次是右键,点击属性,查看相关的介绍:
我们在写代码的时候遇到需要利用这些信息的情况,该如何去处理呢?今日这讲的内容就来是如何获得文件的信息及属性。
1 利用内置函数的方法获取信息
1)文件的大小:为了得到文件的大小,我们可以利用FileLen函数
FileLen函数:返回以字节表示的指定文件长度的 Long 值。
语法:FileLen(PathName)
参数:PathName必选。指定文件的 String 表达式。PathName可以包含目录(或文件夹)和驱动器。
备注:如果当调用FileLen函数时指定的文件是打开的,则返回的值表示文件打开时该文件的大小。若要获取打开文件的当前长度,请使用 LOF 函数。
2)文件的最后修改时间:为了获得文件的最后修改时间我们可以使用FileDateTime函数
FileDateTime函数:返回指示创建或最后修改文件的日期和时间的 Date 值。
语法:FileDateTime(PathName)
参数:PathName必选。指定文件的 String 表达式。PathName可以包含目录(或文件夹)和驱动器。
备注:使用FileDateTime函数显示的日期和时间的格式基于系统的区域设置。
3)文件的属性:为了获得文件的属性可以利用GetAttr函数
GetAttr函数:返回表示文件、目录或文件夹的属性的FileAttribute值。
参数:PathName必选。指定文件、目录或文件夹名的 String 表达式。PathName可以包括目录(或文件夹)和驱动器
由GetAttr返回的值是下列枚举值的和:
值 常数 说明
Normal vbNormal 正常。
ReadOnlyvbReadOnly 只读。
Hidden vbHidden 隐藏。
System vbSystem 系统文件。
Directory vbDirectory 目录或文件夹。
Archive vbArchive 自从上次备份后文件已更改。
Alias vbAlias 文件具有不同的名称。
备注:若要确定设置了哪几个属性,请使用 And 运算符对GetAttr函数返回的值以及您想要的个别文件属性值执行按位比较。如果结果不是零,则为命名的文件设置该属性。例如,如果没有设置 Archive 属性,则下列 And 表达式的返回值为零:
Result = GetAttr(FName) And vbArchive
4)设置文件属性,为了设置文件的属性可以利用SetAttr函数
语法:SetAttrPathNameAs String, Attributes As FileAttribute
参数:
PathName必需。指定文件名的 String 表达式。PathName可以包含目录(或文件夹)和驱动器。
Attributes 必需。常数或数值表达式,其和指定文件属性。Attributes 参数枚举值同上返回的枚举值。
2 利用FSO的方法获取信息
为了获取文件的必要信息,我们还可以利用FSO方案,首先利用下面的语句:
Set objFile=object.GetFile(filespec)
参数:
GetFile()返回与指定路径中的文件相对应的File对象。(GetFile方法不支持使用通配符)
Object必需。始终是FileSystemObject的名称。
Filespec必需。文件规范是路径(绝对或相对)到一个特定的文件。
然后利用objFile的一些属性就可以完成获取信息的操作:
1)文件的大小:可以利用Size 属性,对于文件,返回指定文件的大小(以字节为单位)。对于文件夹,返回文件夹中包含的所有文件和子文件的大小(以字节为单位)。
语法:objFile.Size
参数:objFile始终为文件或文件夹对象
2)文件的最后修改时间:可以利用DateCreated属性,返回创建指定文件或文件夹的日期和时间。此为只读属性。
语法:objFile.DateCreated
参数:objFile始终为文件或文件夹对象
3)文件的属性的获得和设置:可以利用Attributes属性设置或返回文件或文件夹的属性。可读/写或只读,具体取决于属性。
语法:objFile.Attributes [= newattributes ]
参数:objFile 必需。始终是文件或文件夹对象的名称。
Newattributes可选。如果提供,则newattributes为指定 object 的属性的新值。
Newattributes参数可以具有以下任意值或以下值的任意逻辑组合。
Constant Value Description
Normal 0 Normal file. No attributes are set.(普通文件,未设置属性)
ReadOnly 1 Read-only file. Attribute is read/write.(只读文件,属性是可读/写的)
Hidden 2 Hidden file. Attribute is read/write.(隐藏文件,属性是可读/写的)
System 4 System file. Attribute is read/write.(系统文件,属性是可读/写的)
Volume 8 Disk drive volume label. Attribute is read-only(磁盘驱动器卷标,属性是只读的)
Directory 16 Folder or directory. Attribute is read-only.(文件夹或目录,属性是只读的)
Archive 32 File has changed since last backup. Attribute is read/write.(文件自上次备份以来已发生更改,属性是可读/写的。)
Alias 1024 Link or shortcut. Attribute is read-only.(链接或快捷方式,属性是只读的)
Compressed 2048 Compressed file. Attribute is read-only.(压缩文件,属性是只读的)
3 获取文件信息的实际代码
下面我将分别就上述两种方案给出代码如下:
Sub mynzB()
DimobjFso As Object
DimobjFile As Object
Sheets(“sheet3”).Select
Cells.ClearContents
strPath = ThisWorkbook.Path&Application.PathSeparator
strFile = strPath& “017temp17Test.txt”
‘引用FSO
SetobjFso = CreateObject(“Scripting.FileSystemObject”)
IfobjFso.FileExists(strFile) Then
Range(“a1”)= “获取文件信息和属性”
Range(“a3”)= “使用内置函数和语句”
‘文件大小:FileLen()
Range(“a4”)= “文件大小:”
Range(“B4″)= FileLen(strFile) & ” 字节”
‘文件的最后修改时间:FileDateTime()
Range(“a5”)= “文件最后修改的时间:”
Range(“B5”)= FileDateTime(strFile)
‘文件的属性GetAttr()
Range(“a6”)= “文件属性:”
Range(“B6”)= GetAttr(strFile)
‘设置文件的属性
SetAttrstrFile, vbReadOnly + vbHidden
Range(“A8”)= “文件“” &strFile& “”已设置了只读和隐藏属性”
Range(“A10”)= “使用FSO对象”
SetobjFile = objFso.GetFile(strFile)
uu = objFile.Attributes
Range(“A11”)= “文件属性:”: Range(“B11”) = objFile.Attributes
Range(“A12”)= “文件大小(Bytes):”: Range(“B12”) = objFile.Size
Range(“A13”)= “创建时间:”: Range(“B13”) = objFile.DateCreated
Range(“A14”)= “最后修改时间:”: Range(“B14”) = objFile.DateLastModified
‘属性更改
objFile.Attributes = objFile.Attributes + 4
Range(“A16”)= “文件“” &strFile& “”已设置了系统属性”
objFile.Attributes = objFile.Attributes – 3
Range(“A18”)= “文件“” &strFile& “”已去除了只读和隐藏属性”
objFile.Attributes = objFile.Attributes – 4
EndIf
SetobjFile = Nothing
SetobjFso = Nothing
End Sub
代码部分截图:
代码讲解:
1)objFile.Attributes = objFile.Attributes + 4
以上代码是增加了如下的属性:
System 4 System file. Attribute is read/write.(系统文件,属性是可读/写的)
这一点要特别注意,当减去某属性的时候同样利用的减号。
4 获取文件信息的代码实现效果
当我们点击运行按钮,就会在工作表中得到下面的运行结果;
这样就得到了文件的属性及其他的一些信息。
本节知识点回向:
① 本例中分别利用了哪两种方法得到文件的属性及信息?
② 给出的运行结果中属性的值是累加的,是否理解?
本讲代码参考文件:017工作表.xlsm
积木编程的思路内涵:
在我的系列书籍中一直在强调“搭积木”的编程思路,这也是学习利用VBA的主要方法,特别是职场人员,更是要采用这种方案。其主要的内涵:
1 代码不要自己全部的录入。你要做的是把积木放在合适的位置然后去修正代码,一定要拷贝,从你的积木库中去拷贝,然后修正代码,把时间利用到高效的思考上。
2 建立自己的“积木库”。平时在学习过程中,把自己认为有用的代码放在一起,多积累,在用到的时候,可以随时拿来。你的积木库资料越多,你做程序的思路就会越广。
VBA的应用界定及学习教程:
VBA是利用Office实现个人小型办公自动化的有效手段(工具)。这是我对VBA的应用界定。在取代OFFICE新的办公软件没有到来之前,谁能在数据处理方面做到极致,谁就是王者。其中登峰至极的技能非VBA莫属!
我记得20年前自己初学VBA时,那时的资料甚少,只能看源码自己琢磨,真的很难。20年过去了文件属性,为了不让学习VBA的朋友重复我之前的经历,我根据自己多年VBA实际利用经验,推出了六部VBA专门教程,目前教程均通过32位和64位两种OFFICE系统测试。
第一套:VBA代码解决方案是VBA中各个知识点的讲解,教程共147讲,覆盖绝大多数的VBA知识点,提供的程序文件更是一座不可多得的代码宝库,是初学及中级人员必备教程;目前这套教程提供的版本是修订第二版,程序文件通过32位和64位两种OFFICE系统测试。
第二套:VBA数据库解决方案数据库是数据处理的专业利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法和实例操作,适合中级人员的学习。目前这套教程提供的是修订第一版教程,程序文件通过32位和64位两种OFFICE系统测试。
第三套:VBA数组与字典解决方案 数组和字典是VBA的精华,字典是VBA代码水平提高的有效手段,值得深入的学习文件属性,是初级及中级人员代码精进的手段。目前这套教程提供的版本是修订第一版,程序文件通过32位和64位两种OFFICE系统测试。
第四套:VBA代码解决方案之视频是专门面向初学者的视频讲解,可以快速入门,更快的掌握这门技能。这套教程是第一套教程(修订一版)的视频讲解,听元音更易接受。这套教程还会额外提供通过32位和64位两种OFFICE系统测试的程序文件。
第五套:VBA中类的解读和利用 这是一部高级教程,讲解类的虚无与肉身的度化,类的利用虽然较少,但仔细的学习可以促进自己VBA理论的提高。这套教程的领会主要是读者的领悟了,领悟一种佛学的哲理。目前这套教程提供的版本是修订第一版,程序文件通过32位和64位两种OFFICE系统测试。
第六套教程:《VBA信息获取与处理》,这是一部高级教程,涉及范围更广,实用性更强,面向中高级人员。教程共二十个专题,包括:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪切板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。程序文件通过32位和64位两种OFFICE系统测试。
上述教程的学习顺序:1→3→2→6→5或者4→3→2→6→5。提供的程序文件更是一座巨大的代码库,供读者使用,如需要可以WeChat: NZ9668
学习VBA是个过程,也需要经历一种枯燥的感觉
“众鸟高飞尽,孤云独去闲。相看两不厌,只有敬亭山”。学习的过程也是修心的过程,修一个平静的心。在代码的世界中,心平静了,心情好了,身体自然而然就好。心静则正,内心里没有那么多邪知邪见,也就没有那么多妄想。利人就是利己。我的教程助力给正在努力的朋友。
“水善利万物而不争”,绵绵密密,微则无声,巨则汹涌。学习亦如此,知道什么是自己所需要的,不要蜷缩在一小块自认为天堂的世界里,待到暮年时再去做自欺欺人的言论。要努力提高自己,用一颗充满生机的心灵,把握现在,这才是进取。越是有意义的事情,困难会越多。愿力决定始终,智慧决定成败。不管遇到什么,都是风景。看淡纷争,看轻得失。学习时微而无声,利用时则巨则汹涌。“路漫漫其修远兮,吾将上下而求索”
每一分收获都是成长的记录,怎无凭,正是这种执着,成就了朝霞的灿烂。最后将一阙词送给致力于VBA学习的朋友,让大家感受一下学习过程的枯燥与执着:
浮云掠过,暗语无声,
唯有清风,惊了梦中啼莺。
望星,疏移北斗,
奈将往事雁同行。
阡陌人,昏灯明暗,
忍顾长亭。
多少VBA人,
暗夜中,悄声寻梦,盼却天明。
怎无凭!
分享我多年工作实际经验的成果,随喜这些有用的东西,给确实需要利用VBA的同路人。回向学习利用VBA的历历往事,不胜感慨,谨以这些文字以纪念,