Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

  • Initiateur de la discussion Initiateur de la discussion Staple1600
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Staple1600

XLDnaute Barbatruc
Bonjour à tous

Voyez-vous un moyen d'éviter le Replace ?
(quand on utilise comme séparateur la virgule)
Code vba:
Sub test()
MsgBox Evaluate("=dollarde(12.3,60)") 'OK
MsgBox Evaluate("=dollarde(" & Replace("12,3", ",", ".") & ",60)") 'OK
End Sub





NB: dollarde = PRIX.DEC (en français)
Sur Excel2013, l'enregistreur de macros transforme directement en dollarde (je ne sais pas pourquoi ?)
Selon les versions , il faut activer l'utilitaire d'analyse.

PS1: je connais la solution =A1/"1:" ou
en VBA:
Code:
Range("A1") = Range("A1") / TimeValue("1:00")
Range("A1").NumberFormat = "0.00"
mais il faut avoir des heures au format hh:mm or j'ai des nombres décimaux 12,30 ou pire des 12h30.

Merci d'avance pour vos suggestions et avis 😉

PS2: Je sais que je pourrai faire Edition/Remplacer , par : ou h par : et utiliser A1/"1:" ... mais j'ai pas envie 😉
 
Dernière édition:
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Re,

Pour être complet 😎 si l'on veut pouvoir convertir une sélection multiple :

Code:
Sub Heures_décimales()
'sélectionner les zones à convertir
Dim P As Range, n%, a As Range, ncol%, tablo, i&, j%, t$, x$, k%, y$
Set P = Intersect(Selection, ActiveSheet.UsedRange)
If P Is Nothing Then Exit Sub
For n = 1 To P.Areas.Count
  Set a = P.Areas(n)
  ncol = a.Columns.Count
  tablo = a.Resize(, ncol + 1)
  For i = 1 To UBound(tablo)
    For j = 1 To ncol
      t = a(i, j).Text
      x = Left(t, 1)
      For k = 2 To Len(t)
        If Not IsNumeric(x) Then Exit For
        y = Mid(t, k, 1)
        If LCase(y) = "h" Or y = ":" Or y = "." Or y = "," Then
          If IsNumeric(Mid(t & 0, k + 1, 2)) Then
            tablo(i, j) = Val(x) + Val(Mid(t & 0, k + 1, 2)) / 60
            Exit For
          End If
        End If
        x = x & y
      Next
    Next
  Next
  a.NumberFormat = "0.00"
  a = tablo
Next
End Sub
A+
 
Dernière édition:
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Bonjour,
Comment savoir "automatiquement" si 13,25 c'est bien 13:25 et non pas pas 13:15 converti en décimale soit 13,25 ?
Si tu ne considères que cet exemple précis, je ne vois pas a priori ce qui te permet de le savoir...par contre je suppose que chaque logiciel de traitement à la source a sa propre manière de traiter les données, donc si tu as moyen lors de la récupération de ces données de connaître la source de traitement ton code pourrait inclure une partie ou en fonction de la source tu pourrais individualiser le traitement :
- source 1 : les données m'arrivent en sexadécimale=>nettoyage des données et conversion en décimale
- source 2 : les données m'arrivent en décimale=>nettoyage des données mais pas de conversion
- etc.
Lors de la récupération de tes données as-tu un moyen de connaître le logiciel ou l'application source ?
A+
 
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Re,

Bah je préfère comme ça :

Code:
Sub Heures_décimales()
'sélectionner les zones à convertir
Dim P As Range, ncol%, tablo, i&, j%, t$, x$, k%, y$
Set P = Intersect(Selection, ActiveSheet.UsedRange)
If P Is Nothing Then Exit Sub
For Each P In P.Areas
  ncol = P.Columns.Count
  tablo = P.Resize(, ncol + 1)
  For i = 1 To UBound(tablo)
    For j = 1 To ncol
      t = P(i, j).Text
      x = Left(t, 1)
      For k = 2 To Len(t)
        If Not IsNumeric(x) Then Exit For
        y = Mid(t, k, 1)
        If LCase(y) = "h" Or y = ":" Or y = "." Or y = "," Then
          If IsNumeric(Mid(t & 0, k + 1, 2)) Then
            tablo(i, j) = Val(x) + Val(Mid(t & 0, k + 1, 2)) / 60
            Exit For
          End If
        End If
        x = x & y
      Next
    Next
  Next
  P.NumberFormat = "0.00"
  P = tablo
Next
End Sub
A+
 
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Bonjour job75, david84


