0

总而言之,我还没有遇到过像以前那样令人沮丧的事情。非常感谢您对这个 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
4

1 回答 1

0

功能

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

将返回活动工作表中指定范围的总和。尝试设置活动工作表(或在表达式中指定)以确保引用正确的工作表。

于 2012-08-17T22:32:27.797 回答