Страницы: 1
RSS
Зачем нужен метод Volatile() ?
 
Из справки:  
Volatile() — этот метод должен вызываться только из пользовательской функции, которая вычисляет значение ячейки. Если он вызван и ему передано значение True, то данная ячейка становится чувствительной (volatile) и она будет пересчитываться при любом изменении значений в листе, даже том, которое ее не касается.    
 
Вопрос: Зачем может понадобиться летучесть?
 
Сергей, ну, предположим, вы написали UDF (пользовательскую функцию), вставили её на лист - она пересчитала и выдала какой-то результат.    
А теперь вы изменили значения в зависимых ячейках - упс, а функция показывает старый результат. Приходится заново входить в ячейку с функцией и нажимать Enter для пересчёта. Чтобы так не делать вы прописываете Volatile внутри функции и она становится летучей - и работает как обычная функция листа Excel.
 
"...и она будет пересчитываться при любом изменении значений в листе, ДАЖЕ ТОМ, КОТОРОЕ ЕЕ НЕ КАСАЕТСЯ..."  
 
А что в ВБА нет метода, который пересчитывал бы функцию только при изменениях в зависимых ячейках?
 
И чем тогда Volatile отличается от Calculate?
 
Ну, метод Calculate - пересчитывает формулы на всех листах, в указанном листе, или в указанном диапазоне, а метод Volatile - помечает пользовательскую функцию как "летучую", чтобы она автоматически пересчиталась вместе с другими ячейками на листе. А "нелетучая" функция пересчитается лишь тогда, когда изменятся значения в зависимых ячейках, т.е. когда изменятся аргументы этой функции (а не любая ячейка на листе)  
 
P.S. Небольшой пример.
 
{quote}{login=}{date=22.05.2010 01:12}{thema=}{post}Сергей, ну, предположим, вы написали UDF (пользовательскую функцию), вставили её на лист - она пересчитала и выдала какой-то результат.    
А теперь вы изменили значения в зависимых ячейках - упс, а функция показывает старый результат. Приходится заново входить в ячейку с функцией и нажимать Enter для пересчёта. Чтобы так не делать вы прописываете Volatile внутри функции и она становится летучей - и работает как обычная функция листа Excel.{/post}{/quote}  
Я сильно извиняюсь, но объяснение, по-моему, крайне спорное. Если есть зависимые ячейки, то функция как раз пересчитает и без Volatile как только произойдет изменение их значения. Я бы сказал, что использование Volatile как правило оправдано если нет возможности отследить изменения там, где это нужно, например:  
1) результат зависит от изменения формата (а не значения) зависимой ячейки, например:  
Function Test(arg1 As Range) As String  
If arg1.Interior.ColorIndex=5 Then Test="Good" Else Test="Bad"  
End Function  
В данном случае, поскольку изменение цвета заливки ячейки не вызывает события пересчета, можно сделать функцию Test летучей, чтобы если не сразу, то хоть пересчитать при ближайшей возможности.  
2) в подсчете результата используются значения ячеек получаемые не через аргументы функции, а напрямую, например:  
Function Test(arg1 As String) As String  
If [A1]=1 Then Test=arg1 Else Test=""
End Function  
В данном случае функция Test не отреагирует на изменение значения в ячейке [A1]. Но это в большинстве случаев ошибка в написании функции
 
и т.п.
KL
 

Еще тут можно почитать: http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

KL
 
KL, спасибо!
 
{quote}{login=}{date=22.05.2010 01:12}{thema=}{post}...и она становится летучей - и работает как обычная функция листа Excel.{/post}{/quote}  
Кстати, это тоже любопытное утверждение. Из более чем 300 встроенных функций листа не наберется и десятка летучих, а если точнее, то их 7 :-)
KL
 
))) тогда так  
 
"...и работает как одна из 7 летучих функций Excel" ))
 
{/quote}а если точнее, то их 7{/quote}  
Огласите весь список, пжлста.
 
{quote}{login=}{date=22.05.2010 06:54}{thema=Re: Re: }{post}{/quote}а если точнее, то их 7{/quote}  
Огласите весь список, пжлста.{/post}{/quote}  
В версиях с 97 по 2007 - это следующие функции:  
СЛЧИС()  
СЕГОДНЯ()  
ТДАТА()  
ЯЧЕЙКА()  
СМЕЩ()  
ДВССЫЛ()  
ИНФОРМ()  
 
Еще можно почитать тут:    
http://www.decisionmodels.com/calcsecretsi.htm
KL
 
{quote}{login=The_Prist}{date=22.05.2010 07:13}{thema=}{post}Добавлю, что для счастливых обладателей 2007 Офиса и старше функций 8. Еще есть  СЛУЧМЕЖДУ. Если мне не изменяет память, то она тоже летучая...{/post}{/quote}действительно, как-то упустил из виду бывшую надстройку - пакет анализа :-) спасибо за поправку.
KL
 
{quote}{login=KL}{date=22.05.2010 07:09}{thema=Re: Re: Re: }{post}В версиях с 97 по 2007 - это следующие функции:  
СЛЧИС()  
СЕГОДНЯ()  
ТДАТА()  
ЯЧЕЙКА()  
СМЕЩ()  
ДВССЫЛ()  
ИНФОРМ()  
{/post}{/quote}Т.е. ДРВ() - не летучая?  
А как же тогда обновления реалтайм?
 
{quote}{login=Serge 007}{date=22.05.2010 11:02}{thema=Re: Re: Re: Re: }{post}Т.е. ДРВ() - не летучая?  
А как же тогда обновления реалтайм?{/post}{/quote}  
С ДРВ() не работаю, но нет - она не летучая (на всякий случай протестировал :-)). Обновления реалтайм скорее всего - дело рук комаддина :-)
KL
Страницы: 1
Читают тему
Наверх