在每一个带有VBA代码的文件里,都会有一个VBAProject,在VBA编辑器的工程资源窗口可以看到:
每个文件都有一个叫做VBAProject(默认名称,可以修改)的东西。
我们在编写VBA代码的时候,就是通过这里来点击添加模块、编写代码的。
01
2007版本结构
使用7z软件打开一个2007版本以上的Excel,可以看到有一个vbaProject.bin的文件,这里面就是保存了VBA相关的一些信息:
使用7z软件可以进一步的打开,主要的文件信息:
0 Root Entry
1 Root Entry\VBA
2 Root Entry\VBA\Sheet1
3 Root Entry\VBA\__SRP_5
4 Root Entry\VBA\__SRP_4
5 Root Entry\VBA\ThisWorkbook
6 Root Entry\VBA\__SRP_6
7 Root Entry\VBA\__SRP_7
8 Root Entry\VBA\Sheet2
9 Root Entry\VBA\__SRP_8
10 Root Entry\VBA\__SRP_9
11 Root Entry\VBA\Sheet3
12 Root Entry\VBA\__SRP_a
13 Root Entry\VBA\__SRP_b
14 Root Entry\VBA\MMain
15 Root Entry\VBA\__SRP_2
16 Root Entry\VBA\__SRP_3
17 Root Entry\VBA\_VBA_PROJECT
18 Root Entry\VBA\dir
19 Root Entry\VBA\__SRP_0
20 Root Entry\VBA\__SRP_1
21 Root Entry\PROJECTwm
22 Root Entry\PROJECT
Root Entry这个顶层目录名称7z软件打开时看不到的。
MMain是模块的名称,其他一些也会视具体的文件不相同,但主要的VBA\dir、PROJECTwm、PROJECT等是一定会有的。
02
03版本结构
同样使用7z软件打开一个.xls后缀的03版本带VBA代码的Excel:
0 Root Entry
1 Root Entry\Workbook
2 Root Entry\_VBA_PROJECT_CUR
3 Root Entry\_VBA_PROJECT_CUR\VBA
4 Root Entry\_VBA_PROJECT_CUR\VBA\ThisWorkbook
5 Root Entry\_VBA_PROJECT_CUR\VBA\Sheet1
6 Root Entry\_VBA_PROJECT_CUR\VBA\MMain
7 Root Entry\_VBA_PROJECT_CUR\VBA\MString
8 Root Entry\_VBA_PROJECT_CUR\VBA\MCDLL
9 Root Entry\_VBA_PROJECT_CUR\VBA\MObject
10 Root Entry\_VBA_PROJECT_CUR\VBA\模块1
11 Root Entry\_VBA_PROJECT_CUR\VBA\CAVLTree
12 Root Entry\_VBA_PROJECT_CUR\VBA\CNode
13 Root Entry\_VBA_PROJECT_CUR\VBA\MTestTree
14 Root Entry\_VBA_PROJECT_CUR\VBA\Sheet2
15 Root Entry\_VBA_PROJECT_CUR\VBA\_VBA_PROJECT
16 Root Entry\_VBA_PROJECT_CUR\VBA\dir
17 Root Entry\_VBA_PROJECT_CUR\PROJECTwm
18 Root Entry\_VBA_PROJECT_CUR\PROJECT
19 Root Entry\[5]SummaryInformation
20 Root Entry\[5]DocumentSummaryInformation
21 Root Entry\[1]CompObj
Workbook、[5]SummaryInformation、[5]DocumentSummaryInformation、[1]CompObj是Excel文件的信息,和VBA不相关。
除具体的模块信息差异之外,VBA相关的信息和07版本相比,多了一个_VBA_PROJECT_CUR路径。
所以,VBAProject就是一个在Excel文件中的数据流,这个数据流记录了VBA相关的信息。
获取VBAProject结构可以看VBA解析复合文档相关文章。
主要参考官方文档[MS-OVBA]: Office VBA File Format Structure:
https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-ovba/575462ba-bf67-4190-9fac-c275523c75fc