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