我觉得这是function Evaluate
问题。
我尝试解决这一点,并已设法使:
看看这个测试功能:
Function EvaluateTest(str As String)
EvaluateTest = Evaluate(str)
EvaluateTest = CStr(EvaluateTest)
End Function
debug.Print EvaluateTest("0^(-0.05)")
显示Error 2007
我觉得这是除以零 - >0^(-0.05) for VBA is 0/(0^0.05)
我们可以捕获这个错误,并为那种情况下接受结果= 0
我创建函数使用捕获这1个错误并修改了一下你的功能。试试这个代码:
Function EvaluateCheck(Exp As String)
Dim EvalCheck As Variant
EvalCheck = Evaluate(Exp)
If VarType(EvalCheck) = vbError Then 'evaluate function error
Select Case CInt(EvalCheck)
Case 2007 ' 0/x
'Debug.Print "Evaluate(" & Exp & ") error= " & CStr(EvalCheck); ""
EvaluateCheck = 0
'Case 2015 ' other problems with evaluate (power)
'Debug.Print "Evaluate(" & Exp & ") error= " & CStr(EvalCheck); ""
'try use power function not evaluate
'FindTmp = WorksheetFunction.Find("^", Exp)
'If FindTmp > 0 Then
'number_ = CDbl(Mid(Exp, 1, FindTmp - 1))
'Power_ = Mid(Exp, FindTmp + 1, Len(Exp))
'Power_ = Replace(Power_, ".", ",") '<- i have problems with CDbl function i must replace . to , maybe you dont need this line
'Power_ = Replace(Replace(Power_, "(", vbNullString), ")", vbNullString) ' we dont need parentheses
'PowerDbl = CDbl(Power_)
'EvaluateCheck = WorksheetFunction.power(number_, PowerDbl)
'Else
'Debug.Print "Evaluate(" & Exp & ") error= " & CStr(EvalCheck); " i cant handle that case"
'End If
Case Else
Debug.Print "Evaluate(" & Exp & ") error= " & CStr(EvalCheck); " i cant handle that case"
End Select
Else ' evaluate no error
EvaluateCheck = EvalCheck
End If
End Function
您的功能:
Function Integral(sExp As String, dMin As Double, dMax As Double, lBit As Long)
Dim dU As Double
Dim lU As Long
Dim eval As Long
Dim EvaluateVal1 As Double 'Evaluate(Replace(sExp, "u", dMin))
Dim EvaluateVal2 As Double 'Evaluate(Replace(sExp, "u", dMin + dU))
Dim sExpTmp As String
dU = (dMax - dMin)/lBit
For lU = 1 To lBit
'check evaluate
sExpTmp = Replace(sExp, "u", dMin)
EvaluateVal1 = EvaluateCheck(sExpTmp)
sExpTmp = Replace(sExp, "u", dMin + dU)
EvaluateVal2 = EvaluateCheck(sExpTmp)
IntegralTemp = IntegralTemp + EvaluateVal1 * dU + 0.5 * dU * Abs(EvaluateVal1 - EvaluateVal2)
dMin = dMin + dU
Next lU
Integral = IntegralTemp
End Function
的一些结果:
debug.print Integral("u^(-0.05)", 0, 1, 500)
1,05186339856455
debug.print Integral("u^(-0.05)", 0.05, 1, 500)
0,991802803730478
debug.print Integral("u^(-0.05)", 0.05, 1.05, 500)
1,0417624389399
请提供您尝试计算积分。并请提供您如何调用您的功能。例如:'i =积分(“u^-2”,2,4,7)'。你期望结果如何?结果如何与您的期望不同? –
=积分(“u ^( - 0.05)”,0,1,500)。结果是#VALUE。 – Harold
你不能评价'0^-n',因为这被零除。但在我看来,积分(x^-0.05)dx = x ^( - 0.05 + 1)/( - 0.05 + 1)+ C = x^0.95/0.95 + C = 100/95 * x^0.95 + 。这个积分的下限为0,上限为1 ='100/95 * 1^0.95 - 100/95 * 0^0.95≈1,052631579'。 –