Нужен VB, чтобы Excel вычислял лист или диапазон в реальном времени и в фоновом режиме - PullRequest
1 голос
/ 16 мая 2009

Как сделать так, чтобы Excel непрерывно вычислял лист / диапазон в реальном времени (не 1 кальци / сек) и делал это в фоновом режиме?

Я хочу, чтобы эти метрические часы работали как секундомер ....

=IF(LEN(ROUND((HOUR(NOW())*(100/24)),0))=1,"0"&ROUND((HOUR(NOW())*(100/24)),0),ROUND((HOUR(NOW())*(100/24)),0))&":"&IF(LEN(ROUND((MINUTE(NOW())*(100/60)),0))=1,"0"&ROUND((MINUTE(NOW())*(100/60)),0),ROUND((MINUTE(NOW())*(100/60)),0))&":"&IF(LEN(ROUND((SECOND(NOW())*(100/60)),0))=1,"0"&ROUND((SECOND(NOW())*(100/60)),0),ROUND((SECOND(NOW())*(100/60)),0))

Ответы [ 2 ]

2 голосов
/ 16 мая 2009

Для получения эффекта, который вы ищете, я использовал следующее:

Option Explicit

Public TimerRunning As Boolean
Dim CalculationDelay As Integer

Public Sub StartStop_Click()
    If (TimerRunning) Then
        TimerRunning = False
    Else
        TimerRunning = True
        TimerLoop
    End If
End Sub

Private Sub TimerLoop()
    Do While TimerRunning
        '// tweak this value to change how often the calculation is performed '
        If (CalculationDelay > 500) Then
            CalculationDelay = 0
            Application.Calculate
        Else
            CalculationDelay = CalculationDelay + 1
        End If
        DoEvents
    Loop
End Sub

StartStop_Click - это макрос, который я привязываю к кнопке Пуск / Стоп для секундомера. Вы можете придумать и изменить его имя на «Пуск» или «Стоп» в зависимости от значения TimerRunning, но я пояснил концепцию просто.

Вот две ключевые вещи:

Application.Calculate

Что заставляет Excel вычислять рабочий лист, и:

DoEvents

Что позволяет VBA работать в фоновом режиме (т. Е. Excel не перестает отвечать на вводимые пользователем данные). Это то, что позволяет вам все еще нажимать кнопку «Стоп», даже если таймер работает.

2 голосов
/ 16 мая 2009

Я думаю, что это может не соответствовать вашим критериям (не 1 кальци / сек), но я добился чего-то похожего следующим образом. Предполагается, что ваша формула находится в ячейке A1 листа с именем Sheet1.

В модуле кода ThisWorkbook:

Private Sub Workbook_Open()
    Application.OnTime Now + TimeValue("00:00:01"), "RecalculateRange"
End Sub

... и в обычном кодовом модуле:

Public Sub RecalculateRange()
    Sheet1.Range("A1").Calculate
    Application.OnTime Now + TimeValue("00:00:01"), "RecalculateRange"
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...