XL 2010 VBA Addition format HH :MM :SS

spike29

XLDnaute Occasionnel
Bonsoir,

Je bloque sur une l'addition d'une durée format hh:mm:ss à une heure également au format hh:mm:ss.
J'ai un programme me permettant de compiler une grille horaires à plat.
Dans ce programme, je souhaite additionner deux cellules au format hh :mm :ss.

Concernant la 1ère cellule il s’agit d’heure classique exemple : format après macro 233030 => format initiale 23 :30 :30

Concernant la 2ème cellule, il s’agit d’une durée que je dois venir ajouter à l’heure de la 1ère cellule ; Exemple : 2.30 pour 2minutes 30 secondes



Mon besoin est de pouvoir venir additionner la durée de la cellule 2 à l’heure de la cellule 1 pour arriver à faire cela : 233030 + 2.30 = 233300

Mon code se trouve ci-dessous, mais malheureusement je reste bloqué en obtenant le résultat suivant : 233030000230
Les 2.30 (2min 30sec) ne viennent pas s'additionner à l'heure 233030.

Mon code ci-dessous :


If Feuil18.Cells(56, j1).Value = "" Then
Feuil17.Cells(memLigne + 13, 3).Value = Format(Feuil18.Cells(57, j1).Value, "hhmmss")
Feuil17.Cells(memLigne + 14, 2).Value = Feuil17.Cells(memLigne + 14, 2).Value + Format(Feuil18.Cells(57, j1).Value, "hhmmss")
Feuil17.Cells(memLigne + 13, 3).Value = Format(Feuil18.Cells(57, j1).Value, "hhmm.ss")
End If


Avant le "End if" j'ajoute une ligne afin qu'il y ait un point entre les minutes et secondes.
Le format de cette durée doit être le suivant :
00:02:00 => doit donner 2
00:02:30 => doit donner 2.30

Merci d'avance pour votre aide.

Je ne vous ai pas joint le fichier car très (trop) volumineux et pas très intuitif.

N'hésitez pas à revenir vers moi si mon explication nécessite des précisons.

Bonne fin de journée
 
Solution
Du coup au lieu de la solution de mon post #10 utilisez simplement :
VB:
Feuil17.Cells(memLigne + 12, 3) = Application.Text(Feuil18.Cells(57, mem1), "[m].ss")
avec la cellule de destination au format Texte.

spike29

XLDnaute Occasionnel
Bonjour Merci pour vos réponses respectives.

JHA, ta conversion par formule fonctionne parfaitement et répond au besoin.
Cependant, étant donnée que je doit intégrer cette formule dans mon programme de conversion de grille horaire il me faudrait le code VBA permettant d'arriver au même résultat que toi.

Est-il possible d'intégrer un exemple dans le fichier en PJ?

La macro doit venir modifier les cellule B13 et B14

Merci d'avance pour vos retours

Bonne journée
 

Pièces jointes

  • Classeur addition Spike29.xlsx
    12.5 KB · Affichages: 3

job75

XLDnaute Barbatruc
Bonjour spike29, JHA, dysort...

Voyez le fichier joint et cette fonction VBA :
VB:
Function SumTime(v1, v2) As String
Dim v(1 To 2), n As Byte, s
v(1) = v1: v(2) = v2
For n = 1 To 2
    s = Split(v(n), ".")
    If UBound(s) = 1 Then v(n) = s(0) / 1440 + s(1) / 86400
    If v(n) Like "######" Then v(n) = TimeValue(Format(v(n), "00\:00\:00"))
Next n
SumTime = Replace(Format(v(1) + v(2), "hh:mm:ss"), ":", "")
End Function
Le code est à placer impérativement dans un module standard.

La fonction est utilisée en B3.

A+
 

Pièces jointes

  • VBA addition heures(1).xlsm
    16.7 KB · Affichages: 13

job75

XLDnaute Barbatruc
Si l'on veut afficher des heures égales ou supérieures à 24 heures il faut savoir que le format [hh]:mm:ss n'est pas reconnu en VBA.

