VBA【文档属性——Excel文件的“身份证”和“户口本”】

场景:文件“失忆症”引发的混乱

周四下午,办公室被一阵急促的脚步声打破宁静。

艾迷糊:(眼镜片上反射着慌乱,手里抱着一堆打印件)小毕!快帮我看看,这些报表到底哪个是最新版本?!

小毕:(接过打印件)迷糊哥,这些不是都有文件名吗?Q3报表_v1、Q3报表_v2、Q3报表_最终版、Q3报表_最终版2……

艾迷糊:(崩溃)对啊!我目前有八个版本,分不清哪个是老板签字通过的!文件名上写着“最终版”,但里面又有修改!

老威:(端着保温杯慢悠悠走过来)迷糊,你这是典型的“文件失忆症”——光看文件名,不知道文件的身世。

艾迷糊:(可怜巴巴)威哥,Excel有没有那种……就像人的身份证一样,能记录文件的出生时间、最后修改人、版本号之类的?

老威:(眼睛一亮)迷糊这个问题问到点子上了!Excel不仅有“身份证”,还有完整的“户口本”——就是文档属性。

小毕:(掏出小本本)文档属性?就是【文件】→【信息】里那些?

老威:对!今天我们就专门讲讲——如何用VBA查看、读取、甚至给Excel文件添加“身份证信息”。

问题:文档属性分两种

老威:在讲代码之前,先搞清楚——Excel的文档属性分两种:

老威在白板上画了两个框:

【文档属性两大类型】

┌─────────────────────────┐

│ 1. 内置属性 │

│ (身份证:出厂自带) │

│ – 作者 │

│ – 创建时间 │

│ – 最后保存时间 │

│ – 最后保存者 │

│ – 标题/主题/关键词 │

│ – 页数/字数/总编辑时间

└─────────────────────────┘

┌─────────────────────────┐

│ 2. 自定义属性 │

│ (户口本:自己添加) │

│ – 版本号 │

│ – 审批状态 │

│ – 项目编号 │

│ – 负责人 │

│ – 任何你想要的信息 │

└─────────────────────────┘

艾迷糊:(恍然大悟)所以内置属性是“天生”的,自定义属性是“后天”加的?

老威:Bingo!迷糊今天智商在线!

VBA哲学时刻:如何查看文档属性

老威:先教最简单的——用VBA查看当前工作簿的所有内置属性:

Sub 查看所有内置属性()
Dim prop As DocumentProperty
Dim msg As String

msg = "【当前工作簿内置属性】" & vbCrLf & vbCrLf

' 遍历所有内置属性
For Each prop In ThisWorkbook.BuiltinDocumentProperties
' 有些属性可能没有值,需要防错
On Error Resume Next
msg = msg & prop.Name & ": " & prop.Value & vbCrLf
On Error GoTo 0
Next prop

' 显示结果
MsgBox msg
End Sub

小毕:(运行后惊呼)哇!原来Excel偷偷记了这么多东西!作者、创建时间、最后保存者……

艾迷糊:(凑过去看)等等!“最后保存者”显示的是“Mihu”?那就是我!这个文件是我最后改的!

老威:对!所以下次你再有八个版本,运行一下这个宏,就知道哪个是最后改的。

实战案例:查看特定内置属性

老威:如果只想看某个特定属性,可以这样:

Sub 查看关键内置属性()
Dim wb As Workbook
Set wb = ThisWorkbook

Dim msg As String
msg = "【文件关键信息】" & vbCrLf & vbCrLf

' 逐个获取常用属性(带错误处理)
On Error Resume Next
msg = msg & "文件名称: " & wb.Name & vbCrLf
msg = msg & "完整路径: " & wb.Path & vbCrLf
msg = msg & "作者: " & wb.BuiltinDocumentProperties("Author") & vbCrLf
msg = msg & "创建时间: " & wb.BuiltinDocumentProperties("Creation Date") & vbCrLf
msg = msg & "最后保存时间: " & wb.BuiltinDocumentProperties("Last Save Time") & vbCrLf
msg = msg & "最后保存者: " & wb.BuiltinDocumentProperties("Last Author") & vbCrLf
msg = msg & "修订次数: " & wb.BuiltinDocumentProperties("Revision Number") & vbCrLf
msg = msg & "总编辑时间: " & wb.BuiltinDocumentProperties("Total Editing Time") & " 分钟" & vbCrLf
On Error GoTo 0

MsgBox msg
End Sub

艾迷糊:(眼睛发光)修订次数?!原来Excel一直在记我改了多少遍!

