我需要在VBA中解决一个隐式方程

时间:2018-03-23 22:05:54

标签: vba excel-vba implicit equation-solving excel

我想提供函数中提到的其他参数,并获得(角度)的解决方案,但是我得到错误:“无效的过程调用或参数”运行时错误5。 我需要在excel工作表中调用该函数。这是一个很长的等式。此外,它可能是我进入一个无限循环,但我不知道如何避免这种情况。

 Function calculateangle(r, h, C, g, d, m, t, x, y As Single) As Single

 Dim a As Single
 a = 0

 While y <> (d + r - r * Cos(a) + (x - (t - r + r * Sin(a))) * Tan(a) - (g 
 / (2 * ((((C * m * (2 * g * (h - (d + r - r * Cos(a)))) ^
 (1 / 2)) + m * (2 * g * (h - (d + r - r * Cos(a)))) ^ (1 / 2)) / (m +
 0.04593)) ^ 2) * (Cos(a)) ^ 2)) * (x - (t - r + r * Sin(a))) ^ 2)

     a = a + 0.01
 Wend

 MsgBox Round(a, 2)

 End Function

2 个答案:

答案 0 :(得分:1)

一个显而易见的问题是您使用Function calculateangle(<...all the bits ...>) As Double Dim a As Double Dim tTolerance as Double dim f1 as Double ' sub sections to help untangle the spaghetti Dim f2 as Double Dim f3 as Double Dim fFinal as Double Dim tWithinTolerance as Boolean tWithinTolerance = false a = 0 tTolerance = 0.01 While not tWithinTolerance f1 = d + r - r * Cos(a) f2 = m*2*g*(h - f1) f3 = x - (t - r + r * Sin(a)) fFinal = (f1 + f3 * Tan(a) - (g / (2 * ((((C * f2) ^ (1 / 2)) + f2 ^ (1 / 2)) / (m + 0.04593)) ^ 2) * (Cos(a)) ^ 2)) * f3 ^ 2) tWithinTolerance = (Abs(y - fFinal) < tTolerance) a = a + 0.01 Wend Calculateangle = a ' note how this sets a return value for the function End Function 但未返回值。

这真是一块复杂的意大利面!但是,我建议使用下面的方法来帮助分离各种位,从而更容易进行调试

driver.findElement(By.id("lst-ib")).sendKeys("Googling");

我已将舍入(这是一个演示问题)留给调用此函数的代码 - 这样您就可以显示您想要的任何详细程度的答案!

(如果我在通过途中破坏了任何计算而道歉 - 但是你得到了这个概念!)

答案 1 :(得分:0)

对于作者和那些想要处理他的纸牌的人。我希望我不会在括号和简化中混淆任何内容。

Do

    vCosA = Cos(a)
    vCosADR = d + r * (1 - vCosA) ' d + r - r * vCosA '
    vCosMGHADR = m * (2 * g * (h - vCosADR))
    vSinAXTR = (x - (t - r * (1 - Sin(a)))) ' - r + r * Sin(a)

   '((C * vCosMGHADR) + vCosMGHADR) == ((C + 1) * vCosMGHADR)

    If (y = _
            (vCosADR + vSinAXTR * Tan(a) - _
                (g / _
                    (2 * _
                        ( _
                            ( _
                                ((C + 1) * vCosMGHADR) / _
                                (m + 0.04593) _
                            ) ^ 2 _
                        ) * (vCosA ^ 2) _
                    ) _
                ) * vSinAXTR ^ 2 _
            )) Then Exit Do          ' *** EXIT DO ***

    a = a + 0.01

Loop