Как поместить всплывающую подсказку на пользовательскую функцию - PullRequest
68 голосов
/ 24 ноября 2010

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

Не только для мастера вставки формул, но и в поле формулы, поэтому, если я наберу "=myFun(", в "(" всплывающая подсказка появляется так же, как и для "=average("

В справке VBA нет никакой помощи, ни на MSDN, ни на каких-либо форумах, посвященных Excel и VBA, которые я могу найти, так что это явно долгий путь.

Ответы [ 9 ]

87 голосов
/ 23 января 2013

Не решение всплывающей подсказки, а адекватный обходной путь:

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

Например, это:

=MyUDF( + CTRL + Сдвиг + A

Превращается в это:

=MyUDF(sPath, sFileName)

53 голосов
/ 24 ноября 2010

Профессиональная разработка в 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

Чтобы отобразить диалоговое окно «Аргументы функции», введите имя функции и нажмите Ctrl A . Также можно щелкнуть символ «fx» на панели формул:

enter image description here

8 голосов
/ 12 октября 2016

Я знаю, что вы приняли ответ на этот вопрос, но теперь есть решение, которое позволяет вам получить всплывающее окно завершения стиля 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 будет подбирать имена и описания аргументов.

enter image description here enter image description here

Есть примеры использования его только с VBA, но я не слишком увлечен своим VBA, поэтому я не использую эти части.

8 голосов
/ 06 ноября 2014

Я просто создаю «справочную» версию функции. Показывается прямо под функцией автозаполнения - пользователь может вместо этого выбрать ее в соседней ячейке для инструкций.

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 голосов
/ 06 июля 2017

Также вы можете использовать этот макрос для назначения описаний аргументам и 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

Кредиты для Кендалл и оригинальный пост здесь Для категорий UDF

2 голосов
/ 15 апреля 2016

Много танцев вокруг ответа.Вы можете добавить контекстную справку UDF, но вы должны экспортировать Модуль и отредактировать содержимое в текстовом редакторе, а затем повторно импортировать его в VBA.Вот пример из Chip Pearson: Добавление атрибутов кода

2 голосов
/ 24 ноября 2010

К сожалению, нет способа добавить всплывающие подсказки для аргументов UDF.Чтобы расширить ответ Рему, вы можете найти более полный, но более сложный подход к описаниям для мастера функций по адресуhttp://www.jkp -ads.com / Статьи / RegisterUDF00.asp

1 голос
/ 14 декабря 2016
Метод

@ будет лучшим.Просто добавьте несколько строк о подробностях, чтобы люди, которые раньше не использовали 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

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

enter image description here

0 голосов
/ 08 декабря 2015

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

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

   = interpolateLinear() 
or
   = interpolateLinear_Help()

, открывается msgBox с текстом справки.Поле msgBox ограничено ~ 1000 символов, может быть, это 1024. Но этого достаточно (едва 8 ^ /) для моей чрезмерно обманутой функции интерполяции.Если это не так, вы всегда можете открыть форму пользователя и перейти в город.

При первом открытии окна сообщения это выглядело как успех.Но есть пара проблем.Прежде всего, пользователь должен знать, чтобы войти в функцию без аргументов (+1 для суффикса _Help UDF).

Проблема big в том, что msgBox открывается несколько раз подряд, самопроизвольно при работе в несвязанных частях рабочей книги.Излишне говорить, что это очень раздражает.Иногда это продолжается до тех пор, пока я не получу предупреждение о круговой ссылке.Пойди разберись.Если бы UDF мог изменить формулу ячейки, я бы сделал это, чтобы закрыть ее.

Я не знаю, почему Excel чувствует необходимость пересчитывать формулу снова и снова;ни автономная _Help, ни полная версия (в режиме справки) не имеют прецедентов или иждивенцев.Нигде нет оператора application.volatile .Конечно, функция возвращает значение в вызывающую ячейку.Может быть, это вызывает повторный вызов?Но это то, что делают UDF.Я не думаю, что вы можете не вернуть значение.

Так как вы не можете изменить форму формулы из UDF, я попытался вернуть определенную строку--a value - в вызывающую ячейку (единственную, в которой вы можете изменить значение из UDF), полагая, что я проверю значение ячейки, используя application.caller наВ следующем цикле найдите мою строку и не пытайтесь повторно отображать справочное сообщение.В то время это казалось хорошей идеей - не сработало.Может быть, я сделал что-то глупое в своем лишенном сна состоянии.Мне все еще нравится идея.Я обновлю это, когда (если) я решу проблему.Мое быстрое решение состояло в том, чтобы добавить строку в поле справки: « Обратиться за помощью только в чрезвычайной ситуации. Удалите оскорбительную формулу, чтобы положить конец страданиям.

Тем временем я попробовал приложениеПодход .MacroOptions. Довольно простой, и выглядит профессионально. Только одна проблема, которую нужно решить. Позже я опубликую отдельный ответ по этому подходу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...