Як розмістити підказку на визначеній користувачем функції


78

Як в Excel 2007 додати опис та підказки щодо параметрів до визначеної користувачем функції? Коли я починаю вводити виклик функції для вбудованої функції, Excel показує опис та список параметрів - підказку. Я хотів би зробити те саме для функцій, які я визначаю.

Не тільки для майстра вставки формули, але і у вікно формули, тому, якщо я натисну "=myFun(", "("підказка з’явиться, як і для"=average("

У довідці VBA немає допомоги, жодної на MSDN та жодного з форумів Excel та VBA, які я можу знайти, тому це явно довгий крок.


Не підказка ... але це щось ... xcell05.free.fr/english/index.html HTH!
— Доктор Белісаріус,

Дякую b. Це виглядає трохи страшно, але якщо це працює, це рішення.
— Marc Thibault

Це тепер підтримується для VBA і інших видів надбудов (.NET, Python і т.д.) з розширенням Excel-ДНК IntelliSense: excel-dna.net/2016/11/24 / ...
— Govert

Зазвичай я надаю своїм користувачам інструкції type = myfunction ("допомога"), щоб отримати довідку щодо синтаксису, і просто ставлю оператор if, щоб повернути intellisense. цікаво подивитися, чи працює підхід Говерта теж.
— Clouse24,

Відповіді:


60

Професійна розробка Excel, Стівен Буллен, описує, як реєструвати UDF, що дозволяє опис відображатись у діалоговому вікні "Аргументи функцій":

Function IFERROR(ByRef ToEvaluate As Variant, ByRef Default As Variant) As Variant
    If IsError(ToEvaluate) Then
        IFERROR = Default
    Else
        IFERROR = ToEvaluate
    End If
End Function

Sub RegisterUDF()
    Dim s As String
    s = "Provides a shortcut replacement for the common worksheet construct" & vbLf _
    & "IF(ISERROR(<expression>), <default>, <expression>)"

    Application.MacroOptions macro:="IFERROR", Description:=s, Category:=9
End Sub

Sub UnregisterUDF()
    Application.MacroOptions Macro:="IFERROR", Description:=Empty, Category:=Empty
End Sub

З: http://www.ozgrid.com/forum/showthread.php?t=78123&page=1

Щоб відобразити діалогове вікно аргументів функції, введіть назву функції та натисніть CtrlA. Або натисніть на символ "fx" у рядку формул:

введіть тут опис зображення


Нові аргументи в методі дозволяють описувати параметри функції.
— Вільгельм

Я все ще не розумію, чи можете ви зробити це простіше, будь ласка? IFERROR - це оригінальна функція, де ви показуєте опис, або допоміжна функція, яка потрібна для реєстрації UDF ?!
— Чорний

1
Кілька років потому IFERROR є оригінальною функцією. (un) RegisterUFD - це помічники, які (не) застосовують до нього текст довідки.
— Фелісіо

97

Не підказка, а адекватне обхідне рішення:

