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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2011, 22:11   #1
clever77
Пользователь
 
Регистрация: 13.04.2011
Сообщений: 58
По умолчанию Как сделать временной цикл с задержкой 0,1 сек?

Здравствуйте!
Подскажите как организовать при помощи макроса временной цикл с шагом в 0,1 секунды?
В книгу Excel поступают данные в диапазон ячеек А1:С21. Обновляются с 10:00 и до 19:00 с частотой 0,1 сек. Я пытаюсь сделать архив этих данных, копируя значения ячеек диапазона А1:С21 в те же столбцы, но со смещением строк на 22 позиции.
Не знаю как заставить макрос запуститься в 10:00 и закончить работу в 19:00, а цикл архивирования данных происходил не чаще чем раз в 0,1с (т.е в часе 3600 с* 9ч итого 32 400, а с учетом десятых сек 324 000 записей исходных данных)

Пока программа работает с запуском в ручную и кол-во записей опр переменной к, если ее значение больше значения N архивирование данных заканчивается, т.к комп тратит времени на выполнение одного цикла гораздо меньше времени чем 0,1с (10 000 циклов за 30с-1мин в зависимости от загруженности компа), получается многократная запись одних и тех же данных

Пытался сделать паузу в цикле по средствам:
Application.Time Now + TimeValue("00:00:00.1")
Но макрос не понимает.....
Подскажите как быть. Прилагаю пример, в архиве 2 файла в excwl 2010 и 97_2003
Вместе с данными ведется запись времени, на это не обращайте внимания, просто проверял сколько на выполнение тратится времени.

Sub save_1()

Dim t As Variant
Dim d As Variant
Dim i As Integer
Dim j As Integer
Dim k As Variant

d = [F3] 'по столбцам
k = [G3]
Range("A24") = Time
Range("A30") = Range("A24").Value

3: For j = 1 To 21

' по столбцу запись информации
Cells(40 + j + d, 1) = Cells(j, 1)
Cells(40 + j + d, 2) = Cells(j, 2)
Cells(40 + j + d, 3) = Cells(j, 3)
Cells(40 + j + d, 4) = Time

10: If k > 10 Then GoTo 1

Next j

d = d + 22 ' по столбцам
k = k + 1
Range("F3") = d
Range("G3") = k
'7: Application.Time Now + TimeValue("00:00:00.1")
GoTo 3

1: Range("A25") = Time
Range("A32") = Range("A25").Value
End Sub

Спасибо.
Вложения
Тип файла: rar Архив данных.rar (24.0 Кб, 16 просмотров)
clever77 вне форума Ответить с цитированием
Старый 05.05.2011, 00:45   #2
clever77
Пользователь
 
Регистрация: 13.04.2011
Сообщений: 58
По умолчанию

Application.Wait Now() + TimeValue("00:00:01") - Делает паузу в 1 сек
Как это настроить для паузы в 0,1с , (ведь формат времени в EXCEL 00:00.0 есть) - пока не получается
clever77 вне форума Ответить с цитированием
Старый 05.05.2011, 00:58   #3
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

В раздел объялений:
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
В процедуру
sleep 100
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Старый 05.05.2011, 01:15   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Application.Wait Now() + 1/24/36000 -это логично, но не работает

с таким обьявлением
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Sleep 100 - работает
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 05.05.2011 в 01:31.
IgorGO вне форума Ответить с цитированием
Старый 05.05.2011, 01:37   #5
clever77
Пользователь
 
Регистрация: 13.04.2011
Сообщений: 58
По умолчанию

Цитата:
Сообщение от kuklp Посмотреть сообщение
В раздел объялений:
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
В процедуру
sleep 100
Да этот пример я тоже нашел, только осмыслить не могу как это правильно впихнуть в мою программу..... Макрос ругается..
Либо на Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Либо на Call Sleep(100) 'Задержка

Возможно что то не так делаю... Если кто может впишите это в текст моей программы(приведена в 1 посте темы) В программировании я пока новичок, есть сложности.....

А вот примеры что на просторах интернета я нашел
http://server2009.ucoz.ru/chtivo/Info3.htm#106

номер 106 и 108

и про API Sleep
http://visual.2000.ru/develop/ms-vb/tips/9611.htm
совет 61
clever77 вне форума Ответить с цитированием
Старый 05.05.2011, 01:51   #6
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

Вместо строки
'7: Application.Time Now + TimeValue("00:00:00.1")
напишите
sleep 100
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Старый 05.05.2011, 01:57   #7
clever77
Пользователь
 
Регистрация: 13.04.2011
Сообщений: 58
По умолчанию

[QUOTE=IgorGO;792920]Application.Wait Now() + 1/24/36000 -это логично, но не работает

Application.Wait Now() + (TimeValue("00:00:10") / 10) - к примеру работает задержка 1с
Application.Wait Now() + (TimeValue("00:00:01") / 10) - а вот так уже нет, тк данный формат имеет мин зн 1 с и зн 1с/10 похоже принимает раное нулю, т.е без задержки
Возможно дело в формате представления данных (времени) - есть временной формат 00:00.0 - возможно это и есть десятые секунды, только вот как их вписать в макрос не знаю......
clever77 вне форума Ответить с цитированием
Старый 05.05.2011, 01:57   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)


Sub PauseExample()
Dim t As Single
t = Timer
Sleep 100
MsgBox Timer - t
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 05.05.2011, 02:07   #9
clever77
Пользователь
 
Регистрация: 13.04.2011
Сообщений: 58
По умолчанию

Цитата:
Сообщение от kuklp Посмотреть сообщение
Вместо строки
'7: Application.Time Now + TimeValue("00:00:00.1")
напишите
sleep 100
Sub save_1()
1:Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
...................
2:sleep 100
...........
end sub

Ругается
Compile error:
Only comments may appear after End sub, End function, or End property

Ставлю 1 и 2 в комент - работает........ потому и спросил.....
clever77 вне форума Ответить с цитированием
Старый 05.05.2011, 02:18   #10
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

обьявление процедуры - это отдельная строка.
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
вынесите в начало модуля (из тела save_1)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать цикл cargo29 Мультимедиа в Delphi 1 22.04.2011 13:24
Как сделать, чтобы открытый запрос автоматически закрылся через 10 сек Vikylik Microsoft Office Access 2 20.11.2010 19:15
Как округлить милисекунды в кол-во сек и мили сек? XerSon Общие вопросы Delphi 2 09.06.2010 10:26
Цикл по времени - Как сделать так чтобы цикл выполнялся к примеру 10 секунд ? Anarki Общие вопросы C/C++ 3 13.11.2009 19:23
Нужно сделать изменение цвета надписи каждые 15 сек Wildice Microsoft Office Excel 3 03.11.2009 12:20