Как поместить всплывающую подсказку в пользовательскую функцию
В 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. Довольно легко, и он выглядит профессионально. Просто одна проблема для разработки. Я отправлю отдельный ответ на этот подход позже.