Я недавно начал работать с 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, за исключением таблиц данных» не меняет описанное поведение.
Кто-нибудь испытал подобное и нашел решение?