IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

TimeStamp avec gestion de l'heure d'été/hiver pour calcul de durée


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Bragu Demon
    Homme Profil pro
    Intégrateur d'Explopitation
    Inscrit en
    Juin 2013
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Intégrateur d'Explopitation
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2013
    Messages : 125
    Par défaut TimeStamp avec gestion de l'heure d'été/hiver pour calcul de durée
    Bonjour à tous,

    Voici mon objectif : arriver à calculer une durée à la seconde près en gérant les changements d'heure.

    Dans un fichier excel, par vba :
    Je récupère depuis un fichier csv une date (jj/mm/aaaa) et une heure (hh:mm:ss) de début (ce sont 2 données issues d'un split).
    J'assemble cette date et cette heure dans une variable string debut de cette forme jj/mm/aaaa hh:mm:ss
    Je fait la même chose pour une date et heure de fin, dans une variable fin

    J'avais opté pour une conversion en timestamp avec DateDiff("s", "1/1/1970", CDate(debut)) pour pouvoir calculer la durée du traitement, ce qui fonctionne très bien.
    Sauf que certains traitements peuvent durer plusieurs jours, je dois revoir ma copie pour pouvoir gérer les changements d'heure.
    Si le traitement commence le samedi à 23h et fini le dimanche à 05h00, en fonction du changement (+/- 1 heure) mon heure de fin modifiée par le changement d'heure faussera le calcul.

    Déterminer le dernier dimanche de mars et octobre de l'année en cours, puis comparer l'heure avec 03:00 et ajouter ou retrancher 1 heure me paraît très compliquer et beaucoup ressembler à une usine à gaz.

    Comment pourrais-je m'en sortir ?

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre confirmé Avatar de Bragu Demon
    Homme Profil pro
    Intégrateur d'Explopitation
    Inscrit en
    Juin 2013
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Intégrateur d'Explopitation
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2013
    Messages : 125
    Par défaut
    Bonjour et merci bien pour la réponse.

    Je vais regarder pour intégrer ça a mon appli

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    Déterminer le dernier dimanche de mars et octobre de l'année en cours, puis comparer l'heure avec 03:00 et ajouter ou retrancher 1 heure me paraît très compliquer et beaucoup ressembler à une usine à gaz.
    Je crois que tu n'y couperas pas, par contre le changement est à 2h pour l'heure d'été (on passe à 3h)

    Ce qui m'amène à une question pour le passage à l'heure d'hiver qui se fait à 3h (on passe à 2h)
    Mais avant qu'il soit 3h, il est 2h30. Donc dans la nuit il est 2 fois 2h30.
    J'espère pour toi qu'il n'y aura jamais une fin entre 2h et 3h de cette nuit là... ;-)
    eric

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Télécharge le timer-> https://www.developpez.net/forums/d1...e/#post8364029

    Tu le place dans dans un userform et à chaque événement du timer sur un seconde tu incrément le temps écoulé de 1!

    Ainsi la l'heure d'été tu t'en fiches puisque tu connais la date et heure de début et le temps écoulé!

    Ton traitement peut durer plusieurs jours! Plusieurs mois? Transpose ta plage au premier janvier,calcule le temps en seconde et décrémente le!

    Nom : TesRd2.gif
Affichages : 2822
Taille : 61,7 Ko
    Dernière modification par Invité ; 15/06/2017 à 09h43.

  6. #6
    Membre confirmé Avatar de Bragu Demon
    Homme Profil pro
    Intégrateur d'Explopitation
    Inscrit en
    Juin 2013
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Intégrateur d'Explopitation
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2013
    Messages : 125
    Par défaut
    Merci pour vos réponses,

    Après vérifications, les traitements sont lancés après que la mise à jour de l'heure.
    Cette mise à jour est faite le vendredi soir à 19h.

    Je sais, c'est étrange, les fichiers à consulter sont issus d'un mainframe
    Nom : 103px-Mainframe_Computer.svg.png
Affichages : 2295
Taille : 7,1 Ko

    Du coup je n'ai plus de problème puisque tous les traitements vont débuter (et donc finir) après l'ajustement de l'heure.

    Par contre j'ai commis la fonction ci-dessous, des fois que ça puisse servir à d'autres:
    L'idée : tester une date passée en paramètre.
    S'il s'agit du dernier dimanche de mars -> il faut changer d'heure, avec un décalage de +1 heure
    S'il s'agit du dernier dimanche d'octobre -> il faut changer d'heure, avec un décalage de -1 heure
    Pour les autres, on ne change pas d'heure.

    J'aimerai bien vos remarques sur les approches à avoir et sur comment je pourrai optimiser ça, par exemple test le mois en premier lieu (3 ou 10 uniquement).


    Merci d'avance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Sub test()
    Dim dt, chgt()
      dt = Now()
    '  dt = "29/10/2016"
    '  dt = "26/03/2017"
      chgt = changement_heure(dt)
      If chgt(0) Then
        MsgBox "Date à contrôler : " & dt & vbLf & _
               "Faut-il changer d'heure ? " & chgt(0) & vbLf & _
               "Décalage : " & chgt(1) & " heure"
      Else
        MsgBox "Il n'y a aucun changement à opérer."
      End If
     
    End Sub
     
    'Déterminer si l'on est sur une date de changement d'heure.
    '@PARAM {Variant} date à tester, au format jj/mm/aaaa
    '@RETURN {Variant} Renvoi un tableau contenant Vrai/Faux et l'ajustement
    Function changement_heure(arg As Variant) As Variant
      Dim i As Integer, arr(1) As Variant
      Dim jour As Integer, mois As Integer, annee As Integer, nJour As Integer
      For i = Left(DateSerial(Year(arg), Month(arg) + 1, 0), 2) To 1 Step -1
        jour = Day(arg)
        mois = Month(arg)
        annee = Year(arg)
        nJour = Weekday(i & "/" & mois & "/" & annee, vbMonday)
          If nJour = 7 Then
            Select Case mois
              Case 3 'dernier dimanche de mars
                arr(0) = True
                arr(1) = 1
              Case 10 'dernier dimanche d'octobre
                arr(0) = True
                arr(1) = -1
              Case Else 'Autre cas
                arr(0) = False
                arr(1) = 0
            End Select
            Exit For
          End If
      Next
      changement_heure = arr()
    End Function

Discussions similaires

  1. Gestion de l'Heure avec VBA
    Par AlainG06 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 23/01/2016, 10h51
  2. Réponses: 5
    Dernier message: 15/09/2014, 10h06
  3. Réponses: 3
    Dernier message: 03/12/2013, 01h16
  4. soustraction timestamp avec une heure en trop ?
    Par groskanel dans le forum Langage
    Réponses: 9
    Dernier message: 03/03/2011, 18h13
  5. Réponses: 3
    Dernier message: 13/08/2004, 18h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo