Всем Доброго дня. «Творю» на 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 аналогичную тему, но состыковать с моим кодом не могу. Если возможно подскажите. Заранее Спасибо.
Алексей_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
Изменил исходный код под миллисекунды – интервал сделал 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
Доброго Всем дня. Возвращаюсь к ранее поднятой теме, т.к. вопрос остался не решенным. Обкатывал три варианта (ниже приведенных). Все работает при задержке 1,2,3 и т.д. сек. Но как только перехожу в миллисекунды, например 0.5сек., Excel вообще перестает реагировать на что либо, не закрыть, не свернуть, ни на какие клики не реагирует. Приходится завершать работу с помощью диспетчера задач. Excel в данном случае сервер, даже клиент не подключается. Все варианты в модулях, а процесс запускается с Code Книга1:
Код
Private Sub Workbook_Open()
TimerTwoSeconds
End Sub
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
Уважаемый, HUGO, все приведенные мной примеры я взял с данного форума 10-13 года и скрестил, как мог, т.к. в Excel я никакой. Если не трудно подскажите что такое пересчет формул.
Только добавьте на лист какую нибудь формулу, анализирующую тот диапазон, куда будете получать данные. Например COUNTA()/СЧЕТЗ() Иначе нечему будет пересчитываться.