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

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:

Dranreb

XLDnaute Barbatruc
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Bonsoir.

Ma suggestion:
VB:
Function HeureDéc(ByVal C As Range) As Double
HeureDéc = CDate(Replace(Replace(C.Text, ",", ":"), "h", ":")) * 24
End Function
 

Staple1600

XLDnaute Barbatruc
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Bonsoir Dranreb

Merci pour la suggestion ;)

Néanmoins je cherchais ...
Voyez-vous un moyen d'éviter le Replace ?

C'est vrai que le cumuler c'est pas l'éviter mais c'est une suggestion ;)
EDITION : Il y a un petit souci
Si en A1: 1,3 ta function renvoie 1,05 au lieu de 1,5
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Alors comme ça ?
VB:
Function HeureDéc(ByVal C As Range) As Double
If IsNumeric(C.Value) And InStr(C.Text, ":") = 0 Then
   HeureDéc = Int(C.Value) + (C.Value - Int(C.Value)) * 5 / 3: Exit Function
Else
   HeureDéc = CDate(Replace(Replace(C.Text, ",", ":"), "h", ":")) * 24: End If
End Function
 

Staple1600

XLDnaute Barbatruc
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Re

Dranreb
Cette fois-ci cela fonctionne ;).
Merci.

Mais dans ce cas, autant utiliser ;) (il y a moins de Replace inside ;) )
Code:
Function hdec(ByVal C As Range)
hdec = Evaluate("=dollarde(" & Replace(C.Text, ",", ".") & ",60)")
End Function

Mais ce que je cherche à faire c'est trouver une astuce pour ne pas utiliser Replace dans le code.
(ou dans le tien de code ;) )
Je voudrais pouvoir utiliser =PRIX.DEC en VBA sans devoir me préoccuper du séparateur décimal.
Mais plus je cogite, plus je crois que je n'y couperais pas ;) au Replace.

Sauf si vos neurones me montrent une autre voix ;).
Il y a peut-être un petit biais magnifique qui se cache derrière vos lobes frontaux xldiens ;)

PS: C'est plus par curiosité que par besoin
(car je sais traiter le problème comme dit dans mon premier message)
Je suis parti de ce code fonctionnel sur un Excel "anglophone"
sauf que mon Excel est francophone. (J'ai donc juste rajouté le Replace)
Mais j'essaie maintenant de m'en affranchir.
(Et je ne pense pas passer par une proc événementielle mais par une boucle sur une feuille sur laquelle j'aurai fait un Edition/Remplacer h par , avant de lancer la macro)

Code:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
 If Target.Count > 1 Then Exit Sub
 If Intersect(Target, Columns(1)) Is Nothing Then Exit Sub
 If Application.WorksheetFunction.IsNumber(Target) Then
 Application.EnableEvents = False
 Target = Evaluate("=dollarde(" & Replace(Target.Text, ",", ".") & ",60)")
 Application.EnableEvents = True
Else:
 Application.EnableEvents = False
 MsgBox "Saisie invalide" & vbCrLf & "Recommencer!", vbOKOnly + vbCritical, "ERREUR"
 Application.Undo
 Application.EnableEvents = True
 End If
End Sub
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Bonsoir à tous

Un petit up pour un petit biais ?

Personne n'a d'autres pistes ? (Juste pour nourrir ma curiosité ;) )

Voici ce que j'essaye de ne pas utiliser ;)
Code:
Sub Sexa2dec()
Dim c As Range
For Each c In Selection
    If Len(c) > 0 Then
        If InStr(c.Text, ":") Then c = c * 24
        If InStr(c.Text, ",") > 0 Then c = Evaluate("=dollarde(" & Replace(c.Text, ",", ".") & ",60)")
    End If
c.NumberFormat = "0.00"
Next c
End Sub
 

Si...

XLDnaute Barbatruc
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

salut

conversion heures séxadécimales en décimales, un essai :
Code:
Private Sub Worksheet_Change(ByVal R As Excel.Range)
 If R.Count > 1 Then Exit Sub
 If Intersect(R, [A:A]) Is Nothing Then Exit Sub
 Application.EnableEvents = 0
 If IsNumeric(R) Then
   R(1, 2) = Int(R) + (R - Int(R)) / 0.6
 Else
   MsgBox "Recommencer!", 16, "ERREUR, saisie invalide"
   Application.Undo
 End If
 Application.EnableEvents = -1
End Sub
 

Pièces jointes

  • Sexagésimal décimal.xls
    38 KB · Affichages: 35

Staple1600

XLDnaute Barbatruc
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Bonjour à tous

Merci Si... ;)
Cela fonctionne en cas de saisie

mais dans ma réalité laborieuse, je reçois des fichiers Excel non normés.
(Un coup des 05:30, un coup des 5h30, un coup des 5,3 ou même 5.3)
(Et j'ai abandonné depuis longtemps l'idée de demander aux "sources" de normaliser leur fichier)

Donc je traite les fichiers à leur réception.
(Selon les fichiers, je commence par un Edition/Remplacer volontairement manuel, puis ensuite je macrote)

Merci en tout cas de t'être arrêté ici. ;)
 

job75

XLDnaute Barbatruc
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Bonjour Jean-Marie, le fil,

