这是一种可能可行的笨拙方法。这个想法是使用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),并且已删除数据验证。
一种可能更灵活的想法变体是按单元格显示用户表单,而不是依赖于这种数据验证技巧。