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


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.