Excel VBA中如何支持复数计算?

来源:互联网 发布:ps制作淘宝店铺招牌 编辑:程序博客网 时间:2024/05/16 01:24

答案居然是需要自己定义复数计算。

内置built-in的WorkSheetFunction还是VBA函数都不支持复数类型。

转一个

Option ExplicitConst pi = 3.14159265358979Type Complex  re As Double  im As DoubleEnd TypePublic Function AddComplex(a As Complex, b As Complex) As Complex  AddComplex.re = a.re + b.re  AddComplex.im = a.im + b.imEnd FunctionPublic Function MultiplyComplex(a As Complex, b As Complex) As Complex  MultiplyComplex.re = a.re * b.re - a.im * b.im  MultiplyComplex.im = a.re * b.im + a.im * b.reEnd FunctionPublic Function Conjugate(a As Complex) As Complex  Conjugate.re = a.re  Conjugate.im = -a.imEnd FunctionPublic Function Modulo(a As Complex) As Double  Modulo = Sqr(a.re ^ 2 + a.im ^ 2)End FunctionPublic Function Argument(a As Complex) As Double  Dim i As Integer  Dim v(1 To 4) As Double  If (z.re = 0) And (z.im = 0) Then    Argument = -10    'End Function  End Ifv(1) = ArcSin(z.im / Modulo(z))v(2) = mcPI - v(1)v(3) = ArcCos(z.re / Modulo(z))v(4) = -1 * v(3)For i = 1 To 4While v(i) > mcPIv(i) = v(i) - 2 * mcPIWendWhile v(i) < mcPIv(i) = v(i) + 2 * mcPIWendNext iIf v(1) = v(3) Then Argument = v(1)If v(2) = v(3) Then Argument = v(2)If v(1) = v(4) Then Argument = v(1)If v(2) = v(4) Then Argument = v(2)End Function' Code by : Steven Roland Bazinet (ArcSin function only)Private Function ArcSin(vntSine As Variant) As DoubleOn Error GoTo ERROR_ArcSineConst cOVERFLOW = 6Dim blnEditPassed As BooleanDim dblTemp As DoubleblnEditPassed = FalseIf IsNumeric(vntSine) ThenIf vntSine >= -1 And vntSine <= 1 ThenblnEditPassed = TruedblTemp = Sqr(-vntSine * vntSine + 1)If dblTemp = 0 ThenArcSin = Sgn(vntSine) * pi / 2ElseArcSin = Atn(vntSine / dblTemp)End IfEnd IfEnd IfEXIT__ArcSine:If Not blnEditPassed Then Err.Raise cOVERFLOWExit FunctionERROR_ArcSine:On Error GoTo 0blnEditPassed = FalseResume EXIT__ArcSineEnd Function' Code by : PaperCut, based (very much!) on Steven R Bazinet's codePrivate Function ArcCos(vntcos As Variant) As DoubleOn Error GoTo ERROR_ArcSineConst cOVERFLOW = 6Dim blnEditPassed As BooleanDim dblTemp As DoubleblnEditPassed = FalseIf IsNumeric(vntcos) ThenIf vntcos >= -1 And vntcos <= 1 ThenblnEditPassed = TruedblTemp = Sqr(-vntcos * vntcos + 1)If dblTemp = 0 ThenArcCos = Sgn(vntcos) * pi / 2ElseArcCos = Atn(dblTemp / vntcos)End IfEnd IfEnd IfEXIT__ArcCos:If Not blnEditPassed Then Err.Raise cOVERFLOWExit FunctionERROR_ArcCos:On Error GoTo 0blnEditPassed = FalseResume EXIT__ArcSineEnd Function 
0 0