Tag: vbide

我怎么知道`ThisWorkbook`是一本’工作簿’?

我正在使用VBIDE API,并且不能假设主机应用程序是Excel或任何Office应用程序。 所以我所知道的是我正在看一个VBComponent ,它的Type是vbext_ct_document 。 在VBE的即时窗格中,我可以获得此输出: ?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时,哪个组件具有“应用程序”类型的“父”属性是一个Workbook实例…并且不能保证其他主机中的其他文档模块甚至会拥有“父”属性,所以我非常难过。 我几乎可以接受任何东西 – 从p / invoke调用和低级COM“reflection”魔术( ITypeInfo类型的魔法)到…到……我不知道 – 带有时髦指针的unsafe代码要求// here be dragons评论 – 欢迎任何可能最终成为工作解决方案的潜在客户。 AFAIK VBE加载项与主机位于同一进程中,因此某处有一个指向ThisWorkbook和Sheet1的指针以及VBA项目中的其他任何文档类型的VBComponent 。 ?ObjPtr(ThisWorkbook) 161150920 我想我只需要以某种方式抓住指针,我将成为我需要的地方。