[XL-2010] Mise en forme selon variable

Y compris Power BI, Power Query et toute autre question en lien avec Excel
A
AM76
Nouveau venu
Nouveau venu
Messages : 6
Inscrit le : 23 novembre 2018
Version d'Excel : 2010

Message par AM76 » 4 janvier 2019, 15:11

Bonjour à tous et meilleurs voeux !

J'ai un problème que je pense presque impossible à résoudre, mais je ne doute pas que des génies du VBA en ces lieux puissent me venir en aide :)
Ca me parait impossible mais non plus compliqué donc peut-être que quelqu'un y arrivera en 2min

J'ai une base de données avec 3 colonnes : Heure de début, heure de fin, durée d'exposition

Le but général est d'isoler chaque bloc de 30 secondes d'une manière ou d'une autre (dans l'exemple joint d'une couleur différente à chaque fois).
Dans l'exemple joint, les 4 premières lignes sont égales à 30 secondes et doivent donc être identifiable ensemble (couleur bleue).

Les 5 lignes suivantes sont égales à 31 secondes. Il faudrait donc retrancher 1 seconde de la dernière ligne pour avoir un bloc de 30 strictement secondes, et créer une nouvelle ligne pour reporter cette seconde sur le bloc prochain.

Un grand bravo à celui qui saura résoudre cela, pas facile à mon avis :lole:
Calcul 30 secondes.xlsx
(9.83 Kio) Téléchargé 7 fois
Avatar du membre
Juice
Membre impliqué
Membre impliqué
Messages : 1'058
Appréciations reçues : 96
Inscrit le : 28 novembre 2017
Version d'Excel : Microsoft Excel 2010

Message par Juice » 4 janvier 2019, 16:06

Salut,
AM76 a écrit :
4 janvier 2019, 15:11
Le but général est d'isoler chaque bloc de 30 secondes d'une manière ou d'une autre (dans l'exemple joint d'une couleur différente à chaque fois).
Capture.PNG
Capture.PNG (2.74 Kio) Vu 67 fois
Tu dit que tu isole chaque bloc de 30 secondes mais pour moi entre le 20:56:51 et le 21:18:55 il y a 22 minutes et 4 secondes qui c'est écoulé.

Le format que tu utilise c'est [jour]/[mois]/[année] [heure]:[minute]:[seconde]

C'est ce qu'Excel voit, et ce que je vois aussi

Tu peux nous donner des précisions ?

Restant à dispo
A l'instant même où je l'ai vue, ingénue,
Je suis tombé amoureux d'eeeeeeelle.
Elle est la seule ici bas,
Que je trouve digne de moi.
Et je compte bien épouser cette demoiseeeeelle.

La Belle et la Bête. Belle
G
Girodo
Membre fidèle
Membre fidèle
Messages : 301
Appréciations reçues : 2
Inscrit le : 24 mars 2015
Version d'Excel : 2010

Message par Girodo » 4 janvier 2019, 16:57

Bonjour,

Un début de réflexion qui pourra peut être aider les suivants.

Il manque la fonction d'insertion de ligne.

Et pour répondre à juice il cherche à faire des blocs de 30secondes d'exposition. Il s'agit donc d'une somme d'intervalles et non d'une durée en prenant Heure fin - Heure Début

Bon courage,

Girodo,
Test.xlsm
(19.85 Kio) Téléchargé 5 fois
Petit Chêne deviendra gland ! :btres:
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 3'334
Appréciations reçues : 216
Inscrit le : 26 janvier 2011
Version d'Excel : 2007

Message par Theze » 4 janvier 2019, 17:52

Bonjour,

A tester. Les heures étant issues de formules (soustractions) et comme je change les valeurs dans la plage pour faire des sommes de 30 secondes, je transforme la plage en valeur et comme les valeurs contiennent des millisecondes, j'utilise la fonction Second() pour les extraire :
Sub Test()
    
    Dim Plage As Range
    Dim Cel As Range
    Dim Lig As Long
    Dim Col As Integer
    Dim TCoul
    Dim I As Long
    Dim J As Integer
    Dim Total As Integer
    Dim Seconde As Integer
    
    'comme on modifie les valeurs dans les cellules supprime les formules
    Set Plage = Range(Cells(2, 3), Cells(Rows.Count, 3).End(xlUp))
    Plage.Value = Plage.Value
    
    'tableau servant à colorer les plages
    TCoul = Array(3, 4, 5, 6, 7, 8, 15, 16, 17, 18, 19, 20, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45)
    
    Seconde = 30
    
    Col = 3 'en colonne C
    
    'recherche de la dernière ligne
    Lig = Cells(Rows.Count, Col).End(xlUp).Row
    
    'évite la celluloe d'entête
    I = 1
    
    Do
        
        I = I + 1
        
        'mémorise la première cellule de la plage pour la coloration
        If I = 2 Then Set Cel = Cells(I, Col)
        
        'totalise en extrayant les secondes (problèmes avec les millisecondes d'où l'utilisation de Second())
        Total = Total + Trim(Second(Cells(I, Col).Value))
        
        'si le total est égal à 30 secondes, colore la plage,
        'remet à 0 et défini la cellule du dessous comme
        'début de la prochaine plage...
        If Total = Seconde Then
        
            Total = 0
            Range(Cel, Cells(I, Col)).Interior.ColorIndex = TCoul(J)
            J = J + 1
            
            Set Cel = Cells(I + 1, Col)
            
        End If
        
        'par contre, si la valeur est supérieure à 30 secondes, insère une ligne
        'déduit la différence de la valeur précédente et inscrit cette différence
        'dans la nouvelle cellule puis colore la plage d'une autre couleur
        'redéfini la cellule de départ de plage et réajuste
        If Total > Seconde Then
        
            Cells(I + 1, Col).EntireRow.Insert
            Cells(I, Col).Value = Cells(I, Col).Value - CDate("00:00:" & Format((Total - Seconde), "00"))
            Cells(I + 1, Col).Value = CDate("00:00:" & Format((Total - Seconde), "00"))
            Total = 0
            Range(Cel, Cells(I, Col)).Interior.ColorIndex = TCoul(J)
            J = J + 1
            Set Cel = Cells(I + 1, Col)
            Lig = Lig + 1 'réajuste la plage
            
        End If
        
        'évite de dépasser le nombre d'élément du tableau
        If J > UBound(TCoul) Then J = 0
        
    Loop While I < Lig
    
End Sub
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message