【发布时间】:2016-01-18 03:58:24
【问题描述】:
我熟悉 OLE 自动化并从给定的 VBA IDE/VBE(尤其是 Excel 的 VBE)控制其他应用程序。虽然我知道可以使用 SendKeys 方法作为一种基本上完成我想要做的事情的方法,但我觉得它在某些情况下可能不可靠(更不用说有点草率了)。
简而言之,我正在尝试从 Excel 中将 VBA 模块写入文本文件(已经解决了这个问题),然后让目标应用程序的 VBA IDE 导入模块并执行代码。
我对此的主要理由是 Excel 可用于所述目标应用程序的参考库具有局限性(而正如人们所期望的那样,目标应用程序的 VBA IDE 具有更多的属性和方法可用作其参考库特定于应用程序本身,原因很明显)。
关于如何最好地实现这一点有什么想法吗?
最好只创建一个自定义 COM 引用或调整现有的 COM 引用(我认为这相当困难,因为我不熟悉 C# 或 Visual Studio)?
(注意:如果您想知道,我正在使用反射会话(IBM,用于 Windows),并且对我正在使用的主要 COM(EXTRACOM)有相当广泛的了解。在反射会话 VBE 中,有一些方法例如.GetFieldText(无论应用程序光标放在给定字段的哪个位置,它都会返回整个字段名称。这可能比EXTRACOM 的.GetString 更有用,后者需要程序员首先指定字段长度和光标位置) . 另一种属性方法:.GetFieldColor(它将返回字段颜色的数字代码,EXTRACOM(Excel 的反射参考文件)缺少的属性/方法。
【问题讨论】:
-
祝你好运...我可以通过编程方式让 VBA 代码从 VBE 加载项执行的唯一方法是实例化主机应用程序并调用
Application.Run...which isn't supported in all VBE hosts。如果您在这方面取得任何进展,Rubberduck 项目一定会想听听您的意见! (注意,我共同拥有和维护这个项目) -
仍然感到困惑 - 您想将模块的内容写入文本文件(或者只是导出 .bas 文件?)然后将其导入另一个 Office 应用程序?还是非 Office 应用?
-
您使用的是哪个版本的反射?是 2011 年还是之后或之前的某个时间?我不确定我是否完全理解你想要做什么,但我很幸运能够与 Excel 和 Reflection (2011) 交互的 C#。
-
Hambone:现在是 2011 年。基本上;如果您使用的是反射 VBE,那么您可以使用的方法和属性比从 Excel 的 VBE 控制反射要多得多。根据 Attachmate 的网站,用于 Excel/Reflections 之间的 OLE 自动化的各种参考文件中提供的许多方法和属性实际上都不起作用(例如,EXTRACOM 是我使用的库参考文件,因为它是最佳选择)。当您说 C# 是指用于控制 Excel 反射的上述文件类型之一时?
-
@宏人;不,这实际上是我已经在做的,也是我想要避免的。目前我用与反射 VBE 兼容的 VBA 编写了一个 .bas 文件。然后我使用 Excel 中的 sendkeys 方法让 Reflections VBE 将所述文件作为模块导入。这不是一种可靠的方法,因此我得出的结论是,完成我想做的事情的唯一方法是通过 VBE 到 VBE OLE 自动化。示例:使用 Excel 的 VBE 获取 Access 的 VBE 以导入模块。只有在我的情况下,我没有使用 Office 应用程序本身,我使用的是 Reflection(3270 模拟器)