> Tous les forums > Forum Bureautique
 Arréter puis relancer une macro là où je l'ai arrétée
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
bbe8127
  Posté le 16/04/2015 @ 17:48 
Aller en bas de la page 
Petit astucien

Bonjour,

j'ai une macro qui traite des nombres.

Je voudrai pouvoir changer des valeurs sans perdre le travail effectué, et que les calculs reprennent en tenant compte de ces nouvelles valeurs.

J'avais pensé à un switch manipulé par des boutons dans le genre "Départ" et "Arret", mais quand la macro tourne, on a plus la main pour modifier le switch.

Merci d'avance aux bonnes idées qui pourraient me permettre de finir.

Bernard

Publicité
ferrand
 Posté le 16/04/2015 à 22:10 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bonsoir,

Vouloir interrompre une macro manuellement...! Il faudrait déjà que le temps d'exécution soit suffisamment long, et le faire avec précision est exclu.

Si elle doit s'interrompre, il faut définir des critères qui entraîneront cette interruption. Si elle doit reprendre ensuite des valeurs modifiées, elle refait donc des calculs déjà faits...

Mais on parle dans le vide si tu ne mets pas un modèle qui permette de voir ce que tu veux exactement faire, et quelle sont les solutions adéquates.

bbe8127
 Posté le 17/04/2015 à 11:16 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Ferrand,

merci pour ton message.

je veux calculer le temps écoulé entre deux dates, et pouvoir changer la date de fin de la période.

Je te joins mon "devoir".

Merci pour ton aide.

Bernard

'======================= Décompte entre deux dates ====================
Option Explicit
Option Compare Text

Public Nom_Prog As String, Nom_Chem As String

Public DatDebut, DatFin As Date

Public ADebut, MDebut, JDebut, HDebut, MiDebut, SDebut
Public AFin, MFin, JFin, HFin, MiFin, SFin

Public Reste As Date
Public RDate, RTime
Public AReste, MReste, JReste, HReste, MiReste, SReste

Public NewHour, NewMinute, NewSecond, WaitTime



Sub Décompte()

Nom_Prog = ActiveWorkbook.Name
Windows(Nom_Prog).Activate
Nom_Chem = ActiveWorkbook.FullName
Cells(1, 21) = Nom_Prog
Cells(1, 22) = Nom_Chem

Debut:

' R. a B. "Stop"

Cells(1, 15) = ""


' Initialisation date fin

AFin = Cells(11, 3)
MFin = Cells(11, 4)
JFin = Cells(11, 5)
HFin = Cells(11, 6)
MiFin = Cells(11, 7)
SFin = 0
DatFin = JFin & "/" & MFin & "/" & AFin & " " & HFin & ":" & MiFin & ":00"

' Initialisation date début
DatDebut = Now
ADebut = Year(Date)
MDebut = Month(Date)
JDebut = Day(Date)
HDebut = Hour(Time)
MiDebut = Minute(Time)
SDebut = Second(Time)

' Affichage date début
Cells(8, 3) = ADebut
Cells(8, 4) = MDebut
Cells(8, 5) = JDebut
Cells(8, 6) = HDebut
Cells(8, 7) = MiDebut
Cells(8, 8) = SDebut

'Calcul du reste
Reste = DatFin - DatDebut
RDate = Left(Reste, 10)
RTime = Right(Reste, 8)

AReste = Year(RDate) - 1900
MReste = Month(RDate)
JReste = Day(RDate)
HReste = Hour(RTime)
MiReste = Minute(RTime)
SReste = Second(RTime)

' Affichage Reste
Cells(14, 3) = AReste
Cells(14, 4) = MReste
Cells(14, 5) = JReste
Cells(14, 6) = HReste
Cells(14, 7) = MiReste
Cells(14, 8) = SReste

' Wait 1s
NewHour = Hour(Now())
NewMinute = Minute(Now())
NewSecond = Second(Now()) + 1
WaitTime = TimeSerial(NewHour, NewMinute, NewSecond)
Application.Wait WaitTime

' Test arret ou Retour début

If Cells(1, 15) <> "Stop" Then GoTo Debut


End Sub

Sub Arret()

Cells(1, 15) = "Stop"