david84:
Pour répondre à ta question, non je connais pas les logiciels utilisés
(mais cette part de fichier n'est pas trop importante)
la majorité sont issus de saisie manuelles directement dans Excel.
Le moyen actuel que j'utilise c'est le montant en euros qui me permet de retrouver le nombre d'heures car je connais forcément le taux horaire exact (c'est celui de "mon" propre logiciel "comptable", qui malheureusement n'a pas de fonction d'import !)
Oui car je vous ai pas dis, qu'une fois le fichier Excel normalisé, on doit saisir (mes collègues et moi ) ces heures décimales dans ce logiciel.
[APARTE]
Le pire dans l'histoire, est donc que je normalise le fichier Excel, que je le renvoie au tiers pour validation avant paiement
et qu'à l'envoi de sa prochaine facture, il me renvoie son propre fichier toujours problématique parce que les opérateurs de saisie ont leur habitudes de travail, ou ne connaissent pas bien Excel (et ses formules) et donc ils n'utilisent que leur fichier,
ou le fichier d'export de leur logiciel (avec souvent ce format 28h30) qu'ils ne retravaillent jamais avant envoi
Donc je ne peux pas faire grand chose du côté des "sources" 😉
[/APARTE]

job75:
J'admire ton art de la persévérance, ton goût pour le "peaufinement" du bel ouvrage "vbaiste". 😉
 
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Re

Mais alors si c'est de la saisie manuelle effectuée par tes collègues il ne peut s'agir que d'une saisie sexadécimale car je vois pas quelqu'un saisir 13.5 pour 13h30 ou 13:30 ou 13.3 ou 13,3.
Peut-être pourrais-tu demander à ce que toutes les saisies soient effectuées sur un fichier que tu aurais préalablement "formaté" comme tu le souhaites afin de contraindre les collègues à une saisie correcte des heures, ce fichier pouvant être unique ou être ensuite installé sur chaque poste, comme cela les collègues te fourniraient des données harmonisées.
A+
 
Dernière édition:
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Re


si c'est de la saisie manuelle effectuée par tes collègues
Ce ne sont pas mes collègues mais les salariés des tiers qui nous envoient leur fichier Excel.
•I l y a des fichiers uniquement d'export
(avec cette bizarrerie : 28h30 mais le montant calculé est 28.5* Taux horaire)
• Il y a des fichiers saisies manuellement 12.3 ou 12,3 ou 12:30 et montant saisie manuelle
mais dans ces deux cas la formule devrait être heure décimale * taux horaire, mais heureusement le montant en euros lui est OK)


Dans tous les cas, de toute façon, je dois normaliser ces fichiers pour qu'au final lors de la saisie dans notre logiciel,
les données du fichier Excel soient équivalentes aux données de notre logiciel de facturation.

On a mis en place ce système car au début on recevait la version imprimée par courrier du fichier Excel.
Désormais, les tiers envoient leurs fichiers (certains sont OK d'autres devront être normalisés) par mail
Donc à réception, je normalise et/ou rectifie les erreurs de taux ou de formules.
renvoie au tiers par mail le fichier modifié pour validation
puis validation OK -> saisie dans notre logiciel.

PS: Le fichier Excel me permet de vérifier en direct lors de la saisie la concordance des données.
Et c'est ce faisant que je me suis aperçu que certaines factures avaient le bon montant total (en euros) mais affichait des heures sexagésimales: 28h30, 28.3 ou 28:30 en lieu et place d'heures décimales : 28,5
 
Dernière édition:
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Re,

Je persévère encore avec ce code qui permet d'éviter de traiter 2 fois les mêmes cellules :

Code:
Dim Traité As Range 'mémorisation

Sub Heures_décimales()
'sélectionner les zones à convertir
Dim P As Range, ncol%, tablo, i&, j%, t$, x$, k%, y$
Set P = Intersect(Selection, ActiveSheet.UsedRange)
If P Is Nothing Then Exit Sub
For Each P In P.Areas
  If Not Traité Is Nothing Then If Not Intersect(P, Traité) Is Nothing Then _
    If MsgBox(P.Address & " contient des cellules déjà traitées, voulez vous ignorer cette zone ?", 4) = 6 Then GoTo 1
  ncol = P.Columns.Count
  tablo = P.Resize(, ncol + 1)
  For i = 1 To UBound(tablo)
    For j = 1 To ncol
      t = P(i, j).Text
      x = Left(t, 1)
      For k = 2 To Len(t)
        If Not IsNumeric(x) Then Exit For
        y = Mid(t, k, 1)
        If LCase(y) = "h" Or y = ":" Or y = "." Or y = "," Then
          If IsNumeric(Mid(t & 0, k + 1, 2)) Then
            tablo(i, j) = Val(x) + Val(Mid(t & 0, k + 1, 2)) / 60
            Exit For
          End If
        End If
        x = x & y
      Next
    Next
  Next
  P.NumberFormat = "0.00"
  P = tablo
  Set Traité = Union(P, IIf(Traité Is Nothing, P, Traité))
1 Next
End Sub
A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour