问题标签 [vbide]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
547 浏览

c# - 如何迭代 MS-Access 表单上的控件?

我有一个方法,给定 a VBComponent,我可以.Designer从那里访问 and.Controls集合:

此方法的问题在于,当主机为 MS-Access 时,form.Designernull,因此该方法提前返回。

这里的dynamic演员表并不是特别有用,似乎我可以转换到一个UserForm界面,它会“正常工作”——至少在 Excel 主机中。

但由于 MS-Access 的表单没有设计器 (???),我如何去迭代 MS-Access 表单上的控件,因为 C# 代码是 VBE 加载项(即只能轻松访问任何内容VBIDE API 可用)?

0 投票
0 回答
180 浏览

vba - VBA COM 互操作问题:VBA 6.5 与 VBA 7.1

我有一个关于 VBA 6.5 中可能已在 VBA 7.1 中解决的错误的相对普遍的问题。我对 VBA/COM 互操作非常陌生,并且正在处理一段代码中的一个问题,该问题解决了 6.5 APC dll 中的引用计数问题。AddCodeModule 返回的代码模块项目项已经发布。这会导致与 COM 对象关联的 RCW 的清理在垃圾收集进行扫描时崩溃。添加了代码来解决此问题(我不会给您带来负担。)但是,此代码引起了另一个问题。显然,当软件使用 VBA 6.5 时添加了此解决方法。后来升级到7.1。事实证明,删除“解决方法”并不会重新引入原始问题并消除新问题。

所以,我的问题是,有谁知道 6.5 中是否存在这样的问题,而 7.1 解决了这个问题。

很抱歉这个问题的一般性质。

谢谢

0 投票
1 回答
155 浏览

excel - 在 VBA 编辑器中创建宏

我知道如何在 VBA 项目中创建函数以使用 VBIDE 库创建新的代码/模块/表单,但是是否可以将这些函数绑定到 VBA 编辑器中的按钮,以便我可以在光标处插入代码片段位置?

0 投票
1 回答
629 浏览

vba - 在 IDE Add-In 中制作 VB6- 或 VBA-IDE 环境相关参考?

我在 VB6 中成功创建了VB6_IDE_Add_In,它引用了 Microsoft "Visual Basic 6.0 Extensibility"。但是,要在 VBA IDE(Excel、Access)中使用此加载项,我必须复制VB6_IDE_Add_In项目,将其重命名为VBA_IDE_Add_In,重命名其属性等,并且主要更改提到的“Microsoft Visual Basic for应用程序可扩展性 5.3"

最后我有两个 dll - 一个用于 VB6,第二个用于 VBA。他们两个我都必须到“regsvr32”并手动将VBA-IDE-Add-In注册表项从 VB6 键“[HKCU\Software\Microsoft\Visual Basic\6.0\Addins]”移动到 VBA 键[HKCU\Software\Microsoft\ VBA\VBE\6.0\插件] ...

有没有办法使用条件编译或命令行参数来编译将根据 VB6 或 VBA 环境使用正确引用的单个 dll?

不幸的是,这是我的第一个加载项,我在这方面的经验不足......

0 投票
1 回答
151 浏览

excel - 找出激活加载项的主机应用程序

IDE 插件是在 VB6 中创建的,适用于 VB6、Excel、Access 等。
查看Application&AddInInst参数,传递给初始过程:

我找不到任何明确的主机值。我在哪里可以获得对主机的参考?
.

0 投票
1 回答
59 浏览

vba - 保存访问对象时引发的事件?

这个问题引用了 VBIDE 提出的一些事件。我正在寻找一个可以在保存 Access 对象时引发的事件(表单、querydef、模块、类模块等)。

如果这样的事件不可用,我正在寻找解决方法。项目范围的保存事件或代码模块更改事件将是可接受的替代方案。当“msys”系统表之一被更新时,也许有一些创造性的方式来通知,理想情况下,是哪一行。

在最坏的情况下,看起来我可以遍历CurrentDb.QueryDefs .LastUpdatedor CurrentProject.AllForms//属性并在某个时间间隔对其进行轮询,但如果可能的话,我想避免这种情况。.AllModules.AllReports .DateModified

0 投票
1 回答
3943 浏览

excel - 如何加载 VBA 库引用并在同一过程中使用它?

我有一个 Excel 的 VBA 脚本,它在活动工作簿中添加了一个小过程。最终版本将添加一个自动保存工作簿备份副本的过程。

该代码需要 Microsoft Visual Basic for Applications Extensibility 5.3 库,我可以手动添加它,但我有兴趣拥有一个可以将该库添加到 Excel 中然后使用它的脚本。

这是将库引用添加到 Excel 的代码。有用。

下面是使用此库将 VBA 过程添加到活动工作簿的代码。它有效,但前提是首先将所需的库引用添加到 Excel:

当我尝试将两者结合在一个程序中时,就会出现问题。Excel 抛出编译错误“未定义用户定义类型”。如果我理解正确,我的代码使用了一种叫做早期绑定的东西。Excel 在执行任何代码之前查找该库,但找不到它。

答案可能是调整我的代码以使用后期绑定,以便 Excel 在执行部分脚本并且该库可用之前不会查找该库。

使用这篇文章作为指导,我修改了部分代码,如下所示:

