Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 由VBA中的变量定义的函数名_Function_Vba_Excel - Fatal编程技术网

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

Function 由VBA中的变量定义的函数名,function,vba,excel,Function,Vba,Excel,这里是新的VBA用户,工程师不是程序员。谢谢你的耐心。我花了几个小时在帮助和在线上试图找到这个答案。找到了一些答案,但都是针对php的。与MS Office Home和Student 2007合作 我有一个8个方程式的列表。我让用户输入他们想要计算的方程的编号,我称之为编号索引。定义函数名时,有没有办法将索引放入函数名中? 例如: 或者可以使用子例程中的索引重新定义函数吗? 例如: 我想我在帮助中读到一个函数必须在函数例程中定义,所以这个函数可能不可行 或者可以从excel中的单元格中读取函数吗

这里是新的VBA用户,工程师不是程序员。谢谢你的耐心。我花了几个小时在帮助和在线上试图找到这个答案。找到了一些答案,但都是针对php的。与MS Office Home和Student 2007合作

我有一个8个方程式的列表。我让用户输入他们想要计算的方程的编号,我称之为编号索引。定义函数名时,有没有办法将索引放入函数名中? 例如:

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

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

或者可以从excel中的单元格中读取函数吗?我试着用

Function PlotFun=Worksheets(1).Range("BC6")
其中BC6包含“24-50*x+35*x^2-10*x^3+x*4”,这是x函数的正确语法,因为它是从我的PlotFun1例程复制的。但是我没有正确的语法。我得到编译错误:应为:语句末尾,正好在等号处

我还提到了lamda函数,但我再次得到了预期的:语句结束错误

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)编写/复制代码。也许有比我想的更好的方法?我不能使用数组,因为方程并不都是多项式


谢谢大家!

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

您可以将策略模式与应用程序相结合,以实现所需的体系结构

下面是一个相当清晰的vba实现

希望这有帮助

有没有一种方法可以将索引放入函数名中 定义例如:

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

注意此代码没有为
x
指定任何值,因此它将被解释为
空的
或零值,除非您更改代码或为用户提供输入变量
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=工作表(1)。范围(“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
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
只是要分配给的变量的名称。

您提供的任何代码都不能远程执行。我建议回到第一步,学习如何在VBA中编写(和调用)一个非常基本的函数,比如简单求和2个值或连接2个字符串参数的函数。事实上,很难说出你在问什么,也很难尝试帮助你,因为你对手头的任务还没有真正表现出最低限度的理解。一个比VBA更简单的解决方案是使用计算表推导所有方程的值,然后从8列中选择适当的结果。如果你有雄心壮志,你可以使用“定义名称”来评估不同的功能,我会坚持使用简单的公式route+1来更好地解释,并用我一半的单词来回答:)同样值得注意的是,通过将此作为一个普通函数,需要
索引
作为参数,这避免了使用恼人的
InputBox
输入法,除非这对应用程序很关键。
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