这里有新的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)编写/复制代码。也许还有比我想象的更好的方法吗?我不能使用数组,因为方程式不是所有多项式。
谢谢!
答案 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
只是要分配的变量的名称。