2012-06-08 3 views
0

Все, Я не сталкивался с чем-то таким же расстраивающим, как это было раньше. Ваша помощь в отношении этой ЧРЕЗВЫЧАЙНОЙ проблемы была бы оценена. Похоже, что проблема очень проста, но я слишком много в нее вкладываю, что мои глаза не могут поймать глупую ошибку.Неправильное вычисление внутри петли

(Образец кода вставлен ниже - я использовал упрощенную версию). У меня просто есть двухстоечный массив X, и я заполняю значения в этом массиве с помощью простого цикла. Все параметры s, t, N являются постоянными, и я извлекаю их из других ячеек в листе, поэтому вы можете просто игнорировать их.

Проблема В второй петли, где я заполнить элементы массива X. Я заполнить во второй колонке с линейно возрастающих значений (0,01, 0,02, 0,03, ...., 30), и первый столбец должен быть некоторой функцией этих значений во втором столбце и константами N, s, t. Звучит просто!

Вопрос значения в первой колонке выходят неправильно по какой-либо причине !! Я проверил его как в Excel, так и в Matlab. Например, я принял значения констант N, s, t и I, подключенных к 0.01, и вычислил первое значение столбца как в Excel, так и в Matlab, оба они дали одинаковый правильный результат (-0.1113). Когда я запускаю код VBA, он дает другое значение (0.36 - я уверен, что на 500% правильный ответ -0.1113). ЕЩЕ НЕЧЕТНЫЕ, я вставил BREAK POINT в Следующая J заявление, а при = 1, я проверил все значения всех констант, все правильно, но Х (к, 1) все равно 0,36. Что меня смущает, так это то, что когда я вставляю ту же формулу, которую я использую в своем коде для X (j, 1), и вставляю ее в окно Immediate Window, оно дает правильное значение (-0.113). . ОЧЕНЬ ОЧЕНЬ ОЧЕНЬ ФОРМУЛА .. ZERO CHANGES !!!!

Есть ли какая-нибудь интуитивная причина, что может вызвать эту проблему? Я проверил свой код 1 миллион раз, чтобы убедиться, что в именах параметров нет дубликатов, или некоторые параметры taht не получают сброс. Ничего!

* 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 
+0

Мне не хватает ключа VB, но я уверен, что это: = "= ln (AB" & i & ")" не анализируется, вы надеялись. – starbolin

+2

'Step' - это ключевое слово VBA, но вы также используете его как имя переменной. Выполнение этого требует неприятностей. –

ответ

0

Функция

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

возвратит сумму для указанного диапазона в активном листе. Попробуйте настроить активный лист (или указать его в выражении), чтобы убедиться, что вы ссылаетесь на правильный лист.

Смежные вопросы