End Sub

ferrand
 Posté le 17/04/2015 à 16:45 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Wahou !

Honnêtement, cela me paraît un peu alambiqué !

D'abord, s'il ne s'agit que de calculer le temps écoulé entre 2 dates, pourquoi choisir de le faire en VBA plutôt que par formules ?

Ensuite, je ne vois pas la raison au fait que toutes tes variables sont publiques, ni au fait que tes variables ne pouvant être que de type integer sont déclarées en variant ?

Si je résume (d'après ce qui apparaît dans ta macro) :

- tu sers une ligne où chaque cellule représente un élément de date et heure : année, mois, jour, heure, minute, (les secondes étant à 0)

- ta macro récupère cette date(-heure), considérée comme la date de fin, elle calcule une date(-heure) de début correspondant à l'instant présent, puis fait la différence entre fin - début et transforme cette différence en année, mois, jour, heure, minute, seconde.

- à ce stade, tu lui fais tester la valeur d'une cellule pour savoir si elle contient "stop" : dans ce cas elle s'arrête, sinon elle repart au début...

On peut supposer, selon ta question de départ, que c'est toi qui met ce "stop" ou, comme tu as dit vouloir faire, change la date de fin, seulement la macro ne te rend pas la main tant qu'elle n'est pas arrêtée, donc elle va tourner indéfiniment, jusqu'à saturation où erreur d'exécution apparaît.

De ce point de vue, tu ne peux échapper à la relancer pour chaque calcul, soit manuellement, soit au moyen d'une évènementielle.

Mais il me semble qu'il serait bon avant d'examiner le calcul fait et le résultat produit :

- on peut simplifier quelque peu la constitution des dates début et fin, mais le problème principal n'est pas là : d'abord si la date de fin est future, le résultat de la différence sera positif, mais dans le cas contraire il sera négatif, ce qui peut poser quelque problème dans Excel s'agissant de date,

- lorsque tu fais cette différence, tu obtiens un nombre dont la partie entière correspond à un nombre de jours, or tu traites ce nombre comme s'il s'agissait d'une date en en extrayant année (où tu fais -1900), mois, jour... La différence horaire devrait être en principe juste... Par contre pour avoir un écart en année, mois, jour, il vaudrait mieux y regarder de plus près ;

car dans ta différence évaluée en tant que date, si mois=1, il aura la valeur de janvier, 2 janvier+février...

A noter que si ta différence n'est pas supérieure à 60 jours, tu devrais avoir un écart supplémentaire d'un jour, car le numéro de série des dates n'est commun entre Excel et VBA qu'à partir du 1er mars 1900 (jour 61) et non du 1er janvier.

Je pense que tu devrais vérifier de près les résultats que tu obtiens dans un nombre suffisant de cas et arrêter le mode de calcul qui donne le résultat que tu recherches dans tous les cas, avant de passer à la suite.

Un exemple : date début= 17/04/2015 16:29:08 date fin=20/05/2016 12:30:00

Ta macro va donner: 1 an 4 mois 1 jour 20 h 0 min 52 s (au lieu de: 1an 3mois 0jour...), soit un écart de 1 mois et 1 jour dans ce cas !

Parce que ta différence transformée en date donne : 01/04/1901...

ferrand
 Posté le 18/04/2015 à 23:22 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Tiens donc ! Sujet marqué résolu, sans dire en quoi il l'était (cela ne semblait pourtant pas le cas !) et sans rien dire du tout... ce n'est pas une attitude très collaborative.

Un peu dommage car il y avait matière à discussions, tant sur l'utilisation des macros que sur les problèmes de calcul avec des dates.

L'initiateur du sujet s'étant évaporé , pour ceux qui auraient pu être intéressés, je propose un petit exercice sur son sujet : calculer la durée entre un moment choisi (date-heure) et le moment présent (où l'on fait le calcul). On pourra toujours l'étendre par la suite pour calculer entre deux moments choisis, et éventuellement d'autres calculs... Un modèle de classeur n'avait pas été fourni, mais cela se présentait à peu près comme ci-dessous, d'après les éléments annoncés :

J'ai un peu aménagé, pour qu'on puisse calculer une durée passée par rapport à l'instant présent : mention "futur" remplace "passé" le cas échéant (et la couleur sera alors bleue), une colonne pour afficher les dates au format standard des dates et heures. Ces dates sont calculées à partir des données élémentaires sur la ligne. Pour afficher une date antérieure à 1900, il faut bien sûr transformer en texte. A l'ouverture du classeur, les données sont effacées, et la MFC colore la ligne de saisie en jaune de façon qu'il n'y ait pas ambiguïté pour la saisie.

L'exercice utilise VBA. L'utilisation de VBA pour ce calcul permet de l'étendre à toute la plage de dates gérées par VBA, soit de l'an 100 à l'an 9999. Le calcul se fait selon ce qu'on nomme le "calendrier grégorien proleptique", c'est à dire que pour les périodes (variables selon les pays) antérieures à la mise en place du calendrier grégorien, on fait comme si ledit calendrier y avait déjà été appliqué. Donc si l'on veut calculer avec une date appartenant au calendrier julien, il convient de la convertir avant de faire le calcul. Ce serait mieux de faire aussi cette conversion : j'y pense ! Mais là ce n'est plus un "petit" exercice, il faudra beaucoup plus d'options, et le volume de vérifications à programmer devient nettement plus conséquent...

L'exemple ci-dessus calcule la durée depuis l'application du calendrier grégorien, au moment où je l'ai fait. Pour les pays qui l'on appliqué immédiatement : Italie, Espagne, etc. dont la Savoie (et donc Nice) [pour la France ce fut le 20 décembre de la même année]. Je me rends compte qu'en mettant des heures, il faudrait aussi tenir compte des fuseaux horaires . On s'en passera pour l'instant.

ferrand
 Posté le 18/04/2015 à 23:28 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

(suite) - http://cjoint.com/?EDsxNj1H6uh

Comment ça marche ? Une procédure évènementielle détecte lorsque toutes les valeurs nécessaires sont saisies (les secondes sont optionnelles et initialisées à 0 si non saisies) et lance le calcul. Avant d'y procéder, elle vérifie que chaque saisie est conforme, soit un nombre dans la plage de valeurs autorisées pour chacun. Les valeurs non conformes sont effacées immédiatement, et la vérification ajuste aussi s'il y a lieu le jour (ramène 31 à 30 si le mois n'a que 30 jours, et pour février, si supérieur à 28, à 29 ou 28 selon que l'année est bissextile ou non). La procédure de calcul inscrit la date et l'heure de "maintenant", récupère la date et l'heure saisie, lance le calcul en tenant compte du positionnement de la date saisie (antérieure ou postérieure à "maintenant"), puis inscrit le résultat. Le calcul proprement dit est fait par une fonction (utilisée en fait comme Sub, elle ne renvoie d'ailleurs pas de valeur, mais j'avais quelques arrières pensées et l'ai conservée comme Function pour plus tard...) qui calcule tour à tour les différentes valeurs composant la durée cherchée et les affecte à une variable tableau de niveau module.

bbe8127
 Posté le 19/04/2015 à 10:03 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Ferrand,
tu as écrit, "Tiens donc ! Sujet marqué résolu, sans dire en quoi il l'était (cela ne semblait pourtant pas le cas !) et sans rien dire du tout... ce n'est pas une attitude très collaborative.".
Je suis désolé d'avoir pu donner cette impression. J'ai 72 ans et mon éducation ne m'a pas habitué à ce genre de conduite. Tu voudras bien cependant m'en excuser.
En fait, petit utilisateur du Forum, j'avais répondu à ton message (j'y reviendrai) et j'ai vu au dessus de l'espace d'écriture une case "Clôturer", et comme je pensais pouvoir m'en tirer tout seul avec tes conseils et tes indications, j'ai appuyé dessus. C'est là ma seule erreur. Le message n'est jamais parti, mais la clôture oui! Comme je ne suis pas retourné sur le Forum - pour cause d'invitation - et que je suis rentré hier soir tard, je n'ai pas pu me rattraper .
En gros, je te disais que j'abandonnais l'option "arrêt/reprise", et que j'allais étudier le problème des dates pour arriver à mes fins.
Tu me repropose ce choix.

Je veux bien essayer de résoudre le problème que tu poses.

Mais si quelqu'un y arrive avant moi, je n'aurai pas de honte à pomper sa solution.

D'avance merci à tous.

Merci à toi Ferrand d'avoir rebondi sur ma fausse manoeuvre.

Bernard

ferrand
 Posté le 19/04/2015 à 19:36 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bonsoir,

S'il s'agit d'une erreur de manipulation que tu n'as pas eu le loisir de rectifier, d'accord ! On peut repartir sur une nouvelle base, d'autant que la situation a été modifiée.

Ne cherche pas à résoudre ce qui est déjà résolu. Tu peux reprendre mon fichier, bâti sur ton problème, du moins une partie, pour ananlyser la façon dont il fonctionne, modifier pour tester d'autres façons de faire, ou ajouter des prolongements...

Le problème des dates étant à part, la question que tu posais initialement ne peut pas être résolue par l'interruption d'une macro pour la reprendre après intervention. Il y a diverses autres façons de résoudre une question de ce type : dans mon fichier, la macro se lance automatiquement lorsque le plage est servie, et se relance de la même façon si l'on modifie une donnée. Mais là elle fait toujours le même calcul, et il n'y a pas de choix à opérer.

Dans la mesure où tu n'as pas donné de détails sur ton projet, on ignore s'il se limite à un calcul sur des dates, ou bien si autre chose doit être fait et s'il faut choisir en fonctions de critères... C'est l'ensemble des résultats à obtenir qui indiquera de quelles façons on peut y parvenir le plus simplement.

Cordialement,

Page : [1] 
Page 1 sur 1

Vous devez être connecté pour participer à la discussion.
Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !
Recevoir PC Astuces par e-mail


La Lettre quotidienne +226 000 inscrits
Avec l'actu, des logiciels, des applis, des astuces, des bons plans, ...

Les bonnes affaires
Une fois par semaine, un récap des meilleurs offres.

Les fonds d'écran
De jolies photos pour personnaliser votre bureau. Une fois par semaine.

Les nouveaux Bons Plans
Des notifications pour ne pas rater les bons plans publiés sur le site.

Les bons plans du moment PC Astuces

Tous les Bons Plans
29,99 €Souris sans fil Microsoft Sculpt Comfort bluetooth à 29,99 €
Valable jusqu'au 29 Janvier

Amazon fait une promotion sur la souris sans fil Microsoft Sculpt Comfort bluetooth qui passe à 29,99 € livrée gratuitement au lieu de 39 €. Elégante, performante et ergonomique, cette souris sans fil Bluetooth vous offre la liberté dont vous avez besoin pour le travail et/ou le divertissement. Le ruban tactile latéral vous permettra d'accéder rapidement à vos fonctionnalités préférées de Windows (8 et 10).


> Voir l'offre
309,99 €Console Nintendo Switch édition limitée Mario 309,99 €
Valable jusqu'au 12 Février

Cdiscount propose la nouvelle version de la console Nintendo Switch en édition limitée Mario (avec manettes et bases personnalisées) à 309,99 € livrée gratuitement. Une pochette de transport est également fournie.


> Voir l'offre
58,99 €SSD Crucial MX500 500 Go (M.2 SATA) à 58,99 €
Valable jusqu'au 29 Janvier

Amazon Allemagne propose actuellement le SSD Crucial MX500 500 Go au format M2 SATA à 58,99 € livré. On le trouve ailleurs à partir de 74 €. Ce SSD salué par la critique par son rapport qualité prix imbattable offre des débits de 560 Mo/s en lecture et 510 Mo/s en écriture. Il est garanti 3 ans.


> Voir l'offre

Sujets relatifs
Macro Excel 4
Macro...Protéger feuille
impression recto verso 2 pages puis recto 1 page
2 pages par feuille dans macro excel
erreur macro
Recopie cellule par macro
macro pour comparer 2 listes
lancer une macro à partir d'une première macro
Powerpoint 2010 - arreter un son au clic
Creation d' une boucle macro dans fichier EXCEL pour impression
Plus de sujets relatifs à Arréter puis relancer une macro là où je l''ai arrétée
 > Tous les forums > Forum Bureautique