Лед по возрасту после первоначального вопроса, но столкнулся с подобной проблемой только сегодня, когда я создал UDF, чтобы определить, какие значения фильтра сводной таблицы были выбраны. UDF будет нормально работать при работе в редакторе макросов, а также при непосредственном обновлении поля, в котором использовалась UDF, но выдает «#VALUE!
» при обновлении таблицы или сводной таблицы.
Это убивало меня до тех пор, пока я постепенно не добавил контент из моего оригинального UDF в простую функцию АлиА monitorRange. Затем я обнаружил, что в моей пользовательской функции есть оператор обновления сводной таблицы, который при удалении устраняет ошибку «#VALUE!
». Ниже приведены конкретные оскорбительные строки из моей UDF, но общее правило заключается в том, что UDF не может иметь никакого кода в своей цепочке вызовов, который обновляет другое содержимое книги. То есть UDF должен только получать значения, НЕ устанавливать значения.
Я проверил это с помощью следующих двух сценариев, которые оба вызывают эту ошибку:
- Обновить сводку, например:
pt.PivotCache.Refresh
- Изменить значение другой ячейки, например:
Range("AA1").Value = "Test"
Странно, я проверил и обнаружил, что абсолютно нормально (на самом деле круто), что UDF может включать вызов MsgBox для отображения диалога без проблем. Это позволило бы UDF отслеживать диапазон, а затем открывать диалоговое окно msgbox для любого условия, которое вы хотите включить в UDF. Я буду помнить это для других ситуаций.
Надеюсь, это поможет другим, сталкивающимся с этой неприятной проблемой сора.