Вот неуклюжий подход, который может сработать. Идея состоит в том, чтобы использовать событие Worksheet_Change
для захвата экземпляров, в которые вы вводите неполную версию своей функции, на каком этапе на ячейке отображается выпадающий список проверки данных на лету, что дает вам возможные пути для завершения функции. Затем, снова используя Worksheet_Change
, завершенная версия обнаруживается, превращается в формулу, и валидация данных удаляется.
Как доказательство концепции - я написал версию sin
, которая позволяет пользователю выбрать «Градусы» или «радианы»:
Function Sine(ParamArray args() As Variant) As Variant
On Error GoTo err_handler
If args(1) = "Degrees" Then
Sine = Sin(args(0) * Application.WorksheetFunction.Pi()/180)
Else
Sine = Sin(args(0))
End If
Exit Function
err_handler:
Sine = "=Sine(" & args(0) & ","
End Function
Это бросает неперехваченную ошибку, если пользователь не в наименьший угол.
Затем в Worksheet_Change
я использовал:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim choices As String, angle As String, tval As String
On Error GoTo err_handler
tval = Target.Value
If tval Like "=Sine(*," Then
angle = Mid(tval, 7)
angle = Left(angle, Len(angle) - 1) 'get rid of comma
choices = angle & " Degrees, " & angle & " Radians"
Target.Validation.Add xlValidateList, Formula1:=choices
Target.Select
ElseIf tval Like "* Degrees" Then
Target.Validation.Delete
Target.Formula = "=Sine(" & Val(tval) & ", ""Degrees"")"
Target.Offset(1).Select
ElseIf tval Like "* Radians" Then
Target.Validation.Delete
Target.Formula = "=Sine(" & Val(tval) & ", ""Radians"")"
Target.Offset(1).Select
End If
err_handler:
End Sub
как это работает. В A1 (скажем) введите =Sine(45
и нажмите enter. Вы увидите следующее (после нажатия на стрелку раскрывающегося списка):
Затем, после выбора, например, «45 градусов» формула в A1 становится
=sine(45, "Degrees")
и отображается значение (0,707107), и проверка данных была удалена.
Вариант идеи, которая может быть более гибкой, состоит в том, чтобы отображать пользовательскую форму по ячейке, а не полагаться на эту проверку данных.
Возможный дубликат [Выбор списка аргументов функции VBA] (http://stackoverflow.com/questions/5340002/vba-function-argument-list-select) –
Взгляните на ссылку; похоже, имеет то, что вы ищете. –
Это близко к тому, что я ищу, но список должен быть в Excel, а не в окне VBA. Если у вас есть Excel, откройте его и введите «= CELL (», то вы увидите список. Я читал этот пост несколько минут назад. – dsegovia