家人们谁懂啊!做Excel VBA开发时,是不是总遇到这种尴尬——
写了一段超牛的代码,给工作簿加了一堆自定义功能,过了半个月回头看,懵了:“我当时为啥要加这个?”“这个参数是给谁用的?”“这个工作簿上次更新是啥时候?”
更气人的是,想给工作簿留个“备注”,要么写在单元格里怕被误删,要么单独建个隐藏工作表,麻烦得要死。
其实Excel VBA里藏着一个“宝藏工具”——CustomProperties对象,说白了就是给工作簿、工作表“贴便签”的神器,而且是“隐形便签”,不影响表格颜值,还能随文件一起保存,专治各种“忘事”“混乱”。
今天就带大家吃透这个“低调王者”,从“它是谁”“它能干嘛”“怎么玩”,全程人话+实操,哪怕你是VBA小白,看完也能直接上手,再也不用为“记笔记”头疼!
一、先搞懂:CustomProperties到底是个啥?
先给它一个接地气的定义:CustomProperties是Excel里的“隐藏备注栏”,专门用来存储和工作簿(Workbook)、工作表(Worksheet)相关的“自定义信息”。
你可以把它想象成——给你的Excel文件装了一个“私人备忘录”,你想记啥就记啥,比如:
- 工作簿版本号(比如“V2.3,2026年3月15日更新”)
- 代码作者(“张三,负责统计模块”)
- 数据来源(“来自财务部2026年2月报表”)
- 甚至是你自己的小提醒(“注意!A列数据不能手动修改,VBA自动更新”)
关键是,这些信息不会显示在Excel界面上(除非你用VBA调用),既不会被别人误改,也不会占用表格空间,低调又实用。
举个反例:很多人喜欢把备注写在单元格A1,结果不小心被删除、被覆盖,或者打印的时候露出来,尴尬又麻烦;而CustomProperties就不会有这问题,它藏在文件“后台”,只有懂VBA的人才能找到(当然,你也可以用VBA把它显示出来)。
二、重点:CustomProperties能解决哪些痛点?
总结了它最常用的3个场景,每一个都能帮你省时间、避坑:
痛点1:记不住工作簿/工作表的“关键信息”
比如你做了一个自动化报表,每周都要更新,过了一个月,你忘了上次更新的时间、用的数据源版本,这时候CustomProperties就能派上用场——每次更新后,用VBA自动给工作簿加一个“更新时间”和“数据源版本”的备注,下次打开,用一行代码就能查到,再也不用翻聊天记录、找文件备份。
痛点2:代码复用性差,换个文件就“失效”
比如你写了一段VBA代码,需要根据不同工作簿的“配置信息”执行不同操作(比如有的工作簿需要统计销售数据,有的需要统计库存),这时候可以把配置信息存在CustomProperties里,代码直接读取这些信息,不用每次修改代码,换个文件也能正常运行,实现“一次编写,多文件复用”。
痛点3:怕别人误改关键设置
比如你给工作表设置了自定义格式,或者隐藏了某些列,怕别人误操作修改,就可以在CustomProperties里记录“原始设置”,如果被修改了,用VBA读取备注里的原始信息,一键恢复,不用手动还原,省时又省心。
三、实操教学:CustomProperties怎么玩?(全程复制可用)
讲再多理论都是虚的,直接上代码!以下操作均以“工作簿的CustomProperties”为例(工作表的用法几乎一样,后面会补充),复制代码到VBA编辑器(Alt+F11),运行就能看到效果,小白也能轻松上手。
基础操作1:添加自定义备注(最常用)
比如给当前工作簿添加3个备注:作者、更新时间、版本号,代码如下:
Sub 给工作簿加备注()
Dim wb As Workbook
Set wb = ThisWorkbook '当前工作簿
'添加备注:作者(Key是“备注名称”,Value是“备注内容”)
wb.CustomDocumentProperties.Add _
Name:="作者", _
LinkToContent:=False, _
Type:=msoPropertyTypeString, _
Value:="Excel VBA老司机"
'添加备注:更新时间
wb.CustomDocumentProperties.Add _
Name:="更新时间", _
LinkToContent:=False, _
Type:=msoPropertyTypeDate, _
Value:=Now 'Now表示当前时间
'添加备注:版本号
wb.CustomDocumentProperties.Add _
Name:="版本号", _
LinkToContent:=False, _
Type:=msoPropertyTypeString, _
Value:="V2.3"
MsgBox "备注添加成功!", vbInformation
End Sub
这里有3个关键知识点,必看(划重点!):
- Name:备注的“名称”,相当于便签的“标题”,比如“作者”“更新时间”,后续读取的时候要靠这个名称查找。
- LinkToContent:是否“链接到单元格内容”,一般设为False(固定备注),设为True的话,备注内容会跟着指定单元格的内容变化(比如链接到A1,A1改了,备注也改)。
- Type:备注的“数据类型”,不能乱设,常用的有3种:
- msoPropertyTypeString:文本类型(比如作者、版本号)
- msoPropertyTypeDate:日期类型(比如更新时间)
- msoPropertyTypeNumber:数字类型(比如统计次数)
运行代码后,备注就已经藏在工作簿里了,接下来教大家怎么读取。
基础操作2:读取自定义备注(查备注)
比如我们要读取刚才添加的“版本号”和“更新时间”,代码如下:
Sub 读取工作簿备注()
Dim wb As Workbook
Dim cp As CustomDocumentProperty
Set wb = ThisWorkbook
'方法1:按名称直接读取(推荐,高效)
On Error Resume Next '防止备注不存在报错
Dim 版本号 As String
Dim 更新时间 As Date
版本号 = wb.CustomDocumentProperties("版本号").Value
更新时间 = wb.CustomDocumentProperties("更新时间").Value
On Error GoTo 0 '恢复报错机制
'显示读取到的备注
MsgBox "当前工作簿版本:" & 版本号 & vbCrLf & "上次更新时间:" & 更新时间, vbInformation
'方法2:遍历所有备注(适合不知道备注名称的情况)
For Each cp In wb.CustomDocumentProperties
MsgBox "备注名称:" & cp.Name & vbCrLf & "备注内容:" & cp.Value
Next cp
End Sub
重点提醒:如果备注不存在,直接读取会报错,所以加上“On Error Resume Next”可以避免报错,小白一定要加上!
基础操作3:修改/删除备注
有时候备注内容需要更新(比如版本号从V2.3改成V2.4),或者不需要了,这时候可以修改或删除,代码如下:
Sub 修改删除备注()
Dim wb As Workbook
Set wb = ThisWorkbook
'1. 修改备注(比如修改版本号)
On Error Resume Next
wb.CustomDocumentProperties("版本号").Value = "V2.4"
If Err.Number <> 0 Then
MsgBox "备注不存在,无法修改!"
Else
MsgBox "版本号修改成功!"
End If
On Error GoTo 0
'2. 删除备注(比如删除“作者”备注)
On Error Resume Next
wb.CustomDocumentProperties("作者").Delete
If Err.Number <> 0 Then
MsgBox "备注不存在,无法删除!"
Else
MsgBox "作者备注删除成功!"
End If
On Error GoTo 0
End Sub
补充:工作表的CustomProperties用法
刚才讲的都是工作簿(Workbook)的用法,工作表(Worksheet)的用法几乎一样,只是把“wb”换成“ws”,代码示例:
Sub 给工作表加备注()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1") '指定工作表
'添加备注:工作表用途
ws.CustomProperties.Add _
Name:="用途", _
LinkToContent:=False, _
Type:=msoPropertyTypeString, _
Value:="销售数据统计"
'读取备注
MsgBox "Sheet1的用途:" & ws.CustomProperties("用途").Value
End Sub
注意:工作表的CustomProperties是“跟着工作表走”的,如果你把工作表复制到另一个工作簿,备注也会一起复制过去,非常方便。
四、避坑指南:这些错误千万别犯!(新手必看)
作为踩过无数坑的VBA老司机,我总结了3个新手最容易犯的错误,帮你少走弯路:
坑1:重复添加同名备注
同一个工作簿/工作表,不能有两个“名称相同”的备注,比如已经有一个“版本号”的备注,再添加一次就会报错。
解决方法:添加之前,先判断备注是否存在,代码如下(可直接复制):
Sub 避免重复添加备注()
Dim wb As Workbook
Dim cp As CustomDocumentProperty
Dim 备注名称 As String
Dim 备注内容 As String
Set wb = ThisWorkbook
备注名称 = "版本号"
备注内容 = "V2.4"
'判断备注是否存在
Dim 备注存在 As Boolean
备注存在 = False
For Each cp In wb.CustomDocumentProperties
If cp.Name = 备注名称 Then
备注存在 = True
Exit For
End If
Next cp
'如果不存在,就添加;存在就修改
If 备注存在 Then
wb.CustomDocumentProperties(备注名称).Value = 备注内容
MsgBox "备注已更新!"
Else
wb.CustomDocumentProperties.Add _
Name:=备注名称, _
LinkToContent:=False, _
Type:=msoPropertyTypeString, _
Value:=备注内容
MsgBox "备注添加成功!"
End If
End Sub
坑2:数据类型设置错误
比如把“更新时间”的Type设为msoPropertyTypeString(文本),虽然能添加成功,但后续读取的时候,无法进行日期相关的操作(比如计算距离上次更新过了多少天),得不偿失。
解决方法:记住3个常用类型,对应好内容:文本用String,日期用Date,数字用Number,不要乱设。
坑3:忽略“链接到内容”的用法
LinkToContent设为True时,备注内容会跟着指定单元格变化,但很多新手不知道怎么设置“链接的单元格”,导致报错。
补充代码(链接到单元格内容):
Sub 备注链接到单元格()
Dim wb As Workbook
Set wb = ThisWorkbook
'备注内容链接到Sheet1的A1单元格
wb.CustomDocumentProperties.Add _
Name:="链接备注", _
LinkToContent:=True, _
Type:=msoPropertyTypeString, _
Value:=ThisWorkbook.Worksheets("Sheet1").Range("A1")
'当A1单元格内容修改后,备注内容也会自动修改
MsgBox "备注已链接到Sheet1的A1单元格!"
End Sub
五、实战场景:CustomProperties的实际应用(看完直接用)
最后给大家一个实战案例,把前面的知识点串起来,比如“自动化报表的版本管理”,代码如下,复制到VBA编辑器,运行就能实现:
Sub 报表版本管理()
Dim wb As Workbook
Dim cp As CustomDocumentProperty
Set wb = ThisWorkbook
'1. 判断是否有“版本号”备注,没有就添加,有就自动升级
Dim 版本号 As String
Dim 新版本号 As String
备注存在 = False
For Each cp In wb.CustomDocumentProperties
If cp.Name = "版本号" Then
备注存在 = True
版本号 = cp.Value
'自动升级版本号(比如V2.3→V2.4)
新版本号 = "V" & CDbl(Mid(版本号, 2)) + 0.1
cp.Value = 新版本号
Exit For
End If
Next cp
If Not 备注存在 Then
新版本号 = "V1.0"
wb.CustomDocumentProperties.Add _
Name:="版本号", _
LinkToContent:=False, _
Type:=msoPropertyTypeString, _
Value:=新版本号
End If
'2. 更新“更新时间”备注
On Error Resume Next
wb.CustomDocumentProperties("更新时间").Value = Now
If Err.Number <> 0 Then
wb.CustomDocumentProperties.Add _
Name:="更新时间", _
LinkToContent:=False, _
Type:=msoPropertyTypeDate, _
Value:=Now
End If
On Error GoTo 0
'3. 添加“报表负责人”备注
On Error Resume Next
wb.CustomDocumentProperties("负责人").Value = "张三"
If Err.Number <> 0 Then
wb.CustomDocumentProperties.Add _
Name:="负责人", _
LinkToContent:=False, _
Type:=msoPropertyTypeString, _
Value:="张三"
End If
On Error GoTo 0
'4. 显示当前版本信息
MsgBox "报表更新成功!" & vbCrLf & _
"当前版本:" & 新版本号 & vbCrLf & _
"更新时间:" & Now & vbCrLf & _
"负责人:" & wb.CustomDocumentProperties("负责人").Value, vbInformation
End Sub
这个案例实现了“自动升级版本号、更新时间、记录负责人”,每次更新报表时运行一次,就能清晰记录报表的所有关键信息,后续不管是自己维护,还是交给同事接手,都能一目了然,再也不用靠脑子记了。
最后总结:CustomProperties的核心价值
其实CustomProperties不算复杂,核心就是“给Excel文件贴隐形便签”,但它能解决VBA开发中“信息管理混乱”的大问题,尤其是对于经常做自动化报表、多文件开发的人来说,用好它,能大大提高工作效率,减少不必要的麻烦。
记住一句话:能靠代码记录的,就别靠脑子记,CustomProperties就是帮你“解放大脑”的神器。
最后留个小作业:试着给你自己的工作簿添加一个“备注”,读取并修改它,熟悉用法后,你会发现它的妙用无穷!
如果在操作中遇到问题,评论区留言,我来帮你解决~ 关注我,后续分享更多Excel VBA干货,让你少踩坑、多高效!