0

全体として、これほどイライラするものに遭遇したことはありません。この 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
4

1 に答える 1

0

関数

WorksheetFunction.Sum(Range("AC1:AC" & N))

アクティブ シートの指定範囲の合計を返します。アクティブなシートを設定 (または式で指定) して、正しいシートを参照していることを確認してください。

于 2012-08-17T22:32:27.797 に答える