我正在使用VBIDE API,不能假设宿主应用程序是Excel或任何Office应用程序。
因此,我只知道我正在查看一个VBComponent,并且它的Type是vbext_ct_document。
在VBE的Immediate窗格中,我可以获取此输出:
但是
唯一接近我需要的东西,就是通过组件的
这种方法 可能 是有用的,但是 只有在我硬编码主机特定逻辑的情况下 才有效,即当宿主应用程序为Excel时,任何具有类型为“Application”的“Parent”属性的组件都是
因此,我只知道我正在查看一个VBComponent,并且它的Type是vbext_ct_document。
在VBE的Immediate窗格中,我可以获取此输出:
?TypeName(Application.VBE.ActiveVBProject.VBComponents("Sheet1"))
VBComponent
?TypeName(Sheet1)
Worksheet
但是
Sheet1
对象只存在于运行时环境中,所以如果我是C#插件,我甚至看不到它。唯一接近我需要的东西,就是通过组件的
Parent
和Next
属性:?TypeName(Application.VBE.ActiveVBProject.VBComponents("Sheet1").Properties("Parent").Object)
Workbook
?TypeName(Application.VBE.ActiveVBProject.VBComponents("Sheet1").Properties("Next").Object)
Worksheet
这让我得到了我想要的类型名称...但是在错误的组件上!对于顶级文档对象ThisWorkbook
,我会得到Application
对象作为Parent
:
?TypeName(Application.VBE.ActiveVBProject.VBComponents("ThisWorkbook").Properties("Parent").Object)
Application
这种方法 可能 是有用的,但是 只有在我硬编码主机特定逻辑的情况下 才有效,即当宿主应用程序为Excel时,任何具有类型为“Application”的“Parent”属性的组件都是
Workbook
实例 ...而且不能保证其他主机中的其他文档模块甚至拥有该“Parent”属性,因此我非常困惑。
我对 literally anything 都持开放态度 - 从 p / invoke 调用和低级别COM“reflection”魔术(如ITypeInfo
类型的魔术)到... 到...我不知道-需要// here be dragons
注释的带有奇怪指针的unsafe
代码-欢迎任何潜在成为工作解决方案的线索。
AFAIK VBE 加载项位于与宿主相同的进程中,因此 某处 存在一个指向VBA项目中的ThisWorkbook
、Sheet1
和其他文档类型VBComponent
的指针。
?ObjPtr(ThisWorkbook)
161150920
我想我只需要以某种方式抓住那个指针,就能到达我需要去的地方。
vbaProject.bin
结构中,位于宿主文档内。内存(因此更为当前)的流在主机的进程空间中,但我不知道任何获取它的方法。换句话说,虽然您可以从磁盘加载流,但这仅适用于您知道如何查找VBA存储和流的文件格式,并且仅适用于上次保存的版本,因此如果文档从未保存过或存在未保存的更改,则不一定会有所有流。 - ThunderFrameAttribute VB_Control = "CommandButton1, 1, 0, MSForms, CommandButton"
。 - ThunderFrame