VBA - 将参数传递给循环中的函数

Boba_Fett

这是我正在使用的一些代码:

Function func(x As Double) As Double
func = (x * x) - 5
End Function

Private Sub CommandButton1_Click()

Dim a, b, dok, fa, fb, f0, x0 As Double

a = Val(TextBox1.Text)
b = Val(TextBox2.Text)
dok = Val(TextBox3.Text)

If Not IsNumeric(a) Or Not IsNumeric(b) Or Not IsNumeric(dok) Then
    MsgBox ("Incorrect data!")
    Else
        fa = func(Val(a))
        fb = func(Val(b))
        If (fa * fb) > 0 Then
            MsgBox ("Function does not meet requirements!")
        Else
            Do While Abs(Val(a) - Val(b)) > Val(dok)
            x0 = ((Val(a) + Val(b)) / 2)
            f0 = func(Val(x0))
            If Abs(Val(f0)) < Val(dok) Then
                MsgBox ("OK!")
                TextBox4.Text = x0
                Exit Do
            End If
            If (fa * f0) < 0 Then
                b = x0
                Else
                    a = x0
                    f0 = fa
            End If
            Loop
        End If
    End If

End Sub

输入数据为 a = 0 和 b = 10,dok = 2。

一切正常,直到在 Do-While 循环的第二步中,变量 x0 获得 2,5 值(这是正常的),并且该值被传递到此处的函数:

f0 = func(Val(x0))

函数 func 获取参数 2 而不是 2,5。为什么这样?我试图将 2,5 参数手动传递给函数并且它有效。我也尝试用类似的方式计算 2,5 并通过它,它也有效。

Dim test, test2 As Double
test = func(2.5)
MsgBox "Result: " & test
test2 = Abs((0 - 5) / 2)
MsgBox "ABS result: " & test2
test = func(test2)
MsgBox "Second result to: " & test
波巴乔布

看看您在问题中的表达2.5方式2,5,这听起来像是一个本地化问题。具体来说,从功能上的MDSN页面Val

Val 函数仅将句点 ( . ) 识别为有效的小数分隔符。当使用不同的十进制分隔符时,如在国际应用程序中,使用 CDbl 将字符串转换为数字。

幸运的是,在这段代码中,冒犯Val是不必要的:x0已经是一个 Double,所以没有必要调用Val它。因此我们可以将该行更改为

f0 = func(x0)

可能是下一行

If Abs(f0) < dok Then

它应该一切正常。

此外,为了使其对十进制输入安全,Val应从分配fa的行中删除fb,并CDbl应用于代替ValTextBox 输入。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章