Срочно!Как заполнить столбец значениями обновляемой ячейки?

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Vaseninbox
Сообщения: 34
Зарегистрирован: 05 сен 2008, 15:11
Контактная информация:

Я с котировками пытаюсь другой макрос написать
:) Хорошо,что я тут оказался не единственным,кто торговыми системами занимается...
А под какой терминал,если не секрет,создаёте скрипт???
Одиночка
Сообщения: 11
Зарегистрирован: 04 ноя 2008, 01:44

Vaseninbox писал(а): :) Хорошо,что я тут оказался не единственным,кто торговыми системами занимается...
А под какой терминал,если не секрет,создаёте скрипт???

Мой брокер работает с платформой МТ4. Но советниками торговать не дает, стоит запрет. Соответственно и скрипты не работают. А мне нужно для скальпинга чтобы при открытии ордеров сразу можно было вставить минимальный Т/Р в любом месте рынка. Вот придумал как это решить с помощью макроса, через MS Excel.
Vaseninbox
Сообщения: 34
Зарегистрирован: 05 сен 2008, 15:11
Контактная информация:

CurrentRow = CurrentRow + 1
If CurrentRow > 32000 Then CurrentRow = 1: CurrentColumn = CurrentColumn + 1
Cells(CurrentRow, CurrentColumn).Value = NewValue
У меня заполняется второй столбец после того,как становится заполненным первый. Отлично! :rolleyes:
НО как построить график,который бы содержал в себе больше 32 000 точек ??
Например, у меня для построения графика 60 000 точек. Логично для этого создать 2 ряда данных (столбец А и В) и в каждом пусть будет по 30 000 значений. Но и диаграмма тогда получается состоящей из двух графиков. А мне нужен один график с 60 000 значений. Как этого добиться??
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Для этого Y-значения придется перемежать X-значениями.

Сейчас

Y1 Y5
Y2 Y6
Y3 Y7
Y4 Y8

А надо

1 Y1 5 Y5
2 Y2 6 Y6
3 Y3 7 Y7
4 Y4 8 Y8

Ну и обоим рядам назначить одинаковый цвет.
Правда на границе двух рядов не будет соединительной линии, но при таком количестве точек можно линии вообще не проводить.
Vaseninbox
Сообщения: 34
Зарегистрирован: 05 сен 2008, 15:11
Контактная информация:

Немного сходу не понял что значит
Для этого Y-значения придется перемежать X-значениями.
и что означает:
1 Y1 5 Y5
2 Y2 6 Y6
3 Y3 7 Y7
4 Y4 8 Y8
Эт как????????????
С цветами,конечно,всё ясно,но это проблема не основная...
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Проще показать. :)
См. приложение.
Первая диаграма имеет тип "График", а вторая "Точечная".
Вложения
Book1.zip
(2.42 КБ) 26 скачиваний
Vaseninbox
Сообщения: 34
Зарегистрирован: 05 сен 2008, 15:11
Контактная информация:

Класс!! Спасибо большое теперь всё понятно и на своих местах!! Построил график, который держит 150 000 значений. ;)

Скажите, а каким ещё образом, кроме как следующим, можно заполнить столбец??:

Код: Выделить всё

[B]Range("A1").Offset(Application.WorksheetFunction.Count(Range("A:A")) + 1, 0)[/B]
Дело в том, что у меня 2 версии рОбота (торговый рОбот): первый работает по таймеру (и для него свойство Range("A1").Offset() работает и столбцы заполняются и график потом строится..), а второй работает с событиями. То есть, как только в торговом терминале возникает новое событие (это событие-появление новой котировки) - она (новая котировка) тут же скачивается в ячейку Worksheets("Лист1").Cells(10, 12).

Как сделать так, чтобы каждое следующее значение ячейки Worksheets("Лист1").Cells(10, 12) копировалось в новую ячейку в столбце А2 на "Лист2" и по порядку???

Например:
-пришло значение "23" в ячейку "Worksheets("Лист1").Cells(10, 12)", и оно скопировалось в ячейку Cells(1, 1) на Лист2;
-пришло значение "80" в ячейку "Worksheets("Лист1").Cells(10, 12)", и оно скопировалось в ячейку Cells(2, 1) на Лист2;
ну так до конца до упора, в общем....

Я пытался сделать сдедующим образом, но не работает....((
Код для Лист1:

Код: Выделить всё

[B]Private Sub Worksheet_Calculate()
    Call Лист2.Rw
End Sub[/B]
Код для Лист2:

Код: Выделить всё

[B]Sub Rw()
    Range("A1").Offset(Application.WorksheetFunction.Count(Range("A:A")), 0).Value = Application.Workbooks("Arbitrag.xls").Worksheets("Лист1").Cells(10, 12).Value
End Sub[/B]
Где могла закрасться ошиба и есть ли ещё какие-нибудь способы заполнить столбец??? Заранее спасибо!
Kokain
Сообщения: 23
Зарегистрирован: 09 авг 2006, 11:03
Откуда: Moscow
Контактная информация:

Добрый день.
Здесь необходимо отлавливать события используя worksheet_change.

Код: Выделить всё

Private Sub Worksheet_Change(ByVal Target as Range)
    Target. []
End Sub
Target - диапазон, который изменяется. Можно например взять его адрес (target.address) или свойства и т.д.
Если необходимо зафиксировать диапазон (конкретно в таком-то диапазоне идет изменение), то берем Intersect. Для примера:

Код: Выделить всё

Private Sub Worksheet_Change(ByVal Target As Range) '
  If Not Application.Intersect(Range("C4 :D 17"), Target) Is Nothing Then
     Worksheets("RISK").Range("B20:F20").Select
     Selection.ClearContents
     Target.Select
  End If
End Sub
А по поводу задачи в целом:
Комп может слишком загрузиться из-за потока тиков (несколько штук в секунду бывает, верно?). ИМХО, сюда надо будет ставить обработчик ошибок отлова котировок, чтобы дыры помечать хотябы. И быструю (оптимизированную) процедуру складирования тиков - может сначала в массив писать а потом в range выкладывать массив. По моему видел посты с такой же задачей на mql4.com, загуглите наверняка там это все уже решили.
Vaseninbox
Сообщения: 34
Зарегистрирован: 05 сен 2008, 15:11
Контактная информация:

Огромное спасибо!! Сейчас пойду пытаться реализовать идею!!

За одно вопрос: А в каком случае большой код будет выполняться быстрее:

-если использовать .Cells()

или

-если в тех же местах заменить .Cells() на .Range("")????
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Логично предположить, что Cells и Offset быстрее. Но я не мерял.
Также при любой возможности надо пользоваться Next и Prev.
Возможно (тоже не мерял), что Ячейка.Offset(0,2) медленее чем Ячейка.Next.Next

Вообще, обращения из макроса к листу - это медленная операция. Количество таковых надо свети к минимуму. Наприер путем записи в ячейки массивов.

Напрмиер вместо

Cells(1,1).Value=10
Cells(1,2).Value=20
Cells(1,3).Value=40

Лучше написать

Range("A1:C1").Value=Array(10,20,40)

Но будет ли быстрее следующий вариант:

Range(Cell(1,1),Cell(1,3)).Value=Array(10,20,40)

я не уверен.
А если уже есть переменная типа Range, скажем Set C=Cells(1,1), то то же самое можно записать как

Range(С,C.Next.Next).Value=Array(10,20,40)

:)

Оптимизировать надо пытаться все, что стоит в циклах.
И это предмет для отдельной темы.
Ответить