Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 17.06.2008, 12:32   #1
shematov
 
Регистрация: 17.06.2008
Сообщений: 5
По умолчанию пересчет таблицы с использованием макроса

Вообщем проблема вот в чем: есть таблица в excel, ее поля заполняются автоматически ссылкой =MT4|BID!AUDCHF т.е. из прогаммки MetaTrader (экспорт DDE) в excel транслируются котировки. далее я написал макрос, который по этим котировкам производит некоторые вычисления и выводит в этом же листе. но нужно сделать так, чтобы этот макрос запускался каждый раз при изменении любой котировки! пробовал сделать это через Private Sub Worksheet_Change(ByVal Target As Range) , но эта процедура как оказалось не реагирует на изменения котировок, т.е. если менять там занчения "руками" то она работает, т.е. перезапускает макрос, но если котировки меняются сами, то она уже не работает. вообщем очень нужна помощь с этой проблемой, как сделать так, чтобы макрос реагировал на изменения котировок? или хотя бы может быть можно чтобы он автоматически запускался раз в секунду...? буду рад любой помощи, заранее благодраен.
shematov вне форума
Старый 17.06.2008, 12:55   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Метод OnTime как раз для запуска процедуры по времени (см. help по VBA).
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 17.06.2008, 13:26   #3
shematov
 
Регистрация: 17.06.2008
Сообщений: 5
По умолчанию

метод OnTime.... я думал об этом, только неочень понял как его запустить? т.е. если я хочу чтобы он запускал макрос каждые 5 секунд, то мне нужно сделать бесконечный цикл
Do While (i < 10)
Application.OnTime Now + TimeValue("00:00:05"), "final"
Loop
но это не работает,потому что цикл проходит слишком бысто и просто получается десять таких вызывов подряд, которые выполняются слишком быстро. если же использовать метод wait, то программка подвисает на время выполнения, а мне нужно отслеживать изменения таблицы после каждого запуска макроса.
shematov вне форума
Старый 17.06.2008, 15:15   #4
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Например, так устроит?
Код:
Sub Main()
    Application.OnTime Now + TimeValue("00:00:05"), "final"
    DoEvents
End Sub

Sub final()
    Range("A1") = Range("A1") + 1 ' Это для примера и наглядности
    Main
End Sub
Запустите макрос "Main". Начнется отсчет времени, после которого запустится и быстро выполнится другая процедура. Перед выходом из нее - снова запускаем "Main".
Благодаря DoEvents, работе в Excel это не мешает.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 17.06.2008, 15:33   #5
shematov
 
Регистрация: 17.06.2008
Сообщений: 5
По умолчанию

здорово, спасибо, большое. есть еще небольшой вопрос, можно ли в excel устанавливать дробное время.... например чтобы запуск происходил через каждые полсекунды или 0.1 секунды?
shematov вне форума
Старый 17.06.2008, 15:37   #6
shematov
 
Регистрация: 17.06.2008
Сообщений: 5
По умолчанию

и еще вопросик... это ведь получается вечный цикл? как его остановить?
shematov вне форума
Старый 17.06.2008, 16:10   #7
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

я делал так:
Sub Main()
' тут реальный код, что нужно сделать, например:
Range("A1") = Range("A1") + 1 ' Это для примера и наглядности
Application.OnTime Now + TimeValue("00:00:05"), "Main"
End Sub

' DoEvents я выбрасывал, Эксель в этот момент реагирует на клавиши и на мышь, он свободен от выполнения макроса, он совершенно открыт для общения, можно писать формулы, открывать новые книги и все такое прочее, в коде только необходимо учитывать, что когда "это" буде выполняться, что в этот момент может быть открыта не та книга, не тот лист и в А1 может оказаться допустим текст

Этот цикл точно нескончаемый. Остановить его можно, закрыв данный файл, (он еще на последок, уже после закрытия, ругнется что не нашел "Main"), или например, вписав в определенную ячейку определенное значение, а там, где должен выполняться "реальный код" сделать проверку этой ячейки с соответсвенными выводами.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 17.06.2008, 16:43   #8
shematov
 
Регистрация: 17.06.2008
Сообщений: 5
По умолчанию

спасибо большое, эт классно! вроде даже работает))
а что насчет дробного времени? есть возможность выполнять макрос чаще чем раз в секунду?
shematov вне форума
Старый 17.06.2008, 17:18   #9
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Кроме TimeValue есть еще SerialTime (может ошибся немного - пишу по памяти) задавал части секунды. честно говоря, хлебанул я горя с такой конструкцией.
Что-то у Экселя коряво происходит с этим всем (или скорее у меня). Вроде все очевидно, но...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 18.06.2008, 08:53   #10
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

При помощи WinAPI-функции GetTikCount, можно устанавливать временные интервалы с точностью до миллисекунды. Посмотрите вложение. Запустите макрос (любой).
Еще добавлена возможность остановки работы такой конструкции: если в ячейку "B1" занести любое значение, то макрос остановится (соответственно, если "B1" не пуста - макрос не запустится).
Вложения
Тип файла: rar Delay_ms.rar (5.0 Кб, 34 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматический запуск макроса Len@ Microsoft Office Excel 6 23.07.2008 12:05
Перенос макроса в модуль valerij Microsoft Office Excel 6 09.06.2008 23:13
Создание SetUp для макроса Romuald Microsoft Office Excel 3 06.06.2008 12:23
Запись макроса valerij Microsoft Office Excel 5 01.12.2007 00:49