excel - OLE 自动化并与另一个 VBE/VBA IDE 交互

标签 excel vba ole vbe vbide

我熟悉 OLE 自动化并从给定的 VBA IDE/VBE(尤其是 Excel 的 VBE)控制其他应用程序。虽然我知道可以使用 SendKeys 方法来从根本上完成我想要做的事情,但我觉得在某些情况下它可能不可靠(更不用说有点草率了)。

简而言之,我试图从 Excel 中将 VBA 模块写入文本文件(已经解决了这个问题),然后让目标应用程序的 VBA IDE 导入该模块并执行代码。

我对此的主要原因是,对于所述目标应用程序,Excel 可用的引用库有局限性(而正如人们所期望的那样,目标应用程序的 VBA IDE 有更多的属性和方法可以作为其引用库使用特定于应用程序本身,原因很明显)。

关于如何最好地完成这项工作有什么想法吗?

只创建自定义 COM 引用或调整现有的 COM 引用会更好吗(我认为这相当困难,因为我不熟悉 C# 或 Visual Studio)?

(注意:如果您想知道,我正在使用 Reflection Sessions(IBM,适用于 Windows),并且相当广泛地接触了我正在使用的主要 COM (EXTRACOM)。在 Reflection Sessions VBE 中有一些方法例如 .GetFieldText(无论应用程序光标放在给定字段上的什么位置,它将返回整个字段名称。这比 EXTRACOM 的 .GetString 更有用需要程序员首先指定字段长度和光标位置。另一个属性方法:.GetFieldColor(它将返回字段颜色的数字代码,EXTRACOM(Excel 的反射引用文件)的属性/方法) 缺乏。

最佳答案

我不清楚 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 项目中调用函数(我们甚至可以在调试时从一个 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

关于excel - OLE 自动化并与另一个 VBE/VBA IDE 交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33220607/

相关文章:

excel - 查找限制范围内的值的总和数

python - 如何使用 Python win32com 中的所有默认加载项运行 excel

sql-server - SQL Server,插入 Excel "Invalid column name"时出现 "linked server"错误

excel - 将所有工作表中的单元格复制到另一个工作表中

windows - Delphi 7 可以通过 OLE Variant 传递 Int64 值吗?

excel - 如何在 Excel 2013 中使用 Web 服务

sql - Access 有时会在保存新记录时跳转到现有记录 - Access2k FE/SQL2005 BE

excel - 属性进入所有元素

c++ - 字2013 : OLE in place editing not working?

java - 使用Java从DOC文件中提取嵌入的ZIP