Mais ce n'est pas un problème, voyez ce fichier (2) et la fonction modifiée :
VB:
Function SumTime(v1, v2) As String
Dim v(1 To 2), n As Byte, s
v(1) = v1: v(2) = v2
For n = 1 To 2
    s = Split(v(n), ".")
    If UBound(s) = 1 Then v(n) = s(0) / 1440 + s(1) / 86400
    If v(n) Like "######" Then v(n) = TimeValue(Format(v(n), "00\:00\:00"))
Next n
SumTime = Replace(Format(v(1) + v(2), "hh:mm:ss"), ":", "")
If v(1) + v(2) >= 1 Then SumTime = 24 * Int(v(1) + v(2)) + Left(SumTime, 2) & Mid(SumTime, 3) '>= 24 heures
End Function
Edit : fichier (2 bis) avec la solution de patricktoulon des posts #15 et #19 :
VB:
SumTime = Application.Text(v(1) + v(2), "[hh]mmss")
 

Pièces jointes

  • VBA addition heures(2).xlsm
    17.1 KB · Affichages: 6
  • VBA addition heures(2 bis).xlsm
    17 KB · Affichages: 2
Dernière édition:

spike29

XLDnaute Occasionnel
Bonjour à tous,

Désolé pour la réponse tardive.
Un grand merci pour votre aide sur le sujet j'ai finalement réussi à plus ou moins me dépatouiller sur le sujet et à réaliser des additions / soustraction.
Cependant je bloque sur un derrnier point, la mise en forme finale :

La cellule que je convertie "Feuil 18 ligne 57" est au format hh:mm:ss
Avec ma formule ci-dessous, les "00:01:30"contenues dans la Feuil18 se transforment en 1.3 dans la Feuil17 alors que je souhaiterai obtenir "1.30"

Comment donc faire apparaître ce "0"?

Je précise que ma formule s'inscrit dans une boucle qui se répercute sur x lignes.

Feuil17.Cells(memLigne + 12, 3).Value = Format(Feuil18.Cells(57, mem1).Value, "hm.ss")


Merci d'avance pour vos retours.

Bonne fin de journée

Cdt,
 

job75

XLDnaute Barbatruc
Bonjour spike29,

Vous avez pris votre temps pour répondre, vous pouviez en prendre un peu plus pour expliquer ce que vous avez fait avec les solutions proposées. :rolleyes:

Pour votre dernier problème mettez d'abord toutes les cellules de destination au format Texte.

Puis remplacez votre code par :
VB:
With Feuil18.Cells(57, mem1)
    Feuil17.Cells(memLigne + 12, 3) = Int(1440 * .Value) & "." & Format(Second(.Value), "00")
End With
Edit : voyez plutôt la solution plus simple du post #22.

A+
 
Dernière édition:

spike29

XLDnaute Occasionnel
Mince, je croyais avoir glisser ma solution dans ma réponse (d'où l'intérêt de bien se relire...).


Je vous l'a partage avec plaisir => Ma boucle au complet.
Je copie les valeurs dans leurs format d'origine je réalise l'addition et seulement après je viens faire la conversion avec le format hhmmss.

J'ai "bidouillé" mais suis quand même arrivé à mes fins :)

For i3 = 0 To 14
If Feuil18.Cells(56, j1).Value = "" Then
Feuil17.Cells(memLigne + i3, 1).Value = Feuil18.Cells(41 + i3, 4).Value
Feuil17.Cells(memLigne + i3, 2).Value = Feuil18.Cells(41 + i3, j1).Value
Feuil17.Cells(memLigne + 14, 1).Value = Feuil18.Cells(60, j1).Value
End If

If Feuil18.Cells(56, j1).Value = "" Then
Feuil17.Cells(memLigne + 13, 3).Value = Feuil18.Cells(57, j1).Value
Feuil17.Cells(memLigne + 14, 2).Value = Feuil17.Cells(memLigne + 14, 2).Value + Feuil18.Cells(57, j1).Value
Feuil17.Cells(memLigne + 13, 3).Value = Format(Feuil18.Cells(57, j1).Value, "hm.ss")
Feuil17.Cells(memLigne + i3, 2).Value = Format(Feuil17.Cells(memLigne + i3, 2).Value, "hhmmss")

