Нужна Ваша помощь. Как обратится с условием текущей стоки к

Программирование на Visual Basic for Applications
IVANru
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 13.06.2006 (Вт) 1:03

Нужна Ваша помощь. Как обратится с условием текущей стоки к

Сообщение IVANru » 13.06.2006 (Вт) 1:31

Нужна Ваша помощь.
DATE,OPEN,HIGH,LOW,CLOSE,Percent,Vol
Каждая строка один день (дата)

Строк 2000 штук

Вопрос

1. Как обратится с условием текущей стоки к предыдущей стоки, через цикл Do While Loop ?
2. Как Поставить счетчик обработанных строк - каждая строка цикла цифра 1 в ячейку Vol?
3. Как результат поместить в ячейку Percent ?

ПРИМЕР: (в скобках мой вопрос)

Do While
If HIGH(текущ строки)> HIGH (предыдущей строки) and LOW(текущ строки)> LOW (предыдущей строки)Then (HIGH(текущ строки) - HIGH (предыдущей строки))/( OPEN (текущ строки)/100)

Loop

Как данный результат поместить в ячейку «Percent»

Заранее спасибо

с Уважением IVANru

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Re: Нужна Ваша помощь. Как обратится с условием текущей сток

Сообщение Nicky » 13.06.2006 (Вт) 9:03

Код: Выделить всё
cells(1,7) = 1
i=2
Do While i<=2000
  cells(i,7) = 1
  If cells(i,3) > cells(i-1,3) and cells(i,4) > cells(i-1,4) Then _
    cells(i,6) = (cells(i,3) - cells(i-1,3))/(cells(i,2)/100)
  i=i+1
Loop

IVANru
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 13.06.2006 (Вт) 1:03

Сообщение IVANru » 13.06.2006 (Вт) 9:47

Спасибо Вам !!!!!
Пойду приложу к делу. (Учусь)

IVANru
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 13.06.2006 (Вт) 1:03

Сообщение IVANru » 13.06.2006 (Вт) 21:45

Сдесь все нормально работает
Код: Выделить всё
Public Sub HMaxLMin()
Cells(1, 10) = 1
i = 2
Do While i <= 2000


If
    Cells(i, 3) > Cells(i - 1, 3) And Cells(i, 4) > Cells(i - 1, 4) Or _
    Cells(i, 3) > Cells(i - 1, 3) And Cells(i, 4) < Cells(i - 1, 4) And _
    Cells(i, 2) > Cells(i, 5) Then Cells(i, 6) = (Cells(i, 3) - Cells(i - 1, 3)) /   (Cells(i, 2) / 100)
'HMax=Макс > Макс.пр и Мин > Мин.пр то = (Макс Макс.пр)/)открытие /100)
   
 


Сдесь Ошибка.
Почему сдесь ошибка, что не так?
Код: Выделить всё
ElseIf
       Cells(i, 3) < Cells(i - 1, 3) And Cells(i, 4) < Cells(i - 1, 4) Or _
       Cells(i, 3) > Cells(i - 1, 3) And Cells(i, 4) < Cells(i - 1, 4) And _
    Cells(i, 2) < Cells(i, 5) Then Cells(i, 6) = (Cells(i - 1, 4) - Cells(i, 4)) / (Cells(i, 2) / 100)

'LMin=Макс < Макс.пр и Мин < Мин.пр то = (МаксМакс.пр)/)открытие _ /100)

   i = i + 1 'Пересчитовать каждую строку если 2 то через одну

Loop
End Sub


Может цикл другой задать? For.....
Заранее спасибо

с Уважением IVANru
Последний раз редактировалось IVANru 15.06.2006 (Чт) 12:41, всего редактировалось 3 раз(а).

$€rg
Обычный пользователь
Обычный пользователь
 
Сообщения: 99
Зарегистрирован: 11.01.2006 (Ср) 10:15
Откуда: Санкт-Петербург

Сообщение $€rg » 14.06.2006 (Ср) 7:53

If condition Then [statements] [Else elsestatements]

Or, you can use the block form syntax:

If condition Then
[statements]