老威:对!而且“总编辑时间”会告知你这个文件你折腾了多久——迷糊那个销售模型,估计显示“9999分钟”。

引出相关话题:自定义属性——给文件加“标签”

老威:内置属性是固定的,但自定义属性就厉害了——你想要什么就加什么。

老威敲下这段代码:

Sub 添加自定义属性()
Dim wb As Workbook
Set wb = ThisWorkbook

' 添加自定义属性:版本号
On Error Resume Next
' 如果属性已存在,先删除(避免冲突)
wb.CustomDocumentProperties("版本号").Delete
On Error GoTo 0

' 添加新属性
wb.CustomDocumentProperties.Add _
Name:="版本号", _
LinkToContent:=False, _
Type:=msoPropertyTypeString, _
Value:="v3.0.1"

' 再加一个:审批状态
wb.CustomDocumentProperties.Add _
Name:="审批状态", _
LinkToContent:=False, _
Type:=msoPropertyTypeString, _
Value:="已通过"

' 再加一个:负责人
wb.CustomDocumentProperties.Add _
Name:="负责人", _
LinkToContent:=False, _
Type:=msoPropertyTypeString, _
Value:="艾迷糊"

MsgBox "自定义属性添加完成!" & vbCrLf & _
"版本号:v3.0.1" & vbCrLf & _
"审批状态:已通过" & vbCrLf & _
"负责人:艾迷糊"
End Sub

小毕:(惊讶)这样文件自己就记住了自己的“身份”!

艾迷糊:(激动)太好了!后来我那个八个版本的问题,只要看“审批状态”属性就知道哪个是老板签字的!

生活中的VBA哲学

老威放下保温杯,开启哲学模式:

老威:文档属性的本质,是给文件一个可追溯的身份。

小毕:怎么说?

老威:

– 文件名就像人的名字:张三、李四(容易重名、容易改)

– 文档属性就像人的身份证:出生日期、身份证号(唯一、权威、改不了)

– 自定义属性就像人的标签:项目经理、财务总监、迷糊大王(可以自己定义)

艾迷糊:(若有所思)所以我的那些“最终版_v8”的文件名,应该改成统一的命名,然后在属性里记真实版本?

老威:(赞许)迷糊终于开窍了!文件名是给人看的,属性是给电脑和系统看的。

进阶技巧:批量读取多个文件的属性

小毕:威哥,如果我想批量查看一堆Excel文件的属性,一个个打开太慢了……

老威:好问题!可以用一个特殊工具——DSOFile.dll 。

老威在白板上写下步骤:

【批量读取文件属性】

1. 下载并注册 DSOFile.dll(微软官方组件)

2. VBA中引用它:【工具】→【引用】→“DSO OLE Document Properties Reader”

3. 用代码读取,不用打开文件

' 需要先引用 DSOFile.dll
Sub 批量读取文件属性()
Dim 文件夹路径 As String
Dim 文件名 As String
Dim objDSO As DSOFile.OleDocumentProperties
Dim prop As DSOFile.CustomProperty

文件夹路径 = "C:季度报表"
文件名 = Dir(文件夹路径 & "*.xlsx")

Set objDSO = New DSOFile.OleDocumentProperties

' 循环处理每个文件
Do While 文件名 <> ""
' 打开文件属性(不打开文件本身)
objDSO.Open 文件夹路径 & 文件名

Debug.Print "" & 文件名 & ""
Debug.Print " 作者:" & objDSO.SummaryProperties.Author
Debug.Print " 最后保存者:" & objDSO.SummaryProperties.LastAuthor
Debug.Print " 创建时间:" & objDSO.SummaryProperties.DateCreated

' 读取自定义属性
For Each prop In objDSO.CustomProperties
Debug.Print " 自定义 - " & prop.Name & "" & prop.Value
Next prop

objDSO.Close
文件名 = Dir
Loop

MsgBox "批量读取完成!结果在立即窗口。"
End Sub

艾迷糊:(震惊)不用打开文件就能看属性?!这太强了!

关联话题:用属性做“文件身份证”

老威:实则文档属性最强劲的用途,是给文件做“身份证”——让你能在成百上千个文件里,快速找到你要的那个 。

Sub 给文件打上唯一标识()
' 为工作簿添加一个唯一ID
Dim wb As Workbook
Set wb = ThisWorkbook

Dim uniqueID As String
uniqueID = "PROJ-" & Format(Date, "yyyymmdd") & "-" & Format(Timer, "000")
' 例如:PROJ-20240520-12345

On Error Resume Next
wb.CustomDocumentProperties("项目ID").Delete
On Error GoTo 0

