Tag: vbe

我怎么知道`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 我想我只需要以某种方式抓住指针,我将成为我需要的地方。

如何在没有Application.Run的情况下从VBE加载项运行宏?

我正在为VBE编写COM加载项,其中一个核心function是在单击命令栏按钮时执行现有的VBA代码。 代码是用户在标准(.bas)模块中编写的unit testing代码,其模块如下所示: Option Explicit Option Private Module ‘@TestModule Private Assert As New Rubberduck.AssertClass ‘@TestMethod Public Sub TestMethod1() ‘TODO: Rename test On Error GoTo TestFail ‘Arrange: ‘Act: ‘Assert: Assert.Inconclusive TestExit: Exit Sub TestFail: Assert.Fail “Test raised an error: #” & Err.Number & ” – ” & Err.Description End Sub 所以我有这个代码获取主机Application对象的当前实例: protected HostApplicationBase(string applicationName) { Application […]