2009-05-15 3 views
1

Comment calculer excel en continu une feuille/plage en temps réel (pas 1 cal/sec) et le faire en arrière-plan?Besoin de VB pour que Excel calcule une feuille ou une plage en temps réel et en arrière-plan

Je veux cette horloge métrique de fonctionner comme un chronomètre ....

=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))

Répondre

2

Je l'ai utilisé ce qui suit pour produire l'effet que vous recherchez:

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 est la macro que je lie au bouton Start/Stop du chronomètre. Vous pouvez avoir envie, et changer son nom à "Démarrer" ou "Stop" en fonction de la valeur de TimerRunning, mais j'ai gardé les choses simples pour illustrer le concept.

Les deux choses clés sont:

Application.Calculate 

qui oblige Excel pour calculer la feuille de calcul, et:

DoEvents 

qui permet VBA d'exécuter en arrière-plan (par exemple Excel ne cesse pas de répondre à l'entrée de l'utilisateur). C'est ce qui vous permet d'appuyer sur le bouton "Stop" même si la minuterie est en cours d'exécution.

+0

c'était ce que je cherchais ... merci ... est-il possible de recalculer en une seconde? comme peut-être 10 fois par seconde? en trompant la fonction now() en quelque sorte? ou initialiser plusieurs variables "maintenant" séparées qui sont décalées d'un dixième de seconde? – CheeseConQueso

+0

aussi, ive remarqué que tapant dans une cellule pendant que la montre est en cours d'exécution va mettre en pause la sortie dans A1 pour changer, mais n'arrêtera pas la macro (StartStop_Click) - toute façon autour de cela? – CheeseConQueso

+0

Re Commentaire # 1: Essayez-vous de voir plus de résolution sur la minuterie, comme dans: HH: MM: SS: MSS? La fonction NOW() doit avoir la même résolution que l'horloge système (généralement environ 10 millisecondes), mais l'heure de mise à jour dépend de combien Excel doit faire entre les appels à DoEvents. –

2

Je pense que cela peut échouer votre "(pas 1 calc/s)" critères, mais je réalisé quelque chose de similaire à ce qui suit. Suppose que votre formule se trouve dans la cellule A1 d'une feuille de calcul nommée Sheet1.

Dans le module de code ThisWorkbook:

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

... et dans un module de code régulier:

Public Sub RecalculateRange() 
    Sheet1.Range("A1").Calculate 
    Application.OnTime Now + TimeValue("00:00:01"), "RecalculateRange" 
End Sub 
Questions connexes