Запуск сохраненного процесса SAS в Excel завершается с ошибкой после двух запусков

Надеюсь, это подходящее место, чтобы задать этот вопрос.

Недавно я создал инструмент анализа данных в Excel, который работает, отправляя данные в SAS Stored Process (как «входной поток»), запуская процессы и отображая результаты в Excel.

Я также использую некоторый код для проверки и удаления всех активных хранимых процессов из рабочей книги перед повторным запуском процесса.

Это успешно выполняется в первые 2 раза, но не выполняется с третьей попытки. Он всегда терпит неудачу в третьей попытке, и я не могу понять, почему.

Есть ли какое-то распределение памяти для Excel VBA, которое исчерпано на этом этапе? Или какой-то другой буфер, который был максимальным? Я вступил в каждую строку кода VBA и, похоже, висит (в третьем прогоне) в следующей строке:

SAS.InsertStoredProcess processLoc, _ outputSheet.Range("A1"), , , inputStream 

Код, используемый для инициирования надстройки SAS для Microsoft Office:

 Dim SAS As SASExcelAddIn Set SAS = Application.COMAddIns.Item("SAS.ExcelAddIn").Object 

Код, используемый для удаления хранимых процессов из целевого выходного листа:

 Dim Processes As SASStoredProcesses Set Processes = SAS.GetStoredProcesses(outputSheet) Dim i As Integer For i = 1 To Processes.Count ' MsgBox Processes.Item(i).DisplayName Processes.Item(i).Delete Next i 

Код, используемый для вставки и запуска хранимого процесса:

 Dim inputStream As SASRanges Set inputStream = New SASRanges inputStream.Add "Prompts", inputSheet.Range("DrillDown_Input") SAS.InsertStoredProcess processLoc, _ outputSheet.Range("A1"), , , inputStream 

ура

Я не знаю, будет ли это полезно, но у меня была аналогичная проблема с запуском DLL, написанной на C ++ через VBA. Проблема возникла из-за того, что функция в DLL вернула двойное значение, которое мне не понадобилось, и поэтому код в VBA

 Call SomeProcessFromDLL() 

Но процесс возвращал значение двойной плавающей запятой, которое «заполняло» некоторую буферную память в VBA, а VBA имеет ограниченный буфер (я думаю, что он отказался от 8 попыток). Поэтому решение для меня было

 Dim TempToDiscard as Double TempToDiscard = SomeProcessFromDLL() 

Может быть, поиск документации о вызываемом процессе поможет здесь, особенно если она возвращает какую-то ценность, которую нужно отбросить в любом случае, например,

 Return 0; 

Мне никогда не нравилось использовать IOM в VBA, главным образом из-за проблем со ссылками и необходимости делать установки клиентов при развертывании приложений. В прошлом году я нашел MUCH лучший способ подключения Excel и SAS – с помощью веб-приложения Stored Process. Просто настройте процесс SAS на стороне сервера с потоковым выходом и передайте свои входы через веб-запрос Excel. Ни один клиент не устанавливает, не заботится о модернизации версии SAS, вряд ли какой-либо код – удивляется, что он не используется чаще!

См .: http://rawsas.blogspot.co.uk/2016/11/sas-as-service-easy-way-to-get-sas-into.html

  • Настроить таблицу вывода, чтобы включить отсутствующую переменную
  • Скрытие, в то время как SAS читается в Data
  • SAS ODS tagsets.excelxp: ширина столбца автоподписи, вызывающая vbscript внутри SAS
  • Напиши многие диапазоны названий Excel из SAS в один лист
  • Импорт таблицы с неизвестной длиной из Excel .xlsm
  • Изменение имен таблиц в SAS ODS динамически
  • SAS разделяет набор данных и экспортирует их в один файл Excel
  • Excel-VBA не копирует SAS-таблицу в лист Excel, даже если нет ошибки
  • Как автоматизировать ежедневную программу SAS EG 4.1 и поместить вывод в Excel и запустить VBA и распечатать PDF?
  • Удаление «почти дубликатов» с использованием SAS или Excel
  • Ошибка SAS при запуске из Excel VBA
  • Давайте будем гением компьютера.