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

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

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

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

Ответ 1

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

Ответ 2

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

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

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

=MyUDF( + CTRL + Shift + A

Включение в это:

=MyUDF(sPath, sFileName)

Ответ 3

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

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 [email protected] for more information."

END FUNCTION

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

Ответ 4

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

Теперь я предпочитаю способ С# сделать это - это намного проще, как в Excel-DNA, любой класс, который реализует IExcelAddin, подхватывается каркасом addin и имеет 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, поэтому я не использую эти части.

Ответ 5

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

Ответ 6

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

Ответ 7

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

Кредиты Kendall и исходное сообщение здесь. Для Категории UDF

Ответ 8

Метод @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

Тогда наслаждайся!:)

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

Ответ 9

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

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

   = interpolateLinear() 
or
   = interpolateLinear_Help()

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

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

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

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

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

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