Можно ли создать пользовательскую функцию в Excel без использования VBA?
Моя проблема в том, что у меня есть длинная строка стандартных функций Excel, соединенных вместе для создания одной очень длинной функции. Эта функция используется в 25 различных листах моей книги. Если мне нужно внести в него изменения, я бы хотел сделать это только в одном месте, чтобы изменения распространялись по всем листам автоматически.
Например, простым и тривиальным случаем было бы добавить единицу к результату SUM (), т.е. SUM (mySeries) +1, и назовите его новой функцией MYSUM ().
Я не решаюсь переводить длинную формулу в VBA из-за возможных ошибок, которые могут возникнуть, и из-за дополнительной сложности.
microsoft-excel
worksheet-function
vba
DakotaD
источник
источник
Ответы:
Да, это возможно, если вы используете именованные формулы Excel .
Например, предположим, что вам нужно вычислить разницу между суммами двух последовательных столбцов ( A5: Ax - B5: Bx ) в разных местах вашей рабочей книги ( x - последняя строка каждого столбца):
Таким образом, вы определяете в A11 имя с именем diff (может использоваться любое имя) как = Sum (A $ 5: A10) -Sum (B $ 5: B10) , предполагая, что данные начинаются со строки 5 до предыдущей строки. Это может быть любая ячейка, не только A11 , но определение меняется таким же образом.
К сожалению, в Excel 2010 вставляются абсолютные префиксы ( $ ) и префиксы рабочих листов, поэтому вам нужно стереть префиксы, но сохранить восклицательные знаки и стереть большинство символов $ .
При перемещении формул большинство ссылок являются относительными. Таким образом, он всегда вычисляет разницу между текущим столбцом и последующим, начиная со строки 5 до строки перед итоговой строкой.
Таким образом, если у вас есть данные между C5 и D100, вы просто указываете = Diff в C101, и он вычисляет сумму (C5: C100) - Sum (D5: D100) .
Очевидно, что вы можете использовать локальные или глобальные имена в именованных формулах, как вы упоминали в своем вопросе.
Вы можете прочитать более подробную информацию в Именованные формулы .
источник
Я знаю, что вы отказались от VBA, но выполнение следующих действий НЕ требует, чтобы вы действительно переписывали свои формулы, много знали о VBA и не поддерживали свои формулы в VBA. Вы можете написать это один раз и забыть об этом.
Создайте пользовательскую функцию для извлечения формулы из ячейки в виде строки:
Создайте другой, чтобы оценить строку как формула:
Если бы у вас была основная формула в sheet1! A1, вы бы поместили ее в каждую ячейку, которая должна ее использовать:
источник
=IF(BlankOrWhitespace(A5),true,false)
. Для Именованных Формул это невозможно, потому что вы ссылаетесь на содержимое формулы ячейки и не определяете новую функциюЭтот поток немного староват, но я наткнулся на него, ища что-то еще, и подумал, что поделюсь книгой, которую я создал некоторое время назад, пытаясь добиться именно этой цели: https://www.dropbox.com/s/gf5qrjj5q81tpke/ Title_Case_Named_Range_Function.xlsx? дл = 1
Короче говоря, вы МОЖЕТЕ создать UDF без VBA (в некотором роде), перехватив одну из встроенных формул Excel с выводом строки длиной 0 и предложив метод для интерпретации вставленных данных посредством манипуляции строк именованного диапазона, но это за неэффективным, чтобы сделать это. ВЫ были предупреждены! :)
МЕТОД:
В этом примере я использовал оба = REPT ([ссылка на ячейку или текст между кавычками здесь], 0) и = TEXT ([ссылка на ячейку или текст между кавычками здесь], ";;;") в качестве отправной точки для может иметь некоторую форму пользовательского ввода во встроенную формулу, которая не приведет к отображению видимого текста в самой ячейке.
Затем я создал именованный диапазон , который будет эквивалентен вашему имени UDF ( TCase - основной пример на листе, но есть и несколько других вариантов). Этот именованный диапазон на самом деле ссылается на целый ряд других скрытых имен в книге, чтобы извлечь FormulaText из ячейки, в которой он используется, а затем применить к нему некоторую логику для получения окончательного результата в виде строки. Стоит отметить, что этот метод может возвращать только текстовые результаты, а не числа (хотя он может возвращать число в виде текста для преобразования в отдельную ячейку).
Сам по себе = TCase выдает ошибку, поскольку нет ссылки на ячейку / строку, которую он мог бы интерпретировать (на листе примера сообщение об ошибке является лишь напоминанием о формате, которому необходимо следовать). Но, объединяя TCase с ожидаемой формулой Excel в виде строки длиной 0, она позволяет читать входные данные формулы в виде строки и применять к ней свою логику. В конце формула / вывод будет выглядеть примерно так: Обратите внимание, что я вставил текстовую строку непосредственно в формулу ниже, но на листе примера вы увидите, что он также может интерпретировать ссылку на одну ячейку.
ФОРМУЛА:
=TCase&REPT("i want to convert this mIxEd sTRing into A TITLE cAsE string!!!",0)
ВЫВОД:
В конце концов, я не рекомендовал бы следовать этому методу для чего-либо кроме болезненного любопытства, чтобы увидеть, к каким ограничениям Excel может быть применен. VBA - намного более простое и элегантное решение UDF, но я, по крайней мере, получал удовольствие, принимая вызов.
ПРИМЕЧАНИЕ. Если вы хотите увидеть, как это работает в файле примера, немного проще, воспользуйтесь формулой Evaluate Formula с ленты Formulas и войдите в / из формулы в одной из ячеек, куда я вставил пример. Я спрятал все базовые именованные диапазоны, чтобы очистить их после того, как я закончу, чтобы они не отображались в менеджере имен, если выне отобразитеих все.
источник