wb.CustomDocumentProperties.Add _
Name:="项目ID", _
LinkToContent:=False, _
Type:=msoPropertyTypeString, _
Value:=uniqueID

MsgBox "本文件唯一ID:" & uniqueID & vbCrLf & _
"后来找文件,就找这个ID!"
End Sub

小毕:这样就算文件名改了,也能通过ID识别?

老威:对!这就是“文件身份证”的概念。

实战技巧:用属性自动管理版本

老威:迷糊不是总搞混版本吗?这个代码可以自动帮你记录版本信息:

Sub 自动版本管理()
Dim wb As Workbook
Set wb = ThisWorkbook

Dim 当前版本 As String
Dim 版本号 As Variant

' 读取当前版本号
On Error Resume Next
版本号 = wb.CustomDocumentProperties("版本号").Value

' 如果没有版本号,初始化为v1.0
If Err.Number <> 0 Or 版本号 = "" Then
版本号 = "v1.0"
Err.Clear
Else
' 简单版本递增(实际应用可以更智能)
版本号 = 版本号 & "_修改于" & Format(Now, "yyyymmdd_HHMM")
End If
On Error GoTo 0

' 更新版本号
On Error Resume Next
wb.CustomDocumentProperties("版本号").Delete
On Error GoTo 0

wb.CustomDocumentProperties.Add _
Name:="版本号", _
LinkToContent:=False, _
Type:=msoPropertyTypeString, _
Value:=版本号

' 同时记录最后修改人
wb.CustomDocumentProperties.Add _
Name:="最后修改人", _
LinkToContent:=False, _
Type:=msoPropertyTypeString, _
Value:=Application.UserName

MsgBox "版本已更新为:" & 版本号
End Sub

艾迷糊:(感动)这样我每次修改,它自动给我记版本!再也不用手动改文件名了!

知识点小结

查看文档属性的VBA方法:

属性类型

访问方式

示例

内置属性

BuiltinDocumentProperties(“属性名”)

wb.BuiltinDocumentProperties(“Author”)

自定义属性

CustomDocumentProperties(“属性名”)


wb.CustomDocumentProperties(“版本号”)

遍历所有

For Each prop In BuiltinDocumentProperties

循环读取

添加自定义

CustomDocumentProperties.Add

见上例

常用内置属性名称 :

– `”Author”`:作者

– `”Creation Date”`:创建时间

– `”Last Save Time”`:最后保存时间

– `”Last Author”`:最后保存者

– `”Revision Number”`:修订次数

– `”Total Editing Time”`:总编辑时间

– `”Title”`:标题

– `”Subject”`:主题

– `”Keywords”`:关键词

– `”Comments”`:备注

添加自定义属性的参数 :

– `Name`:属性名称

– `LinkToContent`:是否链接到内容(一般填False)

– `Type`:数据类型(
msoPropertyTypeString/Date/Number/Boolean)

– `Value`:属性值

相关联话题:

– `GetAttr`函数:获取文件的系统属性(只读、隐藏等)

– `SetAttr`语句:设置文件的系统属性

– DSOFile.dll:不打开文件读取属性

– `FileSystemObject`:文件系统操作

– 文档属性与工作簿事件的结合(自动记录修改)

尾声:艾迷糊的“文件户口本”

一周后,艾迷糊得意洋洋地走进办公室。

艾迷糊:(推了推眼镜)威哥!我给所有重大文件都加了“户口本”!

小毕:(好奇)什么户口本?

艾迷糊:每个文件都有自定义属性——

– 版本号:自动递增

– 审批状态:待审批/已通过

– 负责人:艾迷糊

– 紧急程度:高/中/低

– 备注:随意写

老威:(欣慰)不错不错!那目前八个版本的问题解决了?

艾迷糊:解决了!我目前不看文件名,只看属性里的“审批状态”——

小毕:(笑)那迷糊哥,你那个“最终版_v8”最后是怎么处理的?

艾迷糊:(尴尬)呃……我把八个文件全打开,运行了查看属性的宏,发现有一个文件的“最后修改人”是“老板”,那就是签字的版本!

老威:(笑)看,这就是文档属性的力量——它不会说谎。

艾迷糊:(若有所思)所以文档属性的哲学是:给文件一个不会撒谎的记忆?

老威:(赞许)迷糊这个总结,可以写进教科书了!

如果觉得有用,别忘了 点赞 + 收藏,关注我,获取更多Excel VBA高效编程技巧!

(图片由AI生成)

VBA【文档属性——Excel文件的“身份证”和“户口本”】

© 版权声明

相关文章

1 条评论

none
暂无评论...