Sélectionne la zone à convertir et lance cette macro :

Code:
Sub Heures()
'sélectionner la zone à convertir
Dim P As Range, nlig&, tablo, i%, j&, t$, x$, k%, y$, flag As Boolean
Set P = Intersect(Selection, ActiveSheet.UsedRange)
If P Is Nothing Then Exit Sub
nlig = P.Rows.Count
tablo = P.Resize(nlig + 1)
For i = 1 To UBound(tablo, 2)
  For j = 1 To nlig
    t = CStr(tablo(j, i))
    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 = "," Then
        If IsNumeric(Mid(t & 0, k + 1, 2)) Then
          flag = True
          y = ":" & Mid(t & 0, k + 1, 2)
          k = Len(t)
        End If
      End If
      x = x & y
    Next
    If flag Then flag = False: tablo(j, i) = x
  Next
Next
P.NumberFormat = "[h]:mm" 'ou "hh:mm" si ça suffit
P = tablo
End Sub
A+
 

Staple1600

XLDnaute Barbatruc
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Bonjour jo75 ;)

Merci de t'arrêter ici.
Bel ouvrage.

Mais le résultat doit être des heures décimales (pas de format heure)
Ex:
1h30 -> 1,5
1.15 ->1,25
02:30 -> 2,5

Car ensuite calculs à faire avec ces heures décimales.

Je mets le nez dans ton code pour voir où faire des modifs ;)
 

david84

XLDnaute Barbatruc
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Bonjour,
Je voudrais pouvoir utiliser =PRIX.DEC en VBA sans devoir me préoccuper du séparateur décimal.
pas trop compris l'intérêt mais si c'est pour s'amuser, à tester :
Code:
Sub test()
Dim s As String, x As Byte, y As String, z As String
s = "12,3"
x = InStr(1, s, ",")
y = Mid(s, x + 1, Len(s) - x)
z = Int(s) & "." & y
MsgBox Evaluate("=dollarde(" & z & ",60)")
End Sub
A+
 

Staple1600

XLDnaute Barbatruc
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Bonjour David84

EDITION: j'ai ajouté : Round(Evaluate("=dollarde(" & z & ",60)"), 2)
Cela me fait songer à un problème que je pourrai potentiellement rencontré
Un taux horaire 18,8*1,5=28.20 €
Selon les logiciels qui exportent ces données, ou selon l'opérateur qui saisit dans le fichier Excel.
Il peut arriver ceci:
1,518,8028,20 (dans le logiciel)
1,318,8028,20 (dans Excel)
1,328,20 (dans Excel)
ce qui implique que parfois il est possible qu'il y ait un mélange heure sexa et heure décimale
ce qui me mène vers cette question:
Comment savoir "automatiquement" si 13,25 c'est bien 13:25 et non pas pas 13:15 converti en décimale soit 13,25 ?
mais ceci sort du strict cadre d'une simple conversion sexagésimale/décimale


Oui c'est pour curieusement s'amuser ou pour curieusement découvrir d'autres façons de faire.
Les vôtres en l’occurrence ;)

Mais tout ceci au final me sera utile car de manière concrète je dois faire cette conversion horaire.
(Comme dit précédemment, je sais comment faire -> cf mes précédents message)

Mais simplement pour ma gouverne (et peut-être pour ceux qui passeront ici), j'aimerai voir comment vous faites pour convertir des heures sexagésimales en heures décimales
(les données étant dans des colonnes aléatoires avec des formats aléatoires* comme expliqué précédemment.)
*: 1.30 ou 25h30 ou 12:30 ou 5,15
NB: Je reçois ces fichiers et mes divers conseils de formatage sont purement ignorés.
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Re,

Alors cette macro :

Code:
Sub Heures_décimales()
'sélectionner la plage à 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
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
End Sub
Attention il ne faudra pas l'exécuter une 2ème fois sur la même plage...

Edit : j'avais interverti les déclarations de i et j.

A+
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Bonsoir job75

Je m'étais absenté pour cause de petite sortie restaurant.
Les galettes étaient bonnes
Ici ton code VBA me fait un parfait accompagnement pour un petit digestif ;)
Bref une soirée parfaite ;)

Bonne week-end à tous

PS
: Déjà que je perds du temps à normaliser les fichiers, donc ne t'inquiètes pas je n’exécuterai pas ta macro deux fois de suite.
Sauf peut-être en cas d'abus de digestif ;)
(Mais il est très rare que je dispose de tels breuvages sur mon lieu de travail)
Je pense adopter ton code en lieu et place de mon petit bricolage du message # 6 ;)
Merci à toi et à toux ceux qui passèrent dans ce fil, lecteurs comme contributeurs. ;)
 

job75

XLDnaute Barbatruc
Re : Conversion heures en heures décimales [SUGGESTIONS et AVIS demandés]

Bonjour Jean-Marie, le forum,

Sur Win XP - Excel 2003 j'ai testé la macro sur une colonne de 60000 cellules.

Durée d'exécution de 1,94 à 2,19 secondes suivant que les heures sont de 1 2 ou 3 chiffres.

PS : sur la dernière macro j'avais interverti les déclarations de i et j...

A+