[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).
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,
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