函数名称由VBA中的变量定义

时间:2013-09-23 01:55:48

标签: excel function vba excel-vba

这里有新的VBA用户,工程师 - 不是程序员。感谢您的耐心等待。花了好几个小时在帮助和在线试图找到这个答案。找到了一些答案,但他们是为PHP。与MS Office Home and Student 2007合作。

我有一个包含8个方程的列表。我让用户输入他们想要评估的等式的编号,我将该编号称为 index 。有没有办法在定义时将索引放入函数名中? 如:

Function PlotFun[index]= some f(x)

或者是否可以使用子程序中的索引重新定义函数? 如:

If index=1 then PlotFun=PlotFun[index] 'so PlotFun would equal PlotFun1

我想我在帮助中读到函数必须在函数例程中定义,所以这可能是不可行的。

或者是否可以从excel中的单元格中读取函数?我尝试使用

Function PlotFun=Worksheets(1).Range("BC6")

其中BC6包含“24 - 50 * x + 35 * x ^ 2 - 10 * x ^ 3 + x * 4”,它是x函数的正确语法,因为它是从我的PlotFun1例程复制的。但我没有正确的语法。我得到编译错误:预期:语句结束,正好在等号。

我也被引用了lamda函数,但是再一次,我得到了Expected:End of Statement错误。

Sub Bisection()
Dim index
Call FuncIndex  'sets the index number for which equation to use for analysis
        If index = 1 Then
            Dim PlotFun=Function(x) x ^ 3 - 6 * x ^ 2 + 11 * x - 6
        If index = 2 Then
            Dim PlotFun=Function(x) 24 - 50 * x + 35 * x ^ 2 - 10 * x ^ 3 + x * 4
Do 'my calculations using PlotFun
Loop 'for specified error or iterations
End Sub

我需要在许多子程序中的几个地方使用 PlotFun PlotFun1 。我不想为每个f(x)编写/复制代码。也许还有比我想象的更好的方法吗?我不能使用数组,因为方程式不是所有多项式。

谢谢!

3 个答案:

答案 0 :(得分:1)

听起来您想要改变使用的算法,或者在您的情况下,基于您将传递给单个函数的参数调用哪个等式。这个问题可以通过使用一种众所周知的称为“strategy pattern”的软件模式来解决。此模式允许您在保持其实现相同的同时改变算法。

您可以将策略模式与factory pattern结合使用,以实现您所寻求的理想架构。

这是strategy pattern的一个相当清晰的vba实现。

希望这有帮助。

答案 1 :(得分:1)

  

有没有办法将索引放入函数名称中   界定?如:

不是真的在线。您可以使用选择案例开关或一系列if / else语句。我通常更喜欢选择案例方法。

注意此代码未指定x的任何值,因此它将被解释为Empty或零值,除非您更改代码或提供表示用户输入变量x值。

Sub WhichFunction()

Dim i as Long
Dim functionResult as Double
i = Application.InputBox "Please enter the function's index #"
Select Case i
    Case 1
        functionResult = x ^ 3 - 6 * x ^ 2 + 11 * x - 6
    Case 2
        functionResult = - 50 * x + 35 * x ^ 2 - 10 * x ^ 3 + x * 4
    Case 3
        'etc.
    Case 4

    Case 5

    Case 6

    Case 7

    Case 8

    Case else
        MsgBox "invalid function index!"
End Select
    MsgBox functionResult
End Sub

关于您的代码:

  

我收到了预期:声明结束错误

可能是因为你的Dim陈述没有在他们应该的地方结束。在VBA中,通常无法声明并同时分配变量。有例外和视觉快捷方式,但这里没有必要讨论。

  

或者是否可以从excel中的单元格中读取函数?我试过了   使用Function PlotFun=Worksheets(1).Range("BC6")

是的,函数可以从特定单元格读取,但不是您实现它的方式。你需要回到基础并学习如何创建一个函数,例如:

Function MyFunctionName(arg1 as integer, arg2 as integer)
    'Code the evaluates some methods on the arguments provided
    Dim myVal as Double
    myVal = arg1 ^ arg2
    MyFunction = myVal 'Return the calculated value
End Function

同样你可以这样做:

Function GetValueFromSheet(byVal cl as Range)
'This function will ALWAYS return the value in B6
    GetValueFromSheet = Range("B6").Value
End Function

答案 2 :(得分:1)

VBA是尝试这样做的最差语言。(实际上,它是尝试做大部分事情的最糟糕的语言。)

不幸的是,VBA函数不是值或对象,它们不能存储在变量中。因此,这些都不是合法的:

Function PlotFun[index]= some f(x)

Function PlotFun=Worksheets(1).Range("BC6")

Dim PlotFun=Function(x) x ^ 3 - 6 * x ^ 2 + 11 * x - 6

由于您不需要太多功能,最简单的解决方案是:

Function PlotFun(index, x)
    Select Case index
    Case 1
        PlotFun = x ^ 3 - 6 * x ^ 2 + 11 * x - 6
    Case 2
        PlotFun = 24 - 50 * x + 35 * x ^ 2 - 10 * x ^ 3 + x * 4
    Case 3
        ' ... and so on
    End Select
End Function

即,将PlotFun声明为普通函数,并使用您的index变量来告诉它要评估的内部表达式。缺点是您必须在任何想要调用PlotFun的函数中包含函数index

请注意,这里的PlotFun = ...语法不分配函数本身,而是VBA从函数的特定调用设置返回值的方式。在函数中,PlotFun只是要分配的变量的名称。