全体として、これほどイライラするものに遭遇したことはありません。この EXTREMELY NAIVE 問題に関するご協力をお願いいたします。問題はとても単純なように見えますが、私はそれに夢中になりすぎて、私の目はばかげた間違いを見つけることができません.
(サンプル コードを以下に貼り付けます。簡易版を使用しました)。単純に 2 列の配列 X があり、単純なループを使用してこの配列に値を入力します。すべてのパラメーター s、t、N は一定で、シート内の他のセルから取得するので、無視してかまいません。
問題は、配列 X の要素を入力 する2 番目のループで、2 番目の列に直線的に増加する値 (0.01, 0.02, 0.03, ...., 30) を入力し、最初の列はこれらの関数である必要があります。 2 番目の列の値と定数 N、s、t。シンプルですね!
問題は、何らかの理由で最初の列の値が間違っていることです!! ExcelとMatlabの両方で確認しました。たとえば、定数 N、s、t の値を取得し、0.01 をプラグインして、Excel と Matlab の両方で最初の列の値を計算すると、両方とも同じ正しい結果 (-0.1113) が得られました。VBA コードを実行すると、別の値が返されます (0.36 - -0.1113 が正解であることは 500% 確信しています)。 EVEN MORE ODDでは、Next jステートメントにBREAK POINTを挿入し、j = 1 の場合、すべての定数のすべての値を検証しましたが、すべて正しいのですが、X(j,1) はまだ 0.36 です。私を夢中にさせているのは、X(j,1)のコードで使用しているのとまったく同じ式を貼り付け、それをImmediate Window、それは正しい値 (-0.113) を与えます..非常に同じ式..ゼロ変更!!!!
この問題を引き起こす可能性のある直感的な理由はありますか? コードを 100 万回チェックして、パラメーター名に重複がないこと、または一部のパラメーターがリセットされないことを確認しました。何もない!
* ANY *入力をいただければ幸いです。どうもありがとうございました。
Sub Misc()
Dim N As Integer
Dim s As Integer
Dim t As Integer
Dim j As Integer
Dim i As Integer
Const Step As Double = 0.01
Const B As Integer = 30
Dim X() As Double
N = Range("AB1").End(xlDown).Row
s = WorksheetFunction.RoundDown(Sheets("Replacement").Range("AB1"), -1) ' Compute S (Smallest meter reading, rounded down to nearest 10)
t = WorksheetFunction.RoundUp(Sheets("Replacement").Range("AB" & N), -1) ' Compute T (Largest meter reading, rounded upto nearest 10)
Sheets("Replacement").Range("AD1").Value = s ' Export S and T to Sheet "Replacement" for subsequent use in Goal Seek
Sheets("Replacement").Range("AE1").Value = t
For i = 1 To N Step 1
Sheets("Replacement").Range("AC" & i).Formula = "=ln(AB" & i & ")" ' Logarithm of the meter readings
Next i
ReDim X(1 To (B / Step), 1 To 2) As Double ' Second column has values of Beta, First column has F(Beta), where F() is given by Beta MLE
For j = 1 To (B / Step)
X(j, 2) = j * Step
X(j, 1) = (X(j, 2) * (((N / ((t ^ X(j, 2)) - (s ^ X(j, 2)))) * ((t ^ X(j, 2) * (WorksheetFunction.Ln(t))) - (s ^ X(j, 2) * (WorksheetFunction.Ln(s))))) - (WorksheetFunction.Sum(Range("AC1:AC" & N))))) - N
Next j
Range("A1").Resize(Ubound(X,1),Ubound(X,2)).Value = X
End Sub