Для научной деятельности возникла необходимость написать макрос. Вспомнил университетские годы и написал, но он не считает необходимые данные. Точнее ничего не запускает. Хотя должен! Так что, уважаемые форумчане, прошу помочь найти ошибку. Код корявый до ужаса, сам понимаю, что-то не знал вообще как определить, поэтому вводил жуткие костыли, но пусть даже корявый - должен работать. Excel 2007. По большому счету мне нужно только последнее значение (sum) которое должно записываться в 4 столбец, остальные вычисления могут быть скрыты.
Скрытый текст
Код
'Программа предназначена для расчета суммы логарифмов для большого массива данных которые размещаются во втором столбце
'около 4000 значений
'Изначально задается цикл который перебирает первые сто значений
'Каждое значение цикла вычитается из предыдущего и записываются для дальнейших вычислений
'Так же выписывается знак изменений (произошел рост значения или наобород упадок)
'После этого выбирается самая большая разность и делится на 100, в итоге получаем 100 ячеек (например 1000 поделить на 100
'получим 100 ячеек от 0 до 10, от 10 до 20, от 20 до 30 и т.д.
'Каждая разность в зависимости от размера будет попадать в одну из полученных в процессе деления ячеек
'Выписываем количество попавших в каждую ячейку разностей с учетом знака изменений (рост и упадок это
'две различных разности)
'Считаем логарифм от (полученного количества попаданий/100)*(количество разностей
'с положительным или отрицательным значением/100)
'считаем сумму логарифмов и выписываем получившееся значение в ячейку
Sub Макрос1()
Dim t, i, j, q, r, shag, minus, plus, p, byk, znak, medved, proh As Integer
Dim raznica, znach1, znach2, znach, sum As Double
shag = 100
raznica = 0
znach1 = 0
znach2 = 0
p = 1
prohod = 0
byk = 0
medved = 0
proh = 0
Do While p = 0 'делать пока не дойдем до пустого значения
For i = 1 To shag 'этот цикл для того чтобы определить насколько было изменение значений и куда они двигались
znach1 = Sheets("L3").Cells(1 + i + proh, 2) 'значение первое
znach2 = Sheets("L3").Cells(2 + i + proh, 2) 'значение второе
raznica = znach1 - znach2 'разница между первым и вторым значениями
If raznica >= 0 Then znak = 0 Else znak = 1 'это значение запоминается чтобы определить знак (бык или медведь)
If raznica >= 0 Then byk = byk + 1 Else medved = medved + 1 'эти значения определяют количество бычьих и медвежьх свечей
raznica = Abs(raznica) 'Модуль разницы
Sheets("L3").Cells(i, 30) = raznica 'выписываю разницу для дальнейшей работы
Sheets("L3").Cells(i, 31) = znak 'выписываю знак разницы
Next i
t = Sheets("L3").Cells(1, 30) 'это значение и дальнейший цикл для определения наибольшего значения (разницы)
minus = 0
plus = 0
For i = 1 To shag
If Sheets("L3").Cells(i + 1, 30) > t Then t = Cells(i + 1, 30)
If Sheets("L3").Cells(i, 31) = 1 Then minus = minus + 1 Else plus = plus + 1
Next i
q = t / shag 'делим наибольшее значение на количество шагов
proh = proh + 1 'это для первого цикла, чтобы понять какой по счету набор проходит цикл
For i = 1 To shag 'если p=0 значит цикл закончится, это цикл, чтобы прекратить счет если в следующем наборе шагов закончатся значения
znach = Sheets("L3").Cells(1 + i + proh + shag, 2)
If znach = "" Then p = 0
Next i
For i = 1 To shag 'цикл для определения в какую ячейку попадают разность
r = 0
For j = 1 To shag
If Sheets("L3").Cells(i, 30) <= q * j Then r = j
Next j
Sheets("L3").Cells(i, 32) = r 'выписываем в какую ячейку попала разность
Next i
sum = 0
For i = 1 To shag 'цикл для определения количества разностей попавших в одни и те же ячейки
r = 0
t = 0
For j = 1 To shag
If Sheets("L3").Cells(j, 32) = i And Sheets("L3").Cells(j, 31) = 1 Then r = r + 1
If Sheets("L3").Cells(j, 32) = i And Sheets("L3").Cells(j, 31) = 0 Then t = t + 1
Next j
If r > 0 Then sum = sum + ((r * minus) / (2 * shag)) * Log((r * minus) / (2 * shag)) / Log(2) Else sum = sum
If t > 0 Then sum = sum + ((t * plus) / (2 * shag)) * Log((t * plus) / (2 * shag)) / Log(2) Else sum = sum
Next i
Sheets("L3").Cells(proh + 1, 4) = sum
Loop
End Sub
По большому счету мне нужно только последнее значение.
Если будете смотреть файл, то не обращайте внимание на цветные столбцы и кнопку, они остались от старого кода.
Файл-ПРИМЕР должен быть простым и понятным, без лишних кнопок/рюшек/данных, чтобы помогающие тратили меньше времени. Неужели для иллюстрации вопроса необходим 61 кБ заархивированных данных?