Excel 抛出错误“运行时错误 '429':ActiveX 组件无法创建对象”。

知道如何修改此代码以利用后期绑定,或者以其他方式加载库引用并在同一过程/模块中运行其余代码吗?

0 投票
1 回答
162 浏览

c# - 清理 CommandBar 按钮

我的 COM 加载项有一个问题,拖了几个月,我不知道为什么。

IDTExtensibility2实现已经由 Carlos Quintero(MZ-Tools 背后的人)进行了同行评审,并被认为是正确的。

根据他的建议,OnBeginShutdown实现设置了一个已签入的标志OnDisconnection,以确保ShutdownAddIn只运行一次(某些 VBE 主机应用程序不调用OnBeginShutdown,这就是原因):

我的插件使用 Ninject 进行 DI/IoC,我的ShutdownAddIn方法归结为调用DisposeNinjectIKernel实例,然后释放所有 COM 对象Marshal.ReleaseComObject

我想不出更早的时间来运行这段代码。然而,当在我的命令栏和菜单包装器上运行时,当命令栏/菜单尝试拆除它们的控件时Dispose,我会进入:InvalidCastExceptionStopEvents

InvalidCastException说它不能转换为IConnectionPoint- 我发现这是因为当这段代码运行时,我的Target(包装的__ComObject)已经消失了,我留下了一个无效的指针和一个挥之不去的指针对不再存在的 COM 对象的引用。

如果我在我的拆卸过程中捕获所有异常(当我尝试使用按钮和菜单时,我有更多源于同一个根本问题的异常Delete),主机应用程序将关闭但主机进程仍然存在 - 然后我必须将其从任务管理器。这种行为与我认为由未删除的点击处理程序引起的内存泄漏是一致的。


有没有更强大的方法可以处理为Microsoft.Office.Core.CommandBarButton包装器添加/删除事件处理程序?OnBeginShutdown如果我还没有释放它们,为什么我包装的 COM 对象在运行时已经“消失”了?

0 投票
4 回答
447 浏览

visual-studio - 如何对页面上的每个子/功能进行编目、索引和/或打印 VB6 源代码..?

我如何在自己的页面上对每个子或函数进行编目、索引和/或打印 VB6 源代码..?如果可能的话,我想使用免费或包含的 Visual Studio 加载项来做到这一点,但我并不反对自己编写一些东西。我熟悉“Microsoft Office Visual Basic for Applications Extensibility”,似乎 VB6 有一个类似的模块,这可以让我通过代码模块集合简单地“For Each”,然后将 subs 扔到打印机上时间。可能需要 10-15 行代码。

我的首要任务是打印,最好是每个子/功能都在自己的页面上,但是使用 IDE 的正常打印功能,所有代码在一个长打印输出中一起运行。接下来,我想为每个 VBP 中的每个子、函数、变量和常量的名称创建一个索引/目录。我们有 Visual Studio 6.0 企业版,但它似乎没有任何东西可以做这些事情。

你可能会笑着问:“为什么是 VB6..??哈哈!!”。这是因为我的任务是升级和更改运行工厂的大型软件系统的 VB6 源代码。它在一个孤立的网络上,与外界没有任何联系,并且已经运行了 14 年,但现在他们想开始升级一些东西。该系统由许多VBP文件组成,每个文件都有许多模块和表格。

编辑:我确实尝试过用谷歌搜索来寻找答案,但事实证明这是不可能的。我得到的只是关于从用 VB6 编写的应用程序打印的编码示例,而不是从 IDE 打印源代码。

0 投票
1 回答
828 浏览

vba - VBE 中的 CommandBarEvents.Click 和 CommandBarButton.Click 有什么区别?

VBAVB6加载项对象模型 (VBIDE) 公开了一个CommandBarEvents具有Click 事件的对象,事件签名为:

并且对 a 的引用CommandBarControl被传递给它VBE.Events.CommandBarEvents以注册事件处理程序CommaneBarControl

Office对象模型定义了具有自己Click 事件的各个 CommandBar 控件,例如CommandBarControl具有事件的对象,Click其签名为:

并将对 a 的引用CommandBarButton分配给WithEvents对象:

为什么会有区别,我应该更喜欢哪个?

我将事件附加到 VBE 的 CommandBars 上的控件(而不是主机应用程序中的 CommandBars)。

Office CommandBars 无权访问CommandBarEvents对象,因此我假设它们必须使用该CommandBarButton.Click事件。但是 VBE(在任何 Office 主机下)可以访问CommandBarButton事件和CommandBarEvents事件,所以我可以使用任何一种方法,尽管CommandBarEvents对象的存在表明它是首选方法(并且可能是非 Office VBA 主机中的唯一方法) ,并且大多数将事件处理程序添加到 VBE CommandBars的在线示例使用CommandBarEvents.

MZ Tools 的 Carlos Quintero 提供了非常有用的信息,但在这种情况下,他的网站上的信息略有矛盾。他建议在旧的 Microsoft Visual Basic 5.0 / 6.0 环境中使用 CommandBarEvents 方法,但也使用CommandBarControl.Click页面上的方法

CommandBarVBE 和将事件附加到控件有什么特别之处吗?CommandBarControl如果我选择使用事件而不是事件,是否存在任何问题(内存泄漏、IDTExtensibility2 关闭问题等)CommandBarEvents