Неправильные вычисления внутри цикла
Все, я не сталкивался с чем-то таким разочаровывающим, как это было раньше. Мы будем благодарны за вашу помощь в отношении этой Крайне наивной проблемы. Кажется, что проблема очень проста, но я слишком углубился в это, чтобы мои глаза не могли уловить глупую ошибку.
(Пример кода вставлен ниже - я использовал упрощенную версию). У меня просто есть массив из двух столбцов 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 - правильный ответ). ДАЖЕ БОЛЬШЕ НЕТ, я вставил ТОЧКУ ОТРЫВА в следующем операторе j, и для j = 1 я проверил все значения всех констант, все правильно, но X(j,1) все еще равно 0.36. Что сводит меня с ума, так это то, что когда я вставляю ту же самую формулу, которую я использую в своем коде для X(j,1), и вставляю ее в Immediate Window, она дает правильное значение (-0.113) .. ОЧЕНЬ ЖЕ ФОРМУЛА.. ИЗМЕНЕНИЯ НУЛЯ!!!!
Есть ли какая-то интуитивная причина, которая могла бы вызвать эту проблему? Я проверил свой код 1 миллион раз, чтобы убедиться, что в именах параметров нет дубликатов, или некоторые параметры не сбрасываются. Ничего такого!
* ЛЮБОЙ * вход будет высоко оценен. Большое спасибо, и мне жаль, что это такой тупой вопрос.
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
1 ответ
Функция
WorksheetFunction.Sum(Range("AC1:AC" & N))
вернет сумму для указанного диапазона в активном листе. Попробуйте установить активный лист (или указать его в выражении), чтобы убедиться, что вы ссылаетесь на правильный лист.