[ElseIf condition-n Then
[elseifstatements] ...

[Else
[elsestatements]]

End If

нижнее подчеркивание тоже нужная весчь
процесс печатания программного кода укрепляет моральные устои С. Каммингс VBA4Dummies
:study:

MeMBus
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 450
Зарегистрирован: 23.02.2005 (Ср) 7:03
Откуда: Из леса...

Сообщение MeMBus » 14.06.2006 (Ср) 9:19

Код: Выделить всё
Cells(i, 2) > Cells(i, 5) Then Cells(i, 6) = (Cells(i, 3) - Cells(i - 1, 3))...
ElseIf ...

После Then жмем ёнтёр
Код: Выделить всё
Then
Cells(i, 6) = (Cells(i, 3) - Cells(i - 1, 3))
Бороться и искать, найти и перепрятать!

IVANru
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 13.06.2006 (Вт) 1:03

Сообщение IVANru » 14.06.2006 (Ср) 15:16

DATE OPEN HIGH LOW CLOSE HL Pe найти ошибку

Сдесь все хорошо считает
Код: Выделить всё
cells(1,7) = 1
i=2
Do While i<=2000
  cells(i,7) = 1
  If cells(i,3) > cells(i-1,3) and cells(i,4) > cells(i-1,4) Then _
    cells(i,6) = (cells(i,3) - cells(i-1,3))/(cells(i,2)/100)
  i=i+1
Loop



Код: Выделить всё
'Сдесь ошибка  (поменял  наоборот знаки > на <  и  на i,4) что не так
Run-time error "13"


Cells(1, 10) = 1
i = 2
Do While i <= 2000

If Cells(i, 3) < Cells(i - 1, 3) And Cells(i, 4) < Cells(i - 1, 4) Then _
     Cells(i, 6) = (Cells(i - 1, 4) - Cells(i, 4)) / (Cells(i, 2) / 100)
  i = i + 1
Loop

Последний раз редактировалось IVANru 15.06.2006 (Чт) 12:46, всего редактировалось 1 раз.

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 14.06.2006 (Ср) 16:27

IVANru писал(а):Cells(1, 10) = 1
i = 2
Do While i <= 2000

If Cells(i, 3) < Cells(i - 1, 3) And Cells(i, 4) < Cells(i - 1, 4) Then _
Cells(i, 6) = (Cells(i - 1, 4) - Cells(i, 4)) / (Cells(i, 2) / 100)
i = i + 1
Loop

выдаёт ошибку (желтая строка):
Run-time error "13"

Деление на 0?

IVANru
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 13.06.2006 (Вт) 1:03

Сообщение IVANru » 14.06.2006 (Ср) 21:02

Nicky

Как указать данное условие, что бы без ошибки пересчитало
Ячейка 3 менше <ячейки предыдущей 3 и ячейка 4 меньше< ячейки 4 предыдущей строки То (от ячейки 4 предыдущей минус ячека 4 текущяя)/(ячейка2 / 100 'вывожу 1% от ткрытия) итого сумма процента снижения от текущего открытия

код процедуры (это дневные данные на индекс РТС, сводный индекс акций)
(DATE OPEN HIGH LOW CLOSE)
Код: Выделить всё
If Cells(i, 3) < Cells(i - 1, 3) And Cells(i, 4) < Cells(i - 1, 4) Or _
    Cells(i, 3) > Cells(i - 1, 3) And Cells(i, 4) < Cells(i - 1, 4) And _
    Cells(i, 2) < Cells(i, 5) Then _                                   
    Cells(i, 7) = (Cells(i, 4) - Cells(i - 1, 4)) / (Cells(i, 2) / 100) 'ошибка

Наверное условие If несовместимо с блоком Then
немогу сообразить как правильно указать?
Последний раз редактировалось IVANru 15.06.2006 (Чт) 12:47, всего редактировалось 1 раз.

IVANru
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 13.06.2006 (Вт) 1:03

Сообщение IVANru » 14.06.2006 (Ср) 21:57

Вот рабочяя часть кода (' Апострафом заблокировал нерабочию с ошибкой часть кода)
Как сделать её рабочей?
Код: Выделить всё
Public Sub HMaxLMin()
Cells(1, 10) = 1
i = 2

Do While i <= 2000
  Cells(i, 10) = 1
 

'If Cells(i, 3) < Cells(i - 1, 3) And Cells(i, 4) < Cells(i - 1, 4) Or _
    Cells(i, 3) > Cells(i - 1, 3) And Cells(i, 4) < Cells(i - 1, 4) And _
    Cells(i, 2) < Cells(i, 5) Then _
    'Cells(i, 7) = (Cells(i, 4) - Cells(i - 1, 4)) / (Cells(i, 2) / 100)
     'Cells(i, 7) = 0
   
   
If _
    Cells(i, 3) > Cells(i - 1, 3) And Cells(i, 4) > Cells(i - 1, 4) Or _
    Cells(i, 3) > Cells(i - 1, 3) And Cells(i, 4) < Cells(i - 1, 4) And _
    Cells(i, 2) > Cells(i, 5) Then _
    Cells(i, 6) = (Cells(i, 3) - Cells(i - 1, 3)) / (Cells(i, 2) / 100)
   

If _
    Cells(i, 3) < Cells(i - 1, 3) And Cells(i, 4) > Cells(i - 1, 4) Then _
    Cells(i, 6) = 0
 

If _
    Cells(i, 3) < Cells(i - 1, 3) And Cells(i, 4) > Cells(i - 1, 4) Then _
    Cells(i, 7) = 0
 

   i = i + 1
Loop

End Sub
Последний раз редактировалось IVANru 15.06.2006 (Чт) 12:48, всего редактировалось 1 раз.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.06.2006 (Чт) 2:35

IVANru
Сейчас ты пройдёшься по всем своим постам в этом топике, и с помощью кнопки Изображение сделаешь так, чтобы во всех них появились тэги оформления кода. Ну или всё нафиг сотру (ибо сколько можно же?).

Хорошо?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ig
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 30.04.2005 (Сб) 12:37
Откуда: Far East

Сообщение Ig » 15.06.2006 (Чт) 6:21

IVANru писал(а):DATE,OPEN,HIGH,LOW,CLOSE,Percent,Vol

Трейдун? :wink:

Не знаю для чего Вам все это нужно...
Но более быстрым и продуктивным будет все-таки использование массивов.

Вот пример для Вашего первого варианта:

Код: Выделить всё
' Это нужно засунуть в отдельный модуль.

Option Explicit

Public Sub HMaxLMin()
Dim varBsArray As Variant ' это будет наш базовый массив
Dim varRsltArray As Variant  ' а это - будущий массив для сохранения результата
Dim intFstRow As Integer ' первая строка, раб-го диапазона с необходимыми данными
Dim intLstRow As Integer ' последняя строка, раб. диапазона
Dim intUnRow As Integer ' общее кол-во строк, не содержащих нужные данные*
Dim n As Integer, m As Integer ' счетчики
' Переменные для работы с данными из базового массива:
Dim H1 As Integer, H2 As Integer
Dim L1 As Integer, L2 As Integer, O As Integer

' Вычисляем рабочий диапазон необходимых данных
' (вместо 1 и 0 нужно будет подставить свои значения):
intFstRow = 1
intUnRow = 0
intLstRow = ActiveSheet.UsedRange.Rows.Count - intUnRow
' Объявляем количество строк в массиве с резалтами:
ReDim varRsltArray(intLstRow - 2, 0)

' "Одним махом" заполняем базовый массив:
varBsArray = Range(Cells(intFstRow, 2), Cells(intLstRow, 4)).Value

' Вычисляем, что нам нужно и заполняем второй массив резалтами,
' одновременно их форматируя:
For n = 2 To UBound(varBsArray)
  O = varBsArray(n, 1)
  H1 = varBsArray(n - 1, 2)
  H2 = varBsArray(n, 2)
  L1 = varBsArray(n - 1, 3)
  L2 = varBsArray(n, 3)
  m = n - 2
  If (H2 > H1 And L2 > L1) Or (H2 > H1 And L2 < L1) Then
   varRsltArray(m, 0) = Format(((H2 - H1) / O) / 100, "#0.#0000000")
  ElseIf (H2 < H1 And L2 < L1) Or (H2 > H1 And L2 < L1) Then
   varRsltArray(m, 0) = Format(((L1 - L2) / O) / 100, "#0.#0000000")
  End If
Next n
' Так же "одним махом", заполняем столбец Percent значениями:
With Range(Cells(intFstRow, 6), Cells(intLstRow - 1, 6))
.Value = varRsltArray()
End With

Erase varBsArray, varRsltArray ' очищаем память
End Sub

* Это строки, находящиеся вне рабочего диапазона, в его начале или конце, либо и то и другое вместе. Например, таковой является строка: "DATE,OPEN,HIGH,LOW,CLOSE,Percent,Vol"

Вот вкратце и усе. (По идее, надо бы ишшо приткнуть какой-нить обработчик ашипок... Но это уже самостоятельно. :) :wink:)

P.S. Писал вчера. 8)
"Нормальные герои всегда идут в обход..."

IVANru
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 13.06.2006 (Вт) 1:03

Сообщение IVANru » 15.06.2006 (Чт) 10:06

Данную таблицу в Excel, буду расширять, сейчас она не полная по решениям, ещё много умнея вопросов.
У меня статистика в ручную по индексам РФ с 1996, считал
таблицы от руки на листе бумаге, а теперь решил компьютер привлечь.
Отвечаю, зачем мне это- динамика рынка в пределах двух торговых дней.

Спасибо за помощь.
С Уважением.

IVANru
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 13.06.2006 (Вт) 1:03

Сообщение IVANru » 15.06.2006 (Чт) 12:05

Поправил в постах тэги оформления кода.
Вроде правильно - спаибо что поправили.
Последний раз редактировалось IVANru 15.06.2006 (Чт) 12:51, всего редактировалось 1 раз.

Ig
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 30.04.2005 (Сб) 12:37
Откуда: Far East

Сообщение Ig » 15.06.2006 (Чт) 12:46

IVANru писал(а):ещё много умнея вопросов.

Не стесняйтесь, задавайте.
Чем смогу, помогу
"Нормальные герои всегда идут в обход..."


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

    TopList