#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