OLE自动化和与另一个VBE / VBA IDE交互

时间:2015-10-19 17:39:04

标签: excel vba ole vbe vbide

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

简而言之,我正在尝试从Excel中编写一个VBA模块到一个文本文件(已经找到了这个),然后让一个目标应用程序的VBA IDE导入模块并执行代码。 / p>

我的主要原因是Excel可用于所述目标应用程序的参考库具有局限性(同时,正如人们所预料的那样,目标应用程序的VBA IDE具有更多属性和方法可供使用因为它的参考库特定于应用程序本身,原因很明显。)

有关如何最好地完成此任务的任何想法?

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

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

1 个答案:

答案 0 :(得分:0)

我不清楚OP在这里尝试做什么。

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

有两种方法可以实现这一目标:

  1. 在Excel的一个实例(我在这里展示的例子)中有反射调用VBA函数,但是如果你可以获得对Reflection VBE的引用,你可以反转它并从Excel调用Reflection VBA。 / p>

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

  3. 幸运的是,VBA使这两种方法成为可能。对于这两种方法,您需要添加对ExcelVisual 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 我没有Reflection,所以我的代码在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