[XL-2010] Mise en forme selon variable

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

Salut,

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

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

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,

6test.xlsm (19.85 Ko)

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
Rechercher des sujets similaires à "2010 mise forme variable"