从"冻结"停止VBA脚本在发送MDX-Query时

时间:2014-07-02 14:01:53

标签: multithreading vba excel-vba ado mdx

我在Excel 2010环境中使用ADOMD 6.1将自定义MDX查询发送到Analysis Services 2008 R2多维数据集并在Excel工作簿中显示结果。到目前为止,此工作正常,但Excel实例在等待Analysis Services服务器返回查询结果时冻结,并且某些查询可能会运行几分钟。

我可能会使用线程将Connection外包给另一个线程,但根据此处提出的其他一些问题,这在VBA本身是不可能的 - 我们确实有限制不使用DLL,因为我们需要将生成的Excel及其宏分发给某些最终用户,并且安装DLL不是一个选项。使用内置的Excel-Pivot表也不是一个选项,因为我们依赖于MDX函数,如intersect和exists。

在不使用外部DLL的情况下,是否存在使用VBA中的ADOMD向Analysis Services服务器发送查询的非阻塞方法?

Dim ObjConnection As New ADODB.Connection
Dim rs As New ADODB.Recordset
ObjConnection.Open strCon

rs.Open strMDX, ObjConnection

Do While Not rs.EOF
    For i = 0 To rs.Fields.Count - 1
        Cells(i, 1).Value = rs.Fields(i).Name
        Cells(i, 2).Value = rs.Fields(i).Value
    Next
    rs.MoveNext
Loop

非常感谢!

1 个答案:

答案 0 :(得分:1)

是的,可以做到。您需要启动Excel应用程序的另一个实例(在后台,因此您可以隐藏它)并获取该实例以便为您运行宏。

关键步骤是

    Set newexcel = New Application
    Set newworkbook = newexcel.Workbook.Open("Path goes here")
    ' newworkbook is of Workbook data type

    Dim MacroName as String
    ArgumentMacroName = "'" & SomeStringArgument & "'!ModuleName.YourSubName"

    Output = newexcel.Run(MacroName, ThisWorkbook.Name)  'Output is of the returned data type

在新工作簿中,您可以包含要运行的宏并传递此字符串参数ByVal

由于应用程序是隐藏的,因此它对用户完全透明,并且可以在其他活动进行时返回值。

所需的代码在http://www.mrexcel.com/forum/excel-questions/570562-visual-basic-applications-open-another-instant-excel-run-macro.html

上讨论