Страницы: 1
RSS
Timer в миллисекундах, Объединить процедуры счетчика с процедурой таймера
 
Всем Доброго дня.  «Творю» на VB.Net, поэтому VBA душой понимаю, а реально решить задачку не всегда получается. Подскажите решение следующей проблемы: Получаю данные в режиме On-Line в первый столбец. Необходимо знать кол-во поступивших данных за единицу времени. Вот код
Код
Option Explicit
Public LastRowCount As Long
Public Sub TimerTwoSeconds()
    Dim pSheet As Worksheet, CurRowCount As Long
    Set pSheet = ThisWorkbook.Worksheets(1)
    CurRowCount = pSheet.UsedRange.Rows.Count
    pSheet.Range("H1").Value = CurRowCount - LastRowCount
    LastRowCount = CurRowCount
    Application.OnTime Now + 1.15740740740741E-05, "TimerTwoSeconds"
End Sub
Данный код с поставленной задачей справляется(код помог написать участник форума) – это если интервалы времени 1сек. 2, 3 и т.д. А требуется в миллисекундах. Нашел на форуме и в MSDN аналогичную тему, но состыковать с моим кодом не могу.
Если возможно подскажите. Заранее Спасибо.
 
Посмотрите здесь
http://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=1&TID=46336
«Бритва Оккама» или «Принцип Калашникова»?
 
Алексей_S, удобнее работать со временем, используя "TimeValue", который переводит время, понятное человеку, в время, используемое компьютером:
Код
Application.OnTime Now + TimeValue("00:00:01")

TimeValue("00:00:01") - это 1 секунда.
Чтобы получать миллисекунды, делите TimeValue("00:00:01") на нужное число.
Например TimeValue("00:00:01") / 1000 - это 1 миллисекунда.

В итоге можно использовать такой вариант. В этом варианте таймер установлен на 2 миллисекунды. Вместо 2 пишите нужное кол-во миллисекунд:
Код
Application.OnTime Now + (TimeValue("00:00:01") / 1000) * 2
Изменено: Karataev - 21.12.2015 10:47:14
 
Спасибо, Karataev, буду обкатывать.
С Уважением, Алексей.
 
Цитата
А требуется в миллисекундах
А сможет ли ексел обрабатывать с такой частотой?
Да ещё и каждый раз записывать на лист
 
Цитата
Алексей_S. написал: «Творю» на VB.Net,
А зачем вам тогда Exсel
Принимайте по dde данные и обрабатывайте.
Было время, я 500 бумаг обрабатывал без проблем одновременно.
 
Изменил  исходный код под миллисекунды – интервал сделал 500 миллисекунд. Происходит следующее: после открытия книги ничего, не подключая,  через равные промежутки времени (1сек) происходит как бы снова загрузка в течение секунд 5-8. Цикл этот не прекращается. И иногда на панели быстрого доступа появляется надпись – «не отвечает».
В чем проблема?
 
Предположу, что OnTime работает с млсек, начиная с 600 млсек, т.к. при 500 все моментально происходит.
Чтобы в заголовке окна не было "Не отвечает" попробуйте использовать DoEvents:
Код
Public Sub TimerTwoSeconds()
    Dim pSheet As Worksheet, CurRowCount As Long
    Set pSheet = ThisWorkbook.Worksheets(1)
    CurRowCount = pSheet.UsedRange.Rows.Count
    pSheet.Range("H1").Value = CurRowCount - LastRowCount
    LastRowCount = CurRowCount
    Application.OnTime Now + (TimeValue("00:00:01") / 1000) * 500, "TimerTwoSeconds"
    DoEvents
End Sub
 
А настройки Excel могут влиять в данном случае?
 
на ontime настройки excel точно никак не влияют
 
