Как поместить подсказку в пользовательскую функцию

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

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

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

9 ответов


профессиональное развитие в Excel Стивен Буллен описывается Регистрация функции, которая позволяет описание для отображения в функции Диалог аргументов:

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

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

чтобы открыть диалоговое окно аргументы функции, введите имя функции и нажмите CtrlA. Кроме того, нажмите символ " fx " в Формуле бар:

enter image description here


не решение подсказки, но адекватное обходное решение:

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

например, так:

=MyUDF( + CTRL + Shift + A

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

=MyUDF(sPath, sFileName)


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

теперь я предпочитаю способ C# - это намного проще, так как внутри Excel-DNA любой класс, который реализует IExcelAddin подхватывается платформой addin и имеет AutoOpen() и AutoClose() выполнить когда вы открываете / закрываете add in. Так что вам просто нужно это:

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, поэтому я не использую эти части.


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

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

возврат каретки улучшает читаемость с помощью wordwrap on. 2 птиц с одним камнем, теперь функция имеет некоторую документацию.


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


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


метод@will является лучшим. Просто добавьте несколько строк о деталях для людей, которые не использовали ExcelDNA раньше, как я.

Скачать Excel-ДНК IntelliSense из https://github.com/Excel-DNA/IntelliSense/releases

есть две версии, одна для 64, проверьте версию Excel. Для моего случая я использую версию 64.

откройте Excel / Developer / Add-Ins / обзор и выберите ExcelDna.IntelliSense64.XLL-модуль.

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

затем наслаждайтесь! :)

enter image description here


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


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

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

   = interpolateLinear() 
or
   = interpolateLinear_Help()

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

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

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

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

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

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