2016-03-19 9 views
1

У меня есть UDF, который проверяет наличие комментария. Я использую это в CF, потому что хочу окрасить ячейку, если 1. Ячейка не пустая и 2. Нет комментариев. Это отлично работает с 2007 и 2010 годами, но теперь у меня есть 2016 год, а Excel немного странный.Условное форматирование с проблемами udf с Office 2016/Office 365

UDF:

Function HasCmt(Rng As Range) 
    Application.Volatile 

    HasCmt = IIf(Not Rng.Comment Is Nothing, True, False) 

End Function 

CF: = AND (NOT (ISBLANK (B6)), HasCmt (B6) = FALSE)

Теперь, когда я отвечать критериям, форматирование применяется и затем снова уходит. Если я отключу автоматический расчет, он будет вести себя нормально, пока я не пересчитаю. Я также получаю ошибки при сохранении документа. «Расчет неполный ...».

Кто-нибудь знает, какое исправление я могу применить к моим многочисленным книгам, которые у меня есть, которые используют этот CF? Что-то изменилось в предложении Excel в 2016 году?

Любая помощь была бы принята с благодарностью.

Благодаря

+1

Это приложение.независимое должно сильно ударить по рабочей книге. Кроме того, похоже, что он не соответствует вашим двум критериям, поэтому вы должны использовать ISBLANK поверх него. За исключением вопроса 2016 года, рассмотрели ли вы какие-либо другие (более эффективные) методы? Строго говоря, .volatile ничего не делает, чтобы фактически изменить статус ячейки, когда она получает комментарий; это происходит только тогда, когда что-то внутри рабочей книги изменяет, что ВСЕ ячейки повторно оцениваются. – Jeeped

+0

Спасибо, Jeeped. Я не могу придумать альтернативный способ достижения этого, тем более, что с 07 по 2010 год он просто «работал» –

+0

Я удалил application.volatile из UDF и изменил логику на «If Not IsEmpty (rng) Then HasCmt = CBool (Не rng.Comment ничего). При вычислении, установленном в автоматическом режиме, UDF выполнялся, как ожидалось, в правиле CF. Это было в Excel 2013. Я попытаюсь проверить excel 2016 немного позже. – Jeeped

ответ

0

Это кажется, что любые летучие функции в книге (или любой книге в экземпляре приложения) генерировали повторные вызовы событий расчета и UDF был запущен на вершине себя. Условное форматирование «обновляется» в каждом цикле вычислений так же, как и волатильная функция. Использование метода Application.Volatile внутри самого UDF еще более усложняло вопросы.

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

Option Explicit 

Function hasComment(rng As Range) As Boolean 
    'reports true for non-blank with a comment 
    Application.EnableEvents = False 
    If Not IsEmpty(rng) Then _ 
     hasComment = CBool(Not rng.Comment Is Nothing) 
    DoEvents 
    Application.EnableEvents = True 
End Function 

Function hasNoComment(rng As Range) As Boolean 
    'reports true for non-blank with no comment 
    Application.EnableEvents = False 
    If Not IsEmpty(rng) Then _ 
     hasNoComment = Not CBool(Not rng.Comment Is Nothing) 
    DoEvents 
    Application.EnableEvents = True 
End Function 

По существу, Application.EnableEvents property временно приостановлена. Это ограничивает энергозависимые функции при повторных вычислениях. DoEvents function временно приостанавливает повторное выполнение и позволяет очереди сообщений приложений догнать.

Это хорошо работает как основная функция в рамках правила условного форматирования, охватывающего несколько сотен ячеек на листе, содержащем несколько сотен летучих функций.

+0

Это выглядит потрясающе, но по какой-то причине он не форматировал мои ячейки. Я даже попробовал новый WB. Я добавил ваши UDF к новому модулю, и мой CF is = hasNoComment (B2) –

+0

Я могу отправить вам WB, если хотите, или есть что-то еще, препятствующее правильному функционированию? Спасибо –

+0

Отправлено на ваш gmail, спасибо –

Смежные вопросы