End If

Next i3

Merci pour ta solution JOB75 je regarde et te dis ça (plus vite que la première fois ^^).

Bonne fin de journée
 

spike29

XLDnaute Occasionnel
Si regarde bien.


Mon besoin initial :

Mon besoin est de pouvoir venir additionner la durée de la cellule 2 à l’heure de la cellule 1 pour arriver à faire cela : 233030 + 2.30 = 233300

La durée est en Feuil18 (ex : 00:01:30) et l'heure en Feuil17 (ex : 23:30:45)

La solution est là :

Feuil17.Cells(memLigne + 14, 2).Value = Feuil17.Cells(memLigne + 14, 2).Value + Feuil18.Cells(57, j1).Value

Il faut additionner de manière brut les cellules dans leurs format d'origine et faire la conversation en hhmmss à la fin et ça marche
 

spike29

XLDnaute Occasionnel
J'ai testé ton code, top ! J'ai d'abord testé avec "00 à la fin mais pas de changement.
J'avais toujours dans ma colonne Feuil17.Cells(memLigne + 12, 3) une valeur de ce type :
1,3 là ou je cherche à avoir 1,30

J'ai donc ajouté un 3ème "0" et là j'obtiens => 1,03
Feuil17.Cells(memLigne + 12, 3) = Int(1440 * .Value) & "." & Format(Second(.Value), "000")

On approche du but.

Du coup j'ai éssayé de mettre quelque chose comme :
Feuil17.Cells(memLigne + 12, 3) = Int(1440 * .Value) & "." & Format(Third(.Value), "000")

Mais forcément cela aurait été trop simple... ^^

As-tu une piste ?

Code complet ci-dessous :

For i1 = 0 To 13
If Feuil18.Cells(56, j1).Value = "PJV" Then
Feuil17.Cells(memLigne + i1, 1).Value = Feuil18.Cells(41 + i1, 4).Value
Feuil17.Cells(memLigne + i1, 2).NumberFormat = "@"
Feuil17.Cells(memLigne + i1, 2).Value = Feuil18.Cells(41 + i1, j1).Value
End If

If Feuil18.Cells(56, j1).Value = "PJV" Then

Feuil17.Cells(memLigne + 12, 2).Value = Feuil18.Cells(41 + 12, j1).Value - Feuil18.Cells(57, j1).Value

Feuil17.Cells(memLigne + i1, 2).Value = Format(Feuil17.Cells(memLigne + i1, 2).Value, "hhmmss")
Feuil17.Cells(memLigne + 12, 2).Value = Format(Feuil17.Cells(memLigne + 12, 2).Value, "hhmmss")
End If

With Feuil18.Cells(57, j1)
Feuil17.Cells(memLigne + 12, 3) = Int(1440 * .Value) & "." & Format(Second(.Value), "000")
End With

Next i1

Merci d'avance et bonne soirée
 

patricktoulon

XLDnaute Barbatruc
Bonsoir
juste en passant
@job75
Si l'on veut afficher des heures égales ou supérieures à 24 heures il faut savoir que le format [hh]:mm:ss n'est pas reconnu en VBA.
mais si !!!mais pas avec la fonction format
application.text c'est magique ;)

VB:
Sub text()

    Heure1 = CDate("23:30:00")
    Heure2 = CDate("01:30:00")
    TH = Heure1 + Heure2

    'formatage avec la fonction ""Text"" de application
    MsgBox Application.text(TH, "[hh]:mm:ss")    'les crochets associés a app.text  indiquent que les heures se cumulent au dela de 24
    
    'sans formatage on obtient un  temps
    MsgBox Format(TH, "hh:mm:ss")
End Sub
;)
 

Statistiques des forums

Discussions
314 764
Messages
2 112 660
Membres
111 631
dernier inscrit
Danu082024