2015-08-21 3 views
1

У меня есть пользовательскую функцию в Excel (VBA), но я пытаюсь сделать что-то вроде этого списка в функции CELL:VBA Пользовательские Excel Функция с списка

Try в Excel:

= CELL (Тип_информации [а затем здесь появится выпадающий список]

Итак, я хочу:

= MyFunction (my_variable [и мой пользовательский выпадающий список здесь]

Список должен появиться в Excel, а не в окне VBA.

Кто-нибудь знает, как это сделать?

Извините, я не могу опубликовать изображения.

+0

Возможный дубликат [Выбор списка аргументов функции VBA] (http://stackoverflow.com/questions/5340002/vba-function-argument-list-select) –

+0

Взгляните на ссылку; похоже, имеет то, что вы ищете. –

+0

Это близко к тому, что я ищу, но список должен быть в Excel, а не в окне VBA. Если у вас есть Excel, откройте его и введите «= CELL (», то вы увидите список. Я читал этот пост несколько минут назад. – dsegovia

ответ

0

Вот неуклюжий подход, который может сработать. Идея состоит в том, чтобы использовать событие 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. Вы увидите следующее (после нажатия на стрелку раскрывающегося списка):

enter image description here

Затем, после выбора, например, «45 градусов» формула в A1 становится

=sine(45, "Degrees") 

и отображается значение (0,707107), и проверка данных была удалена.

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

+0

Это - есть - замечательно! – dsegovia

Смежные вопросы