2

这里是新的 VBA 用户,工程师而不是程序员。感谢您的耐心。确实花了几个小时在帮助和在线上试图找到这个答案。找到了一些答案,但它们是针对 php.ini 的。使用 MS Office 家庭和学生版 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

我需要在许多子例程中的几个地方使用PlotFunPlotFun1 。我不想为每个 f(x) 编写/复制代码。也许有比我想象的更好的方法来做到这一点?我不能使用数组,因为方程并不都是多项式。

谢谢!

4

3 回答 3

1

听起来您想改变使用的算法,或者在您的情况下,根据您将传递给单个函数的参数调用什么方程。这个问题可以通过使用被称为“策略模式”的众所周知的软件模式来解决。这种模式允许您改变算法,同时保持其实现相同。

您可以将策略模式与工厂模式结合起来,以实现您正在寻求的所需架构。

这是一个相当清晰的 vba策略模式实现。

希望这可以帮助。

于 2013-09-23T02:26:07.410 回答
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
于 2013-09-23T02:29:33.950 回答
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变量告诉它要评估的内部表达式。缺点是您必须在index要调用 PlotFun 的任何地方包含函数变量。

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

于 2013-09-23T02:40:46.470 回答