Страницы: 1
RSS
[VBA Project] Функция для запоминания промежуточного результата в формуле
 
Привет!  
Часто приходится повторять в формулах один и тот же фрагмент несколько раз.  
Чтобы избежать этого, можно использовать вспомогательную ячейку или определить имя.  
Однако это не всегда возможно, да и неудобно.  
Разработчики сделали шаг в этом направлении, создав функцию ЕСЛИОШИБКА в Excel 2007: функция  
 
=ЕСЛИОШИБКА(длинная_формула;значение)  
 
заменяет такую комбинацию функций предыдущих версий:  
 
=ЕСЛИ(ЕОШИБКА(длинная_формула);значение;длинная_формула)  
 
Кроме повтора длинного фрагмента, если "все хорошо" и нет ошибки, он еще и вычисляется два раза, что может замедлить пересчет.  
 
И я решил создать на VBA функцию, которая обладает следующими свойствами:  
- Если у нее есть аргумент, функция возвращает значение аргумента, а также сохраняет значение и диапазон, откуда она вызвана (Application.Caller).  
- Если аргумент опущен, то Application.Caller сравнивается с сохраненным. Если он совпадает, функция возвращает сохраненное значение. Если не совпадает, возвращается ошибка.  
 
Функцию назвал М по аналогии с кнопкой калькулятора "память". Кроме того, имя функции состоит из одной буквы, чтобы формулы получались максимально короткими. "М" можно вводить и в русской, и в английской раскладке, в модуле находятся оба варианта функции.  
 
Аналог функции ЕСЛИОШИБКА можно реализовать так с помощью М:  
 
=ЕСЛИ(ЕОШИБКА(М(длинная_формула));значение;М())  
 
Функция М рассчитана на то, что ее аргумент может иметь разный тип: диапазон, массив, ошибка.  
 
Прошу потестировать.  
 
В качестве развития можно предусмотреть сохранение нескольких значений из одной ячейки.    
Как лучше поступить? Создать отдельные функции М(х), М1(х), М2(х), ..., М9(х) или    
М(х) и М(х, n) со вторым аргументом? В первом случае запись короче, во втором появляется возможность выбирать одно из сохраненных значений в процессе вычисления. Например, использовать одно из сохраненных значений для выбора другого: М(,М(,1)).  
Все же наиболее часто будет использоваться сохранение одного значения, поэтому простая функция М() должна остаться в любом случае.  
 
И, конечно, надо оформить функцию в виде надстойки.
 
>>Прошу потестировать.  
Я бы с удовольствием, но в формулах не силен : )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Вот пример, длинная формула от ув. МСН из этой темы: http://www.planetaexcel.ru/forum.php?thread_id=30183  
 
Формула содержит два повторяющихся фрагмента, добавил аналогичную функцию М1.
Страницы: 1
Наверх