总而言之,我还没有遇到过像以前那样令人沮丧的事情。非常感谢您对这个 EXTREMELY NAIVE 问题的帮助。看起来问题很简单,但是我太投入了,以至于我的眼睛无法捕捉到愚蠢的错误。
(示例代码粘贴在下面 - 我使用了简化版本)。我只是有一个两列数组 X,我使用一个简单的循环填充这个数组中的值。所有参数 s、t、N 都是常数,我从工作表中的其他单元格中检索它们,因此您可以忽略它们。
问题 在第二个循环中,我填充数组 X 的元素。我用线性增加的值 (0.01, 0.02, 0.03, ...., 30) 填充第二列,第一列应该是这些函数第二列中的值和常数 N、s、t。听起来很简单!
问题是第一列中的值由于某种原因出现错误!!我在 Excel 和 Matlab 中都验证了它。例如,我取常数 N、s、t 的值,并插入 0.01 并在 Excel 和 Matlab 中计算第一列的值,它们都给出了相同的正确结果(-0.1113)。当我运行 VBA 代码时,它给出了不同的值(0.36 - 我 500% 确定 -0.1113 是正确答案)。 更奇怪的是,我在Next j语句中插入了一个BREAK POINT,对于 j = 1,我验证了所有常量的所有值,都正确,但 X(j,1) 仍然是 0.36。让我抓狂的是,当我粘贴我在 X(j,1) 的代码中使用的相同公式并将其粘贴到立即窗口,它给出了正确的值(-0.113)..非常相同的公式.. 零变化!!!!
是否有任何直观的原因可能导致此问题?我检查了我的代码 100 万次,以确保参数名称没有重复,或者某些参数不会被重置。没有什么!
*任何 *输入将不胜感激。非常感谢你,我很抱歉这是一个愚蠢的问题。
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