3

我熟悉 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 更有用,EXTRACOM.GetString要求程序员首先指定字段长度和光标位置。另一个属性方法:(.GetFieldColor它将返回字段颜色的数字代码,EXTRACOM(Excel 的反射参考文件)缺少的属性/方法。

4

1 回答 1

0

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

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

有两种方法可以实现:

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

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

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

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

使用Application.Run,我们可以在 Excel 项目中调用函数(我们甚至可以在调试时从一个 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
于 2016-12-22T23:23:48.457 回答