Sumif calcul écart d'heure
Bonjour,
Effectivement, l'examen du 1er fichier montre qu'il devrait y avoir du X3...
Dans SuppHeureNuitSelectionPR, remplace cette ligne :
pk = Val(.Cells(i, 9).Value)par :
pk = Val(Replace(.Cells(i, 9).Value, ",", "."))Cela devrait ramener du X3...
Cordialement.
Bonjour,
J'ai regardé tes codes, et comment dire :
"Je suis complètement pommé"
Ta codification est vraiment simplifié, et par des codes que je connais pas.
Mais je te remercie beaucoup.
Je vais tester sur un moi complet.
Je viens de me rendre compte d'un autre problème,
Normalement, dans la colonne "AO" la mise en forme conditionnelle est mettre en rouge les données de plus de 04h00.
Hors, c'est celle du déçu qui se met en rouge.
Comme je connais pas tout ton code, est ce que cela viendrait du code?
La formule MFC est bien : AO2>4/24, soit les valeurs supérieures à 4h. J'y ai combiné que : AO2<>"", parce que la formule mise dans la colonne place cette valeur au changements de dates.
Et pour Excel la valeur "" est supérieure à un nombre quelconque (comme toute valeur texte dont c'est la plus petite). Il n'était utile que ces cellules vides se colorent en rouge.
La formule complète :
=ET(AO2<>"";AO2>4/24)qui colore donc en rouge les valeurs de plus de 4h. Il y en a une dans ton échantillon.
Cordialement.
Oui effectivement,
J'ai bien reconnu ce code,
Hors la case rouge est celle du dessus, et pas celle sup à 4h.
Re,
Bizaremment,
le code :
.FormatConditions.Add(xlExpression, , "=ET(AO2<>"""";AO2>4/24)") _
.Interior.Color = vbRed
est non fonctionnel.
même plus la case du deçu
Oh !
Commence par mettre le code que tu cites sous balises Code, que l'on sache de quoi l'on parle !
Prenons donc l'ensemble du code qui t'intéresse ici :
With .Range("A1").CurrentRegion
'Tri ici
With .Range("AO2:AO" & .Rows.Count - 1)
.FormulaR1C1 = "=IF(R[+1]C2=RC2,R[+1]C3-RC3,"""")"
.FormatConditions.Add(xlExpression, , "=ET(AO2<>"""";AO2>4/24)") _
.Interior.Color = vbRed
End With
'Mise formats de cellule ici
End WithOn intervient dans la "région courante" incluant A1, soit toute la partie de feuille comportant des données.
Dans cette partie s'exercent un tri d'une part et des mises au format de cellules, que j'ai fait sauter pour isoler la partie en discussion.
Pour cette partie, on voit qu'on opère sur la colonne AO, de AO2 jusqu'à l'avant-dernière ligne de données.
D'abord, constatons que l'on est en adressage relatif par rapport à la plage globale commençant à A1. L'adressage relatif vis à vis de A1 ne subissant aucun décalage, il se confond avec l'adressage standard, on est donc bien dans la colonne AO.
Pourquoi l'avant dernière ligne : parce que l'on place une formule pour faire la différence entre l'heure en C de la ligne du dessous avec l'heure en C de la ligne courante.
La formule apparaissant en O2 :
=SI($B3=$B2;$C3-$C2;"")correspond bien à celle qui figure dans le code (en style L1C1 pour pouvoir être affectée simultanément à toute la plage). La condition concerne les dates figurant en B, de façon que l'on ne fasse pas cette différence lorsqu'on change de date, puisqu'il s'agit alors de données d'un état distinct...
Sur cette même plage : AO2:AO jusqu'à l'avant-dernière ligne de données, soit la même plage que celle qui contient la formule, on applique une MFC (la référence de plage apparaîtra donc dans la zone s'applique à de la MFC), qui met en rouge les cellules contenant une valeur supérieure à 4h. Et c'est bien ce que confirme la ligne de code afférente et la formule que l'on peut vérifier en MFC.
C'est clair pourtant ! Si la formule MFC est bien alignée sur la plage d'application, et c'est AO2 dans les deux cas ! Soit si la valeur en AO2 est supérieure à 4h la cellule AO2 passera en rouge, et pareil pour toutes les lignes.
Je ne vois pas ce qui pourrais provoquer un décalage dans ce cas !
Si tu as un décalage, tu ne peux pas avoir AO2 dans la formule et AO2 comme point de départ de la plage d'application, mais s'il n'y a plus alignement, c'est que tu as modifié le code, ce dernier stipulant bien AO2....
edit : la ligne de code que tu as citée dans ton dernier post, est une ligne de code, une seule, l'underscore qui en termine la première partie, est un caractère de continuité de ligne, qui indique que ce qui se trouve à la ligne physique en-dessous fait partie de la même ligne de code.
Effectivement, que cette description est claire,
Et j'ai bien changé une ligne sur ton code la ligne columns("i")...
With .Range("A1").CurrentRegion
.Sort key1:=.Range("B1"), order1:=xlAscending, _
key2:=.Range("C1"), order2:=xlAscending, Header:=xlYes
With .Range("AO2:AO" & .Rows.Count - 1)
.FormulaR1C1 = "=IF(R[+1]C2=RC2,R[+1]C3-RC3,"""")"
.FormatConditions.Add(xlExpression, , "=ET(AO2<>"""";AO2>4/24)") _
.Interior.Color = vbRed
End With
.Columns("B").NumberFormat = "dd/mm/yyyy"
.Columns("C").NumberFormat = "hh:mm:ss"
.Columns("AO").NumberFormat = "h:mm:ss"
'------------------------
.Columns("I").NumberFormat = "0.000"
'------------------------
End Withje te joint le fichier du résultat de ta procédure.
Feuille X1 ligne 297
Es-tu sûr que tu as mis un fichier ? Je ne vois rien... et 59 octets !!!
Fichier enchanté !
Sub MFC()
Dim j%
For j = 1 To 4
With Worksheets(j).Range("A1").CurrentRegion
.Cells.FormatConditions.Delete
.Range("AO2:AO" & .Rows.Count - 1).FormatConditions.Add(xlExpression, , _
"=ET(AO2<>"""";AO2>4/24)").Interior.Color = vbRed
End With
Next j
End SubCe bout de macro, strictement identique à ce qui figure dans le code : une fois exécutée c'est bien AO2 qui figure et non CB3 !!!
Cordialement.
Lorsque j'exécute ton code dans le fichier que je t'ai transféré ce matin,
La colonne AO devient rouge de la ligne 296 à la dernière ligne de la feuille X1 uniquement.
RAS sur le reste des feuilles sachant qu'il y a un plus de 4h sur X4.
Bonsoir,
J'ai beau réexaminer ce bout de code...
If .Range("A1").CurrentRegion.Rows.Count > 2 Then
End With
Je ne vois pas pourquoi la formule : "=ET(AO2<>"""";AO2>4/24)" deviendrait =ET(CB3<>"";CB3>4/24)
en décalage de 39 colonnes et 1 ligne ! D'autant qu'alors le même décalage devrait se produire chez moi et il ne le fait pas... La formule se redéfinit pourtant comme si le AO2 (mis en rouge) était interprété comme A1...
Et je ne peux pas entériner le cas s'il ne se produit pas de façon générale !
Essaie de modifier ce bout de code comme suit :
With Worksheets(j)
.Cells.FormatConditions.Delete
If .Range("A1").CurrentRegion.Rows.Count > 2 Then
.Range("A1").CurrentRegion.RemoveDuplicates Array(2, 3), xlYes
With .Range("A1").CurrentRegion
.Sort key1:=.Range("B1"), order1:=xlAscending, _
key2:=.Range("C1"), order2:=xlAscending, Header:=xlYes
End With
With .Range("AO2:AO" & .[A1].CurrentRegion.Rows.Count - 1)
.FormulaR1C1 = "=IF(R[+1]C2=RC2,R[+1]C3-RC3,"""")"
.FormatConditions.Add(xlExpression, , "=ET(AO2<>"""";AO2>4/24)") _
.Interior.Color = vbRed
End With
.Columns("B").NumberFormat = "dd/mm/yyyy"
.Columns("C").NumberFormat = "hh:mm:ss"
.Columns("AO").NumberFormat = "h:mm:ss"
.Columns("I").NumberFormat = "0.000"
End If
End WithAu lieu d'avoir les With en cascade, chacun revient à se référer à la feuille directement. Ce qui devrait éliminer toute ambiguïté, mais cela me laisse tout de même perplexe car c'est la première fois que je verrais interpréter une formule entrée en MFC (donc du texte qui devrait être inséré tel qu'il figure entre guillemets) comme adresse relative à la plage d'application définie !
Cordialement.
SUPER, Un grand merci MONSIEUR.
Je clôture pas car je pense que d'autre demande vont venir, si tu n'y vois aucun inconvénient !!
Merci du retour !