Остановить VBA-скрипт от «зависания» при отправке многомерного запроса

#multithreading #vba #excel #ado #mdx

#многопоточность #vba #excel #ado #многомерное выражение

Вопрос:

Я использую ADOMD 6.1 в среде Excel 2010 для отправки пользовательских многомерных запросов в куб служб Analysis Services 2008 R2 и для отображения результатов в книге Excel. Пока это работает нормально, однако экземпляр Excel зависает, ожидая, пока сервер служб Analysis Services вернет результат запроса, и некоторые запросы, вероятно, могут выполняться в течение нескольких минут.

Я бы, вероятно, использовал потоковую передачу для передачи соединения на аутсорсинг в другой поток, но, согласно некоторым другим вопросам, заданным здесь, это невозможно в самой VBA — и у нас есть ограничение не использовать библиотеки DLL, так как нам нужно было бы распространять полученный Excel с его макросами некоторым конечным пользователям, а установка библиотек DLL не вариант. Использование встроенных сводных таблиц Excel также не является вариантом, поскольку мы полагаемся на многомерные функции, такие как intersect и exists.

Существует ли неблокирующий способ отправки запросов на сервер служб Analysis Services с использованием ADOMD в VBA без использования внешних библиотек 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
  

Большое спасибо!

Комментарии:

1. привет, был ли ответ ниже полезен?

Ответ №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 = "'" amp; SomeStringArgument amp; "'!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