2017-07-22 5 views
0

私はMathcad計算をExcelスプレッドシートに変換しようとしています。私はkwという変数を見つけようとしています。私はラインで型の不一致エラーを取得しています:私はこのエラーを取得していますなぜ

 INTEG = INTEG + ... 

誰かが知っているだろうか?私はすでにそれに多くの時間を費やしましたが、理由を見つけることができませんでした。この作品は私にとって本当に重要であるとして、私はそれを事前にどんな手助け/提案を感謝したいと思います。#反復ループ内のタイプミスマッチエラーと積分内部の二分化

Option Explicit 
Dim wp As Double, alpha As Double, w As Double, gama As Double, d As Double 
Dim kw As Double, n As Integer, sExp As String, g As Double 

'Calculating kw 
Sub CalculateKw() 
Dim l As Integer 
alpha = ThisWorkbook.Sheets("Current-Wave Calculation").Range("H49").Value 
gama = ThisWorkbook.Sheets("Current-Wave Calculation").Range("H34").Value 
d = ThisWorkbook.Sheets("Environmental Data Input").Range("H4").Value 
wp = ThisWorkbook.Sheets("Current-Wave Calculation").Range("H47").Value 
kw = 100 
For l = 1 To 99 
    If Err.Number = 0 Then 
     kw = INTEG(0, kw, 5000) 
    Else 
     kw = kw - 1 
    End If 
Next l 
ThisWorkbook.Sheets("Sheet1").Range("B1").Value = kw 
End Sub 

'DEFINITE INTEGRAL from 0 to kw*wp to solve JONSWAP Equation 
Function INTEG(n, kw, lBit As Long) 
Dim SpectralWidthParameter As Double, dMin As Double, dMax As Double 
Dim dW As Double, lW As Long, AAA As String 
g = 9.80665 
alpha = ThisWorkbook.Sheets("Current-Wave Calculation").Range("H49").Value 
gama = ThisWorkbook.Sheets("Current-Wave Calculation").Range("H34").Value 
d = ThisWorkbook.Sheets("Environmental Data Input").Range("H4").Value 
wp = ThisWorkbook.Sheets("Current-Wave Calculation").Range("H47").Value 
dMin = 0 
dMax = kw * wp 
If w <= wp Then 
    SpectralWidthParameter = 0.07 
Else 
    SpectralWidthParameter = 0.09 
End If 
sExp = "(w^n) * (((w/_ 
(Application.WorksheetFunction.Sinh(WaveNumber(0,20,w,d) * d)))^2)* 
(alpha * (g^2) * (w^(-5)) * (EXP((-5/4) * ((w/wp)^(-4)))) * 
(gama^(EXP(-0.5 * (((w - wp)/(SpectralWidthParameter * wp))^2))))))" 
sExp = Replace(sExp, "EXP", "AAA") 
dW = (dMax - dMin)/lBit 
For lW = 1 To lBit 
    *INTEG = INTEG + Evaluate(Replace(Replace(sExp, "w", dMin), "AAA", _ 
    "EXP")) * dW + 0.5 * dW * Abs(Evaluate(Replace(Replace(sExp, "w", dMin _ 
    +dW), "AAA", "EXP")) - Evaluate(Replace(Replace(sExp, "w", dMin), _ 
    "AAA", "EXP")))* 
    dMin = dMin + dW 
    Next lW 
End Function 

'BISECTION METHOD TO CALCULATE Wave number k 
Function WaveNumber(a, b, w, d) 
Dim klow As Double, khigh As Double, kmid As Double, i As Integer 
Dim a As Integer, b As Integer 
klow = a 
khigh = b 
kmid = (klow + khigh)/2 
For i = 1 To 100 
    If SolveFunction(klow, w, d) * SolveFunction(kmid, w, d) < 0 Then 
     khigh = kmid 
     kmid = (klow + khigh)/2 
    Else 
     klow = kmid 
     kmid = (klow + khigh)/2 
    End If 
Next i 
WaveNumber = kmid 
End Function 

'HELPER FUNCTION(Wave Dispersion Equation)FOR BISECTION METHOD 
Function SolveFunction(k, w, d) 
SolveFunction = k * Application.WorksheetFunction.Tanh(k * d) - (w^2) _ 
/9.80665 
End Function 

答えて

1
INTEG = INTEG + Evaluate(....) 

「型の不一致」あなたEvaluate式が返したため、エラー。エラーバリアントに数値を追加すると、そのランタイムエラーが生成されます。

評価された式にはApplication.WorksheetFunction.Sinh(...)を挿入しないでくださいが、ちょうどSinh(...)を挿入しないでください。

また、私はEvaluateを使わずにコードを書き直すことができると思います。コードを簡単にデバッグできるようになります。

+0

A.S.Hの回答ありがとう、私はApplication.WorksheetFunctionを削除し、Sinh(...)のみ推奨として使用しました。まだ動作していません。 – Niraj

+0

もちろん、他にも問題があります。私はそれらをすべてリストすることはできません!例えば ​​'Replace(sExp、" w "、dMin)'を考えてみましょう。これは 'wp'の' w'にも置き換わるでしょう...だから私はそれを短くして 'Evaluate'を落としてVBAで直接計算するようアドバイスしましたデバッグを簡単にする。あなたは間違った道をたどっている、と私は思う。 –

関連する問題