Несколько обновлений Oracle Smartview не работают в цикле (работает, когда я перешагиваю код)

У меня есть следующий код, который работает как талисман, когда я пошагово пересекаю его (или даже когда я делаю только 1 или 2 итерации цикла, а затем запускаю остальные). Когда я запускаю его из кнопки, код не работает в том смысле, что Hyperion Retrieve никогда не обновляется для каждой итерации изменяемого отдела. Сам отдел корректно меняется (как видно из Excel и полученного файла PDF).

Таким образом, в двух словах, код работает без видимых или захваченных ошибок, но в результате получается набор PDF-файлов с идентичными данными, хотя они помечаются разными отделами при запуске из-за нажатия кнопки.

Я немного почесал сеть, попробовал использовать DoEvents а также Application.Wait безуспешно У кого-нибудь есть идеи, как обеспечить обновление для каждой итерации цикла при нажатии кнопки?

Option Explicit

Declare Function HypMenuVRefresh Lib "HsAddin.dll" () As Long

Sub CreateAllPDFS()

'... setup code to declare variables and loop range ...


'loop through departments
Dim cel As Range
For Each cel In rngLoop 'rngLoop declared and set in setup code

    'set department on drivers tab
    wsDrivers.Range("B4").Value = "'" & cel.Value

    '*** --> tried to wait before the loop (just shot in the dark type thing)
    'Application.Wait (Now + TimeValue("00:00:02")) 'pauses for 10 seconds, adjust as needed

    'refresh hyperion
    Dim lngReturn As Long
    lngReturn = HypMenuVRefresh()

    ' *** --> tried Do Events
    'DoEvents
    '*** --> tried to wait after the loop
    'Application.Wait (Now + TimeValue("00:00:02")) 'pauses for 10 seconds, adjust as needed

        'quick error check
        If lngReturn <> 0 Then
            MsgBox "Could Not Refresh!"
            Exit Sub
        End If

    'save as pdf
    wsPL.ExportAsFixedFormat xlTypePDF, cel.Offset(, 1) & "\" & cel.Offset(, 2) & ".pdf", , , , , , False

Next

End Sub

1 ответ

Решение

Мы обращаемся к онлайн-документации для HypMenuVReresh где указано, что

HypMenuVRefresh() извлекает данные в активный лист и помещает данные в начало активного листа.

Источник: https://docs.oracle.com/cd/E12032_01/doc/epm.921/html_hsv_user/hsv_help-13-63.htm

Следовательно, решение можно найти, активировав целевой лист (т.е. wsPL.Activate в этом случае) прямо перед выполнением HypMenuVReresh,

Поэтому, как правило, рекомендуется всегда активировать целевой лист до того, как HypMenuVRefresh так как HypMenuVRefresh не будет выдавать ошибку, если обновляется лист, который не подключен к кубу Hyperion. Дополнительно, HypConnected() Можно объявить, чтобы проверить, подключен ли лист к кубу Hyperion (то есть с возможностью обновления Hyperion), прежде чем обновлять его.

HypConnected () возвращает истинное значение, если лист подключен к поставщику, и возвращает ложное значение, если лист не подключен.

Другие вопросы по тегам