Calcul entre l'heure d'ouverture du fichier et valeur
Bonjour le forum,
Je rencontre un problème pour la mise à jour d'un calcul dont le résultat doit orienté un choix dans ma macro.
Ayant un temps d'exécution de macro relativement long, je lance le fichier la nuit (par le biais du planificateur de tache) pour qu'il recalcule quotidiennement un nombre conséquent de donnée. Je souhaite lorsque qu'il est ouvert en journée qu'il ne met pas à jour l'ensemble des données.
J'ai donc 3 cellules :
1: l'heure à laquelle le planificateur de tache ce lance (saisie manuel)
2: =HEURE(MAINTENANT())
3: = cellule 1 - cellule 2
Si la valeur de la cellule 3 "=0" alors j'exécute sinon je n'exécute pas
Cette "stratégie" fonctionne bien seulement lorsque je ré-ouvre mon fichier pour la première fois en journée, la cellule "maintenant" ne se calcul pas assez vite et du coup ma macro se lance. Par contre si j'enregistre une fois la macro exécuté, l'heure est mise à jour. Lorsque je ré-ouvre la macro ne s'exécute pas.
Mon code ci dessous,
Merci d'avance pour votre aide.
Private Sub Workbook_Open()
'autorise la mise à jour uniquement sur le fichier KPI en AUTO
If ThisWorkbook.Name = "KPI.xlsm" Then
Sheets("KPI").Select
Application.Calculate
Range("BA1").Select
ActiveCell.FormulaR1C1 = "=HOUR(NOW())"
Range("bb2").Select
ActiveCell.FormulaR1C1 = "=NOW()"
Range("BC1").Select
ActiveCell.FormulaR1C1 = "=RC[-2]-RC[-1]"
Range("BC2").Select
Application.Calculate
'lance la macro en auto uniquement si l'heure de la journée correspond à la cellule KPI - BC1 (doit être en adéquation avec le planificateur de tâche)
If Range("bc1") = 0 Then
'execution macro de mise à jour
Call import
ActiveWorkbook.Save
'sauvegarde mensuelle (si dernier jour du mois enregistrement sous kpi)
If Range("bc2") = 2 Then
Dim chemin As String, fichier As String
chemin = ThisWorkbook.Path
fichier = Range("ba3") & ".xlsm"
ActiveWorkbook.SaveAs Filename:=fichier
End If
Application.Quit
End If
Else
Application.Quit
End If
End Sub
Bonjour,
Tu forces un recalcul en début de macro, suivi d'un test pour savoir si elle doit se poursuivre ou non...
NB- Je conseille d'utiliser les balises Code pour rendre ton code mieux lisible dans ton post...
Cordialement.
MFerrand,
Etant novice sur les forums et débutant en VBA je m'excuse de ne pas être parfait sur la présentation et "l'écriture".
Ne demandant que à m'améliorer je suis venu chercher de l'aide et des conseils sur le forum.
Suite à vos remarques, j'espère avoir mis les "balises codes" correctement. (code ci dessous)
Pour revenir à mon problème, effectivement j'ai forcé un recalcul, j'ai également tenté de réécrire les formules directement par l'intermédiaire de la macro en espérant que l'heure "instantané" soit prise en compte. Forcé de constaté l'échec de mes tentatives, j'espère pouvoir être aiguillé sur une solution.
J'espère que vous aurez un peu de temps à consacrer à ma problématique, car ca fait plusieurs semaines que j'essaie divers solutions sans résultat.
Cordialement
Bonne journée
Private Sub Workbook_Open()
'autorise la mise à jour uniquement sur le fichier KPI en AUTO
If ThisWorkbook.Name = "KPI.xlsm" Then
Sheets("KPI").Select
Application.Calculate
Range("BA1").Select
ActiveCell.FormulaR1C1 = "=HOUR(NOW())"
Range("bb2").Select
ActiveCell.FormulaR1C1 = "=NOW()"
Range("BC1").Select
ActiveCell.FormulaR1C1 = "=RC[-2]-RC[-1]"
Application.Calculate
'lance la macro en auto uniquement si l'heure de la journée correspond à la cellule KPI - BC1 (doit être en adéquation avec le planificateur de tâche)
If Range("bc1") = 0 Then
'execution macro de mise à jour
Call import
ActiveWorkbook.Save
'sauvegarde mensuelle (si dernier jour du mois enregistrement sous kpi)
Else
Application.Quit
End If
End Sub
Voilà ta macro :
- sous balises Code,
- indentée !
- légèrement arrangée mais sans modification sur le fond...
Private Sub Workbook_Open()
Dim chemin As String, fichier As String
If ThisWorkbook.Name = "KPI.xlsm" Then
With Worksheets("KPI")
.Range("BA1").Formula = "=HOUR(NOW())"
.Range("BB2").Formula = "=NOW()"
.Range("BC1").Formula = "=BA1-BB1"
.Calculate
If .Range("BC1") = 0 Then
Import
ThisWorkbook.Save
If .Range("BC2") = 2 Then
chemin = ThisWorkbook.Path & "\"
fichier = .Range("BA3") & ".xlsm"
ThisWorkbook.SaveAs chemin & fichier
End If
Application.Quit
End If
End With
Else
Application.Quit
End If
End SubJe ne me prononcerais pas sur la cohérence de la condition, les éléments font en partie défaut, mais je peux dire que si je dois opérer à une heure précise, j'utiliserais Application.OnTime pour programmer à l'ouverture l'heure à laquelle j'exécuterais la macro...
Par contre le dernier Application.Quit me paraît incohérent ! On fait un enregistrement (de sauvegarde ?) du classeur. Ce nouveau classeur contiendra la macro, et chaque fois que l'on essaiera de l'ouvrir, il se refermera ! (sauf à l'ouvrir en désactivant les macros)...
Cordialement.
Tout d'abord, un grand merci.
Ca à l'air de fonctionner, en modifiant manuellement l'heure du PC. test final demain matin.
Pour info, le second enregistrement permet de faire une sauvegarde en fin de mois dans un autre répertoire.
Encore Merci