Почніть вводити UDF, =MyUDF(потім натисніть CTRL+ Shift+, Aі будуть відображатися параметри ваших функцій. Поки ці параметри мають значущі імена, ви, принаймні, маєте життєздатне запит

Наприклад, це:

=MyUDF(+ CTRL+ Shift+A

Перетворюється на це:

=MyUDF(sPath, sFileName)


4
Незважаючи на те, що люди сумніваються, що це допомагає OP, це найголосніший внесок у ланцюжок (мій голос включений). Що доводить, що SO не про допомогу конкретному ОП, а про допомогу громаді загалом. Дякую.
— hypers

13

Я знаю, що ви прийняли відповідь на це, але тепер є рішення, яке дозволяє отримати спливаюче вікно завершення стилю intellisense, як і для інших функцій excel, за допомогою додавання Excel-DNA або за допомогою реєстрації сервера intellisense у вашому власне додавання. Дивіться тут .

Тепер я віддаю перевагу способу C # - це набагато простіше, оскільки всередині Excel-DNA будь-який клас, який реалізується IExcelAddin, підбирається структурою аддінів і має AutoOpen()та AutoClose()запускається, коли ви відкриваєте / закриваєте додавання. Отже, вам просто потрібно :

namespace MyNameSpace {
    public class Intellisense : IExcelAddIn {
        public void AutoClose() {
        }
        public void AutoOpen() {
            IntelliSenseServer.Register();
        }
    }
}

а потім (а це просто взято зі сторінки github), вам просто потрібно використовувати анотації ExcelDNA для своїх функцій:

[ExcelFunction(Description = "A useful test function that adds two numbers, and returns the sum.")]
public static double AddThem(
    [ExcelArgument(Name = "Augend", Description = "is the first number, to which will be added")] 
    double v1,
    [ExcelArgument(Name = "Addend", Description = "is the second number that will be added")]     
    double v2)
{
    return v1 + v2;
}

які коментуються за допомогою анотацій ExcelDNA, сервер intellisense підбере імена аргументів та описи.

введіть тут опис зображення введіть тут опис зображення

Є приклади того, як використовувати його лише з VBA, але я не надто захоплююсь своїм VBA, тому я не використовую ці частини.


1
Тут описано, як використовувати розширення Excel-DNA IntelliSense з VBA тут: fastexcel.wordpress.com/2016/10/07/…
— Говерт

8

Я просто створюю "довідкову" версію функції. Показується безпосередньо під функцією в автозавершенні - користувач може вибрати її замість цього у сусідній комірці для отримання інструкцій.

Public Function Foo(param1 as range, param2 as string) As String

    Foo = "Hello world"

End Function

Public Function Foo_Help() as String

Foo_Help = "The Foo function was designed to return the Foo value for a specified range a cells given a specified constant." & CHR(10) & "Parameters:" & CHR(10)
& "  param1 as Range   :   Specifies the range of cells the Foo function should operate on." & CHR(10)
&"  param2 as String  :   Specifies the constant the function should use to calculate Foo"
&" contact the Foo master at master@foo.com for more information."

END FUNCTION

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


2
Мені подобається цей метод, тому що він дозволяє уникнути всіх божевільних речей, які потрібно робити, якщо ви хочете отримати справжні підказки, схожі на Excel, для ваших UDF.
— Маркус Мангельсдорф,

Це здається чудовою ідеєю. Якщо користувач звертає увагу, він побачить альтернативну UDF із суфіксом _Help. Я спробував сам. Не гарно з ним, хоча. Це проходить через повторювані цикли, іноді до тих пір, поки я не отримаю кругове попередження. Не знаю, про що це. Без прецедентів, просто повернення нульового рядка до комірки. Перш ніж хтось запитає, у мене немає application.volatile (або true, або false) в моєму UDF.
— riderBill

6

Також ви можете використовувати цей макрос для призначення Описів аргументам та UDF:

Private Sub RegisterMyFunction()
Application.MacroOptions _
    Macro:="SampleFunction", _      '' Your UDF name
    Description:="calculates a result based on provided inputs", _
    Category:="My UDF Category", _  '' Or use numbers, a list in the link below
    ArgumentDescriptions:=Array( _  '' One by each argument
        "is the first argument.  tell the user what it does", _
        "is the second argument.  tell the user what it does")
End Sub

Подяки Кендалл та оригінальний пост тут . Для категорій ОДС


Я розмістив його у Workbook_Open (), і він повинен бути загальнодоступним. Працює тут в Excel 2013. Відмінно!
— chingNotCHing

5

Найкращим є метод @ will. Просто додайте кілька рядків про деталі для людей, які раніше не користувались ExcelDNA, як я.

Завантажте Excel-DNA IntelliSense з https://github.com/Excel-DNA/IntelliSense/releases

Є дві версії, одна для 64, перевірте свою версію Excel. Для мого випадку я використовую 64 версію.

Відкрийте Excel / Developer / Add-Ins / Browse та виберіть ExcelDna.IntelliSense64.xll.

Вставте новий аркуш, змініть назву на " IntelliSense ", додайте опис функції, як https://github.com/Excel-DNA/IntelliSense/wiki/Getting-Started

Тоді насолоджуйтесь! :)

введіть тут опис зображення


2

На жаль, немає можливості додати підказки для аргументів UDF.
Щоб розширити відповідь Ремоу, ви можете знайти більш повний, але більш складний підхід до описів Майстра функцій за
адресою http://www.jkp-ads.com/Articles/RegisterUDF00.asp


Оскільки аргументи Office 2010 можна коментувати за допомогою цієї відповіді .
— Вільгельм

@Wilhelm, це правильно, але все ще не надає підказок навіть у XL 2010
— Чарльз Вільямс,

1

Багато танців навколо відповіді. Ви можете додати контекстну довідку UDF, але вам потрібно експортувати Модуль та відредагувати вміст у текстовому редакторі, а потім повторно імпортувати його у VBA. Ось приклад від Chip Pearson: Додавання атрибутів коду


0

Я спробував підхід @ ScottK, спочатку як побічну функцію мого функціонального UDF, потім як окрему версію суфікса _Help, коли я зіткнувся з проблемою (див. Нижче). З огляду на минуле, останній підхід у будь-якому випадку кращий - більш очевидний для користувача, досить уважного, щоб побачити підказку інструменту, і він не захаращує функціональний код.

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

   = interpolateLinear() 
or
   = interpolateLinear_Help()

msgBox відкривається з текстом довідки. MsgBox обмежений ~ 1000 символами, можливо, це 1024. Але цього достатньо (ледь 8 ^ /) для моєї надто обдуреної функції інтерполяції. Якщо це не так, ви завжди можете відкрити форму користувача та поїхати до міста.

Коли вперше відкрилося вікно повідомлення, це виглядало як успіх. Але є пара проблем. По-перше, користувач повинен знати, щоб ввести функцію без аргументів (+1 для суфікса _Help UDF).

Велика проблема, тим MsgBox знову відкриває кілька разів поспіль, спонтанно під час роботи в незв'язаних частинах книги. Що й казати, це дуже дратує. Іноді це триває, поки я не отримаю кругове попередження про посилання. Піди розберися. Якби UDF міг змінити формулу комірки, я б зробив це, щоб замовкнути її.

Я не знаю, чому Excel відчуває потребу в перерахунку формули знову і знову; ні автономна _Help, ні повна версія (у режимі довідки) не мають прецедентів або залежних. Ніде немає заявки application.volatile . Звичайно, функція повертає значення у клітинку, що викликає. Можливо, це викликає повторення? Але це те, що роблять СДС. Я не думаю, що ви не можете повернути значення.

Оскільки ви не можете змінити формулу робочого аркуша з UDF, я спробував повернути певний рядок - значення - у викличну комірку (єдину, яку ви можете змінити значення з UDF), вважаючи, що я б перевірив значення комірки за допомогою application.caller у наступному циклі, визначте мій рядок і знайте, що не потрібно повторно відображати довідкове повідомлення. На той час це здавалося гарною ідеєю - не спрацювало. Можливо, я зробив щось дурне у своєму недосипаному стані. Мені ідея досі подобається. Я оновлю це, коли (якщо) вирішу проблему. Моїм швидким виправленням було додати рядок у вікні довідки: " Шукати допомогу лише в екстреному випадку. Видаліть формулу, що порушує, щоб покласти край нещастю.

Тим часом я спробував підхід Application.MacroOptions. Досить просто, і це виглядає професійно. Тільки одна проблема, яку потрібно вирішити. Пізніше я опублікую окрему відповідь на цей підхід.

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