Excel Power Query, VBA и пересчет: это сложно - PullRequest
1 голос
/ 29 января 2020

Я недавно начал работать с Excel Power Query, получая данные из SharePoint. Все работало хорошо, пока я не заметил, что некоторые ячейки на листе, выполняющие поиск по результату запроса (оба в одной и той же книге), не рассчитываются. Значение только показало 0. Когда я выбрал ячейку и нажал ввод, произошел перерасчет для ячейки, и было показано правильное значение. Метод вычисления - «Automati c, за исключением таблиц данных» (надеюсь, я перевел это правильно).

Я проследил проблему до определенного c UDF, который я использую во многих моих UDF, функция, проверяющая диапазон (или, точнее, параметр) был пересчитан, и если нет, то внешний UDF немедленно завершается. Это распространенная рекомендация на многих сайтах для повышения производительности, и у меня никогда не возникало с этим проблем - до момента появления мощного запроса, т. Е.

Кажется, есть несколько возможных решений, которые можно найти:

  • Каким-то образом вызвать полный пересчет и перестроение после выполнения запроса. Потребуется какой-то триггер или событие (которого я в настоящее время не знаю).
  • Сделать UDF, который проверяет, является ли аргумент грязным, более интеллектуальным. По наблюдаемому поведению мой вывод состоит в том, что таблица, содержащая результат запроса, всегда считается грязной (?). Если да, то обучение UDF об этом поможет.
  • Убедитесь, что результаты запроса всегда считаются чистыми в excel.

Я бы предпочел избежать первого решения. Третье решение звучит так, как будто оно может иметь нежелательные побочные эффекты, поэтому я бы предпочел второе место: улучшить проверку UDF, если аргумент грязный.

Здесь он находится в своем текущем состоянии (приводя к описанное выше поведение):

Public Function chkRngCalculated(theParameter As Variant) As Boolean
    Dim vHasFormula     As Variant
    chkRngCalculated = True
    On Error GoTo Fail
    If TypeOf theParameter Is Excel.Range Then
        vHasFormula = theParameter.HasFormula
        ' HasFormula can be True, False or Null:
        ' Null if the range contains a mix of Formulas and data
        If IsNull(vHasFormula) Then vHasFormula = True
        If vHasFormula Then
            ' CountA returns 0 if any of the cells are not yet calculated
            If Application.WorksheetFunction.CountA(theParameter) = 0 Then chkRngCalculated = False
        End If
    ' a calculated parameter is Empty if it references uncalculated cells
    ElseIf VarType(theParameter) = vbEmpty Then
        chkRngCalculated = False
    End If
    Exit Function
Fail:
    chkRngCalculated = False
End Function

Обычно вызывается в одной из первых строк UDF, очевидно, никогда непосредственно из ячеек Excel. Ниже показано, как она вызывается из моей функции поиска:

Public Function searchKeyed(target As Range, rowKey As Variant, columnKey As Variant) As Variant
    If Not chkRngCalculated(target) Then Exit Function
...

Я проверил, что, если я закомментирую оператор if, значения обновляются корректно после обновления запроса.

Фоновое обновление запросов отключено. Переключение на пересчет «Automati c» из «Automati c, за исключением таблиц данных» не меняет описанное поведение.

Кто-нибудь испытал подобное и нашел решение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...