Доброго Всем дня. Возвращаюсь к ранее поднятой теме, т.к. вопрос остался не решенным. Обкатывал три варианта (ниже приведенных). Все работает при задержке 1,2,3 и т.д. сек. Но как только перехожу в миллисекунды, например 0.5сек.,  Excel вообще перестает реагировать на что либо, не закрыть, не свернуть, ни на какие клики не реагирует. Приходится завершать работу с помощью диспетчера задач. Excel в данном случае сервер, даже клиент не подключается.  Все варианты в модулях, а процесс запускается с Code Книга1:
Код
Private Sub Workbook_Open()
    TimerTwoSeconds
End Sub
____________________________________________________________­________________________
Вариант_1.                                                                                                                                                            
Код
Option Explicit
Public LastRowCount As Long
Public Sub TimerTwoSeconds()
    Dim pSheet As Worksheet, CurRowCount As Long
    Set pSheet = ThisWorkbook.Worksheets(1)
    CurRowCount = pSheet.UsedRange.Rows.Count
    pSheet.Range("C1").Value = CurRowCount - LastRowCount
    LastRowCount = CurRowCount
    Application.OnTime Now + 1.15740740740741E-05, "TimerTwoSeconds"
End Sub   
Вариант_2.
Код
Public Sub TimerTwoSeconds()
    Dim pSheet As Worksheet, CurRowCount As Long
    Set pSheet = ThisWorkbook.Worksheets(1)
    CurRowCount = pSheet.UsedRange.Rows.Count
    pSheet.Range("H1").Value = CurRowCount - LastRowCount
    LastRowCount = CurRowCount
    Application.OnTime Now + (TimeValue("00:00:01")/ 1000) * 500, "TimerTwoSeconds"
End Sub
Код
Вариант_3.
Код
Public LastRowCount As Long
Public Sub TimerSeconds()
    Dim pSheet As Worksheet, CurRowCount As Long
    Set pSheet = ThisWorkbook.Worksheets(1)
    CurRowCount = pSheet.UsedRange.Rows.Count
    pSheet.Range("C1").Value = CurRowCount - LastRowCount
    LastRowCount = CurRowCount
    
    Dim НазваниеМакроса As String
    Dim ЗадержкаВСекундах As Single
    Dim ЗадержкаВЧасах As String

     ЗадержкаВСекундах = 0.5
    НазваниеМакроса = "TimerSeconds"
    ЗадержкаВЧасах = Replace(Format(CDbl(TimeSerial(0, 0, 1)) * ЗадержкаВСекундах, "0.000000000"), ",", ".")
    macro = "ON.TIME(NOW()+" & ЗадержкаВЧасах & ", """ & НазваниеМакроса & """)" 
    ExecuteExcel4Macro macro
      Application.OnTime Now, "TimerSeconds"
End Sub
 
Алексей_S., используйте WinAPI функцию таймера SetTimer, пример тут: http://www.cyberforum.ru/vba/thread1374286.html
 
Вопрос: Можно ли сделать так, что процедура начинает работать при поступлении данных, а не в режиме цикла?
 
Можно - обрабатывайте пересчёт формул.
 
Уважаемый, HUGO, все приведенные мной примеры я взял с данного форума 10-13 года  и скрестил, как мог, т.к. в Excel я никакой. Если не трудно подскажите что такое пересчет формул.
 
Уважаемый, Казанский, 5 марта 2013 Вы привели пример задержки с помощью QueryPerformanceCounter. А в данной ситуации этот метод применим?
 
Цитата
Алексей_S. написал:  подскажите что такое пересчет формул
Это событие, к которому можно привязать какой-либо макрос. Для листа:
Код
Private Sub Worksheet_Calculate()

End Sub
Для книги:
Код
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)

End Sub
Почитайте в приёмах про макросы.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Спасибо, JayBhagavan :)

Только добавьте на лист какую нибудь формулу, анализирующую тот диапазон, куда будете получать данные. Например COUNTA()/СЧЕТЗ()
Иначе нечему будет пересчитываться.  
 
Hugo, пожалуйста. :) _/\_

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
Страницы: 1
Читают тему
Наверх