2015-10-19 35 views
2

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

简而言之,我试图从Excel内编写一个VBA模块到文本文件(已经计算出来了),然后让目标应用程序的VBA IDE导入模块并执行代码。

我的主要推论是,针对所述目标应用程序可用于Excel的参考库存在限制(而且,正如人们所期望的那样,目标应用程序的VBA IDE具有更多的属性和方法作为其参考库是特定于应用程序本身的,原因很明显)。

关于如何最好地完成这一任何想法?

只是创建一个自定义的COM参考或调整和现有的(我会认为这是相当困难的,因为我不熟悉C#或Visual Studio)会更好吗? (注意:如果您想知道,我正在使用Reflection Sessions(IBM,适用于Windows),并且对我正在使用的主COM(EXTRACOM)有相当广泛的曝光。在Reflection Sessions VBE中,有方法,如.GetFieldText(它将返回整个字段名称,而不管应用程序光标放在给定字段上的位置,这比EXTRACOM的.GetString更有用,它要求程序员首先指定字段长度和光标位置)。方法:.GetFieldColor(这将返回一个数字代码字段的颜色,属性/方法EXTRACOM(反思的Excel的参考文件)缺乏

+0

祝你好运......只有这样,我可以以编程方式获得VBA代码从VBE加载执行是通过实例的主机应用程序,并调用'Application.Run' ...... [其中ISN” t支持所有VBE主机](http://stackoverflow.com/q/31954364/1188513)。如果你有任何进展,[Rubberduck](http://www.rubberduck-vba.com)项目肯定会听到你的意见! (注意,我共同拥有和维护此项目) –

+1

仍然困惑 - 您想将模块的内容写入文本文件(或仅导出.bas文件?),然后将其导入到另一个Office应用程序中?或非Office应用程序? –

+0

您正在使用哪个版本的Reflection?是2011年还是之后呢?我不确定自己完全明白自己想要做什么,但是我对C#有很大的运气,可以与Excel和Reflection(2011)进行交互。 – Hambone

回答

0

目前尚不清楚对我的OP是什么。正在努力在这里做。

似乎从反思之外调用时反射式图书馆是不可靠的,因此该解决方案似乎使用Application.Run或自动化VBE涉及。

有2种方式实现的是:

  1. 有反射的Excel(我在这里所示的例子)的实例调用VBA功能,但如果你能得到的反射VBE参考,你可以反转这个并从Excel调用Reflection VBA。

  2. 有反射从Excel的vbProject(s)中导出模块,然后将它们导入到Refelction vbProject(s)中。

幸运的是,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,所以在这里我的代码是在访问运行,并导入从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