场景:文件“失忆症”引发的混乱
周四下午,办公室被一阵急促的脚步声打破宁静。
艾迷糊:(眼镜片上反射着慌乱,手里抱着一堆打印件)小毕!快帮我看看,这些报表到底哪个是最新版本?!
小毕:(接过打印件)迷糊哥,这些不是都有文件名吗?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(“属性名”) |
|
|
遍历所有 |
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生成)






