Користувацька функція користувача без використання VBA


10

Чи можливо створити власну функцію користувача в Excel без використання VBA?
Моя проблема полягає в тому, що у мене є довга струна стандартних функцій excel, з'єднаних разом, щоб зробити одну дуже довгу функцію. Ця функція використовується в 25 робочих аркушах моєї робочої книги. Якщо мені потрібно внести зміни, я хотів би зробити це лише в одному місці, а зміни поширюватимуться на всіх аркушах автоматично.

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

Я вагаюся перевести довгу формулу у VBA через можливі помилки, які можуть виникнути, та додаткову складність.


Приємне запитання, хоча я сумніваюся, ви знайдете відповідь. Я думаю, що кращим курсом було б звернутися за допомогою до побудови необхідної функції в VBA.
EliadTech

Відповіді:


11

Так, це можливо, якщо ви використовуєте Excel Named Formulas .

Наприклад, припустимо, що вам потрібно обчислити різницю між сумами двох послідовних стовпців ( A5: Ax - B5: Bx ) у різних місцях вашої робочої книги ( x - заключний рядок кожного стовпця):

Отже, ви визначаєте в A11 ім'я, яке називається diff (будь-яке ім'я можна використовувати) як = Сума (A $ 5: A10) -Sum (B $ 5: B10) , припускаючи, що дані починаються в рядку 5 до попереднього рядка. Це може бути будь-яка комірка, не лише A11 , але визначення змінюється так само.

На жаль, Excel 2010 вставляє абсолютні префікси ( $ ) та префікси робочого аркуша, тому потрібно стерти префікси, але зберігаючи знаки оклику та стерти більшість символів $ .

Під час переміщення формул більшість посилань є відносними. Таким чином, він завжди обчислює різницю між поточним стовпцем та наступним, починаючи з рядка 5 до рядка перед загальним рядком.

Отже, якщо у вас є дані між C5 і D100, ви ставите просто = Diff в C101, і він обчислює суму (C5: C100) - суму (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))

Яка перевага використання цього методу над Excel Named Formulas?
DakotaD

Це фактично визначає функцію, тоді як "Названі формули" просто визначають посилання на результат. Наприклад, якщо я хочу створити функцію, яка перевірить, чи клітинка чи порожня, чи просто пробіл, я б хотів її назвати як =IF(BlankOrWhitespace(A5),true,false). Для названих формул це неможливо, оскільки ви посилаєтесь на вміст формули комірки та не визначаєте нову функцію
mtalexan

1
Є ще одна проблема, яка виникає при використанні VBA. Безпека. Ваша робоча книжка вважатиметься небезпечною, оскільки з використанням VBA можна зловживати. У вашій робочій книжці було б помилково заражено вірусом.
Акангка

@Akangkathe причина, чому я уникаю VBA. Це так сумно.
Pedro77

0

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

Коротше кажучи, ви МОЖЕТЕ створити UDF без VBA (свого роду) шляхом викрадення однієї з вбудованих формул Excel з рядковим висновком 0 довжини і придумати метод інтерпретації вставлених даних за допомогою маніпуляції з рядком Named Range, але це поза неефективним для цього. ВИ ПОПЕРЕДЖЕНО! :)

МЕТОД:

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

  2. Тоді я створив іменований діапазон, який був би еквівалент вашого імені UDF ( TCase - це основний приклад на аркуші, але там також є кілька інших варіантів). Цей іменований діапазон фактично посилається на цілу низку інших прихованих імен у робочій книжці, щоб витягти FormulaText з комірки, в якій він використовується, а потім застосувати до неї певну логіку, щоб отримати кінцевий результат у вигляді рядка. Варто зазначити, що цей метод може повертати лише текстові результати, а не числа (хоча він може повернути число у вигляді тексту для перетворення в окрему клітинку).

  3. Сам по собі, = TCase створює помилку, оскільки для його інтерпретації немає посилання на комірку / рядок (на прикладі аркуша повідомлення про помилку - це лише нагадування про формат, якого потрібно дотримуватися). Але поєднання TCase з очікуваною 0-довжиною рядка формули Excel дозволяє їй читати вхідні дані з формули у вигляді рядка та застосовувати до неї вашу логіку. Зрештою, формула / вихід буде виглядати приблизно як нижче. Зауважте, що я вставив текстовий рядок безпосередньо у формулу нижче, але ви побачите на прикладі аркуша, що він також може інтерпретувати посилання однієї комірки.

    ФОРМУЛА:
    =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 - це набагато простіше та елегантніше рішення АДС, але я, принаймні, з задоволенням взявся за завдання.

ПРИМІТКА. Якщо ви хочете трохи легше побачити, як це працює у прикладі, скористайтеся формулою оцінювання зі стрічки Формули та введіть / вимкніть формулу в одній із комірок, куди я вставив приклад. Я приховав усі основні названі діапазони, щоб очистити все після того, як я закінчив, тому вони не відображаються в Менеджері імен, якщо ви їх не приховати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.