【问题标题】:Stop VBA-Script from "freezing" while sending MDX-Query在发送 MDX 查询时停止 VBA 脚本“冻结”
【发布时间】:2014-07-02 22:36:47
【问题描述】:

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

我可能会使用线程将连接外包给另一个线程,但根据这里提出的一些其他问题,这在 VBA 本身中是不可能的 - 我们确实有不使用 DLL 的约束,因为我们需要将生成的 Excel 及其宏分发给一些最终用户,并且安装 DLL 不是一种选择。使用内置的 Excel 数据透视表也不是一种选择,因为我们依赖于交叉和存在等 MDX 函数。

是否有一种非阻塞方式可以在 VBA 中使用 ADOMD 将查询发送到 Analysis Services 服务器,而无需使用外部 DLL?

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

非常感谢!

【问题讨论】:

  • 嗨,下面的答案有用吗?

标签: multithreading vba excel ado mdx


【解决方案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讨论

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    相关资源
    最近更新 更多