【问题标题】:OLE Automation and interacting with another VBE / VBA IDEOLE 自动化并与另一个 VBE / VBA IDE 交互
【发布时间】: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 模拟器)

标签: excel vba ole vbe vbide


【解决方案1】:

我不清楚 OP 究竟想在这里做什么。

似乎反射类型库在从反射外部调用时并不可靠,因此解决方案似乎涉及使用 Application.Run 或自动化 VBE。

有两种方法可以实现:

  1. 在 Excel 实例中使用反射调用 VBA 函数(我在此处显示的示例),但如果您可以获得对反射 VBE 的引用,则可以反转它并从 Excel 调用反射 VBA。

  2. 让 Reflection 从 Excel 的 vbProject(s) 中导出模块,然后将它们导入 Refelction vbProject(s)。

幸运的是,VBA 使这两种方法都成为可能。对于这两种方法,您都需要添加对 ExcelVisual Basic for Applications Extensibility 的引用

使用Application.Run 调用另一个VBA 主机中的函数

使用Application.Run,我们可以在 Excel 项目中调用函数(我们甚至可以在调试时step从一个 VBE 到另一个 VBE。我们可以传递参数,我们可以接收返回值。

Sub CallExcelUDFFromNonExcelHost()

  'Get an existing instance of Excel
  Dim appXL As Excel.Application
  Set appXL = GetObject(, "Excel.Application")

  'Get the already opened Excel workbook
  Dim wbk As Excel.Workbook
  Set wbk = appXL.Workbooks("MyExcelFunctions.xlsm")

  'Call the function in the Excel workbook
  Dim result
  result = appXL.Run(wbk.VBProject.Name & ".MyFunction", "Some Argument")

End Sub

自动化外部 VBA 主机的 VBE 我没有反射,所以我的代码在 Access 中运行,并从 Excel 导入模块。

Sub ImportVBAModuleFromOtherIDE()

  'Get an existing instance of Excel
  Dim appXL As Excel.Application
  Set appXL = GetObject(, "Excel.Application")

  'Get the already opened Excel workbook
  Dim wbk As Excel.Workbook
  Set wbk = appXL.Workbooks("MyExcelFunctions.xlsm")

  'Export a module from Excel
  wbk.VBProject.VBComponents("Module1").Export "C:\Temp\Module1.bas"

  'Import the module into the Access project
  Application.VBE.VBProjects("Database11").VBComponents.Import "C:\Temp\Module1.bas"

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    相关资源
    最近更新 更多