Microsoft 365 Séparer une plage horaire

clem7802

XLDnaute Nouveau
Bonjour,

Je cherche un peu d'aide concernant une liste avec début et fin d'horaire.
Je vais directement donner un exemple pour être clair sur mon besoin.

TempsDébutFin
24​
08/03/2022 05:50​
09/03/2022 05:50​

J'ai 24h et je souhaite modifier la ligne et en ajouter afin d'obtenir les lignes suivantes :

TempsDébutFin
7,5​
08/03/2022 05:50​
08/03/2022 13:20​
7,5​
08/03/2022 13:20​
08/03/2022 20:50​
9​
08/03/2022 20:50​
08/03/2022 05:20​

Ci joint un fichier excel avec différentes plages horaire. Je fais du VBA donc aucun problème pour en faire.

Merci pour votre aide
 

Pièces jointes

  • test.xlsm
    12.6 KB · Affichages: 6

Dranreb

XLDnaute Barbatruc
C'est à peu près ça :
VB:
Option Explicit
Sub TranchesH()
   Dim TH(), TE(), LE&, TS(), LS&, Q As Integer, DHDéb As Date, DHFin As Date, Jour As Integer
   TH = Array(35 / 144, 5 / 9, 125 / 144)
   TE = ActiveSheet.[A2].Resize(ActiveSheet.[A1000000].End(xlUp).Row - 1, 2).Value
   ReDim TS(1 To 5000, 1 To 3)
   For LE = 1 To UBound(TE, 1)
      DHDéb = TE(LE, 2)
      DHFin = DHDéb + TE(LE, 1) / 24
      For Q = 0 To 1
         If TH(Q) > DHDéb - Int(DHDéb) Then Exit For
         Next Q
      Jour = 0
      Do: LS = LS + 1
         TS(LS, 2) = DHDéb
         DHDéb = Int(DHDéb) + TH(Q) + Jour
         If DHDéb >= DHFin Then Exit Do
         TS(LS, 3) = DHDéb
         TS(LS, 1) = CDbl((TS(LS, 3) - TS(LS, 2)) * 24)
         If TS(LS, 1) = 0 Then LS = LS - 1
         Q = (Q + 1) Mod 3: Jour = -(Q = 0)
         Loop
      TS(LS, 3) = DHFin
      TS(LS, 1) = CDbl((TS(LS, 3) - TS(LS, 2)) * 24)
      Next LE
   ActiveSheet.[E2].Resize(LS, 3).Value = TS
   End Sub
 

clem7802

XLDnaute Nouveau
Bonjour,

Merci beaucoup pour votre retour. J'ai passé une partie de la soirée a essayer de comprendre le code et l'adapter a mon besoin final mais c'est au dessus de mes compétences actuelles en VBA.
Je sais pas si vous pouvez encore m'aider, je vais vous exposer la finalité de mon besoin.

J'ai deux base de données Data1 avec des DHDéb et DHFin + d'autres colonnes et Data2 avec DHDéb et DHFin + d'autres colonnes (j'ai supprimer certaines data que je ne peux pas diffuser).

Le but c'est de séparer les Lignes de Data1 en fonction des équipes 05:50/13:20/20:50 mais aussi d'autres cas particulier (Travail certain samedi de 05:50/13:20 + travail week-end avec des horaires qui change VSDnuit ou SDjour --> colonne poste dans Data2) en plus de séparer les lignes j'ai besoin de garder les datas des autres colonnes.


Ensuite je souhaite injecter dans Data1 le nom/prénom de la personne qui conduit la ligne en fonction de DébutAffectation ou bien Poste + la colonne Ligne (info qui sont dans Data2).

Pour info le fichier Data1 fait actuellement 140000 lignes et Data2 34000

Je sais pas si c'est déjà possible de faire ça et si oui pouvez-vous encore m'aider ?
 

Pièces jointes

  • test.xlsm
    802.8 KB · Affichages: 3

Dranreb

XLDnaute Barbatruc
Qu'est-ce que vous ne comprenez pas exactement ?
S'il y a des horaires différent le samedi ça va un peu compliquer.
Peut être vaudrait-il mieux un cycle sur 7 jours soit 21 horaires dans un tableau.
Puisque ce sont des tableaux vous pouvez charger les donnée par
TE = Worksheets("Data 1").ListObjects(1).DatabodyRange.Value
Naturellement ça change les numéros de colonnes à spécifier …
 
Dernière édition:

clem7802

XLDnaute Nouveau
Bonjour,

J'ai deux interrogations :

For Q = 0 To 1
If TH(Q) > DHDéb - Int(DHDéb) Then Exit For
Next Q

J'ai compris que le For est pour gérer les cas ou la DHDéb est 07:31 et pas 05:50 par exemple mais je comprends pas l'utilisation de Q (pourquoi de 0 to 1)

et après le calcul : Q = (Q + 1) Mod 3: Jour = -(Q = 0)

Merci pour l'aide
 

Dranreb

XLDnaute Barbatruc
Je pense que si on aura 21 horaires dans un tableau pour distinguer les horaires d'équipes lors des week-end, on fera autrement, on va plutôt y chercher le Q de départ du cycle par Q = WorksheetFunction.Match(DHDéb - 7 * Int(DHDéb / 7), TDH)
et pour reboucler au début du cycle, après le calcul Q = Q mod 21 + 1: If Q = 1 Then Jour = 7
 

Discussions similaires

Réponses
2
Affichages
520
Réponses
3
Affichages
400
Réponses
17
Affichages
3 K

Statistiques des forums

Discussions
312 294
Messages
2 086 895
Membres
103 404
dernier inscrit
sultan87