Пользовательская функция пользователя без использования VBA

10

Можно ли создать пользовательскую функцию в Excel без использования VBA?
Моя проблема в том, что у меня есть длинная строка стандартных функций Excel, соединенных вместе для создания одной очень длинной функции. Эта функция используется в 25 различных листах моей книги. Если мне нужно внести в него изменения, я бы хотел сделать это только в одном месте, чтобы изменения распространялись по всем листам автоматически.

Например, простым и тривиальным случаем было бы добавить единицу к результату SUM (), т.е. SUM (mySeries) +1, и назовите его новой функцией MYSUM ().

Я не решаюсь переводить длинную формулу в VBA из-за возможных ошибок, которые могут возникнуть, и из-за дополнительной сложности.

DakotaD
источник
Хороший вопрос, хотя я сомневаюсь, что вы найдете ответ. Я думаю, что лучше было бы обратиться за помощью в создании необходимой функции в VBA.
EliadTech

Ответы:

11

Да, это возможно, если вы используете именованные формулы 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) .

Очевидно, что вы можете использовать локальные или глобальные имена в именованных формулах, как вы упоминали в своем вопросе.

Вы можете прочитать более подробную информацию в Именованные формулы .

Пауло Бухсбаум
источник
2

Я знаю, что вы отказались от VBA, но выполнение следующих действий НЕ требует, чтобы вы действительно переписывали свои формулы, много знали о VBA и не поддерживали свои формулы в VBA. Вы можете написать это один раз и забыть об этом.

Создайте пользовательскую функцию для извлечения формулы из ячейки в виде строки:

Function GetFormula(Target As Range) As String
    GetFormula = Target.Formula
End Function

Создайте другой, чтобы оценить строку как формула:

Function Eval(Ref As String)
    Application.Volatile
    Eval = Evaluate(Ref)
End Function

Если бы у вас была основная формула в sheet1! A1, вы бы поместили ее в каждую ячейку, которая должна ее использовать:

=eval(getformula(sheet1!a1))
Madball73
источник
В чем преимущество использования этого метода перед именованными формулами Excel?
DakotaD
Это на самом деле определяет функцию, тогда как «Именованные формулы» просто определяет ссылку на результат. Например, если я хочу создать функцию, которая будет проверять, является ли ячейка пустой или просто пробелом, я бы хотел назвать ее как =IF(BlankOrWhitespace(A5),true,false). Для Именованных Формул это невозможно, потому что вы ссылаетесь на содержимое формулы ячейки и не определяете новую функцию
mtalexan
1
Есть еще одна проблема, которая возникает из-за использования VBA. Безопасность. Ваша рабочая тетрадь будет считаться небезопасной, поскольку VBA может быть нарушена. Ваша книга будет ошибочно принята за вирус.
Akangka
@Akangkathe причина, почему я избегаю VBA. Это так грустно.
Pedro77
0

Этот поток немного староват, но я наткнулся на него, ища что-то еще, и подумал, что поделюсь книгой, которую я создал некоторое время назад, пытаясь добиться именно этой цели: https://www.dropbox.com/s/gf5qrjj5q81tpke/ Title_Case_Named_Range_Function.xlsx? дл = 1

Короче говоря, вы МОЖЕТЕ создать UDF без VBA (в некотором роде), перехватив одну из встроенных формул Excel с выводом строки длиной 0 и предложив метод для интерпретации вставленных данных посредством манипуляции строк именованного диапазона, но это за неэффективным, чтобы сделать это. ВЫ были предупреждены! :)

МЕТОД:

  1. В этом примере я использовал оба = REPT ([ссылка на ячейку или текст между кавычками здесь], 0) и = TEXT ([ссылка на ячейку или текст между кавычками здесь], ";;;") в качестве отправной точки для может иметь некоторую форму пользовательского ввода во встроенную формулу, которая не приведет к отображению видимого текста в самой ячейке.

  2. Затем я создал именованный диапазон , который будет эквивалентен вашему имени UDF ( TCase - основной пример на листе, но есть и несколько других вариантов). Этот именованный диапазон на самом деле ссылается на целый ряд других скрытых имен в книге, чтобы извлечь FormulaText из ячейки, в которой он используется, а затем применить к нему некоторую логику для получения окончательного результата в виде строки. Стоит отметить, что этот метод может возвращать только текстовые результаты, а не числа (хотя он может возвращать число в виде текста для преобразования в отдельную ячейку).

  3. Сам по себе = TCase выдает ошибку, поскольку нет ссылки на ячейку / строку, которую он мог бы интерпретировать (на листе примера сообщение об ошибке является лишь напоминанием о формате, которому необходимо следовать). Но, объединяя TCase с ожидаемой формулой Excel в виде строки длиной 0, она позволяет читать входные данные формулы в виде строки и применять к ней свою логику. В конце формула / вывод будет выглядеть примерно так: Обратите внимание, что я вставил текстовую строку непосредственно в формулу ниже, но на листе примера вы увидите, что он также может интерпретировать ссылку на одну ячейку.

    ФОРМУЛА:
    =TCase&REPT("i want to convert this mIxEd sTRing into A TITLE cAsE string!!!",0)

    ВЫВОД:

    I Want to Convert This Mixed String Into a Title Case String!!!

В конце концов, я не рекомендовал бы следовать этому методу для чего-либо кроме болезненного любопытства, чтобы увидеть, к каким ограничениям Excel может быть применен. VBA - намного более простое и элегантное решение UDF, но я, по крайней мере, получал удовольствие, принимая вызов.

ПРИМЕЧАНИЕ. Если вы хотите увидеть, как это работает в файле примера, немного проще, воспользуйтесь формулой Evaluate Formula с ленты Formulas и войдите в / из формулы в одной из ячеек, куда я вставил пример. Я спрятал все базовые именованные диапазоны, чтобы очистить их после того, как я закончу, чтобы они не отображались в менеджере имен, если выне отобразитеих все.

Кирк
источник