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

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

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

转一个

Option Explicit
Const pi = 3.14159265358979

Type Complex
  re As Double
  im As Double
End Type

Public Function AddComplex(a As Complex, b As Complex) As Complex
  AddComplex.re = a.re + b.re
  AddComplex.im = a.im + b.im
End Function

Public 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.re
End Function

Public Function Conjugate(a As Complex) As Complex
  Conjugate.re = a.re
  Conjugate.im = -a.im
End Function

Public Function Modulo(a As Complex) As Double
  Modulo = Sqr(a.re ^ 2 + a.im ^ 2)
End Function

Public 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 If

v(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 4

While v(i) > mcPI
v(i) = v(i) - 2 * mcPI
Wend

While v(i) < mcPI
v(i) = v(i) + 2 * mcPI
Wend

Next i

If 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 Double
On Error GoTo ERROR_ArcSine

Const cOVERFLOW = 6

Dim blnEditPassed As Boolean
Dim dblTemp As Double

blnEditPassed = False
If IsNumeric(vntSine) Then
If vntSine >= -1 And vntSine <= 1 Then
blnEditPassed = True

dblTemp = Sqr(-vntSine * vntSine + 1)
If dblTemp = 0 Then
ArcSin = Sgn(vntSine) * pi / 2
Else
ArcSin = Atn(vntSine / dblTemp)
End If
End If
End If

EXIT__ArcSine:
If Not blnEditPassed Then Err.Raise cOVERFLOW
Exit Function

ERROR_ArcSine:
On Error GoTo 0
blnEditPassed = False
Resume EXIT__ArcSine

End Function

' Code by : PaperCut, based (very much!) on Steven R Bazinet's code

Private Function ArcCos(vntcos As Variant) As Double
On Error GoTo ERROR_ArcSine

Const cOVERFLOW = 6

Dim blnEditPassed As Boolean
Dim dblTemp As Double

blnEditPassed = False
If IsNumeric(vntcos) Then
If vntcos >= -1 And vntcos <= 1 Then
blnEditPassed = True

dblTemp = Sqr(-vntcos * vntcos + 1)
If dblTemp = 0 Then
ArcCos = Sgn(vntcos) * pi / 2
Else
ArcCos = Atn(dblTemp / vntcos)
End If
End If
End If

EXIT__ArcCos:
If Not blnEditPassed Then Err.Raise cOVERFLOW
Exit Function

ERROR_ArcCos:
On Error GoTo 0
blnEditPassed = False
Resume EXIT__ArcSine

End Function 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值