2015-08-21 70 views
1

我有我的自定义函数在Excel(VBA),但我试图做类似的细胞功能内的列表:VBA定制Excel函数与下拉列表

尝试在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 image description here

然后,例如选择后“45度”,在A1中的公式变为

=sine(45, "Degrees") 

并显示值(0.707107),和数据验证已被删除。

的想法,可能是更灵活的变化是由单元格中显示一个窗体,而不是依赖此数据验证破解。

+0

它 - 是 - 太棒了! – dsegovia