【问题标题】:VBA Custom Excel Function with dropdown list带有下拉列表的 VBA 自定义 Excel 函数
【发布时间】:2015-08-21 20:03:51
【问题描述】:

我在 Excel (VBA) 中有我的自定义函数,但我正在尝试在 CELL 函数中执行类似该列表的操作:

在 Excel 中试用:

=CELL(info_type [然后这里出现下拉列表]

所以,我想要:

=MyFunction(my_variable [和我的自定义下拉列表]

列表应该出现在 Excel 中,而不是 VBA 窗口中。

有人知道怎么做吗?

抱歉,我无法发布图片。

【问题讨论】:

  • 看看那里的链接;似乎有你要找的东西。
  • 这与我正在寻找的内容非常接近,但该列表应该在 Excel 中,而不是在 VBA 窗口中。如果您有 Excel,请打开它并输入“=CELL(”,然后您将看到列表。我刚才正在阅读那篇文章。
  • 看来不幸的答案是不,没有一种方法可以在 Excel 中将下拉菜单作为 UDF 进行。但是,我只花了谷歌搜索其他答案所需的时间,所以我承认我对此一无所知。
  • 好吧,我会继续努力的。谢谢。 =)

标签: excel vba list function


【解决方案1】:

这是一种可能可行的笨拙方法。这个想法是使用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 并回车。您将看到以下内容(单击下拉箭头后):

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

=sine(45, "Degrees")

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

一种可能更灵活的想法变体是按单元格显示用户表单,而不是依赖于这种数据验证技巧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    相关资源
    最近更新 更多