Transformer nombre décimal en hh:mn en vba

  • Initiateur de la discussion Initiateur de la discussion fenec
  • 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 !

fenec

XLDnaute Impliqué
Bonjour le forum

Une fois de plus besoin de votre aide car je ne parviens pas à modifier mon code pour l'appliquer à une plage de cellule.
Comptant sur votre savoir je vous joint un fichier qui reprend ma problématique.
Cordialement,
Philippe.
 

Pièces jointes

Bonjour le fil, le forum,

Voyez le fichier joint et cette macro :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range, sep$, t
Set r = [B5:C35] 'cette plage doit être au format Texte
Set r = Intersect(Target, r)
If r Is Nothing Then Exit Sub
sep = Mid(0.1, 2, 1) 'séparateur décimal de l'ordinateur
Application.EnableEvents = False
On Error Resume Next 'sécurité
For Each r In r 'si entrées/effacements multiples
  t = Replace(Replace(r, ".", sep), ":", sep)
  t = Replace(Format(t, "00.00"), sep, ":")
  r = IIf(IsDate(t), t, "")
Next
If Target.Count = 1 Then If Target = "" Then Target.Select
Application.EnableEvents = True
End Sub
La plage B5:C35 doit être au format Texte.

Bonne journée.
 

Pièces jointes

Re,

Avec la macro précédente on pouvait parfois entrer des secondes, par exemple 18:15:30.

Pour les éviter utiliser :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range, sep$, t$, pos1%, pos2%
Set r = [B5:C35] 'cette plage doit être au format Texte
Set r = Intersect(Target, r)
If r Is Nothing Then Exit Sub
sep = Mid(0.1, 2, 1) 'séparateur décimal de l'ordinateur
Application.EnableEvents = False
On Error Resume Next 'sécurité
For Each r In r 'si entrées/effacements multiples
  t = Replace(Replace(Replace(r, ".", sep), ",", sep), ":", sep)
  pos1 = InStr(t, sep) 'position du 1er séparateur
  pos2 = InStr(pos1 + 1, t, sep) 'position du 2ème séparateur
  If pos2 > pos1 Then t = Left(t, pos2 - 1)
  t = Replace(Format(t, "00.00"), sep, ":")
  r = IIf(IsDate(t), t, "")
Next
If Target.Count = 1 Then If Target = "" Then Target.Select
Application.EnableEvents = True
End Sub
Fichier (2), voyez aussi la Workbook_Open dans ThisWorkbook.

J'ai mis une liste de validation en C1, c'est quand même plus propre.

Edit pour David : si l'on craint que l'utilisateur modifie le format Texte ou les formules, protéger la feuille après avoir déverrouillé toutes les cellules puis verrouillé les plages A5:A35 et D5: D35.

A+
 

Pièces jointes

Dernière édition:
Bonjour le forum, phlaurent55, Roland_M, JCGL, Job75, Regueiro

phlaurent55
Merci pour ton aide, je pense que Job75 à répondu à ton soucis.

Roland_M
Ton code corresponds à mon attente sauf que si je tape 7.3 il m’écrit 7 :3 mais pas 7 :30 et pour être franc ton code je ne le comprends pas avec tes $, @, %.

JCGL
J’ai testé ta solution mais le problème reviens au code de phlaurent55 si je tape 7.30 ca me met 7.12.

Job75
Comme toujours ca fonctionne.
Bien vu la liste déroulante c’est vrai que c’est plus propre je ne sais pas pourquoi j’ai mis un format de contrôle d’ailleurs. Je me complique la vie parfois.

Regueiro
Une autre façon de faire, encore plus paresseux que l’âne même pas un point à taper LOL.

Un grand merci à vous tous, bonne soirée.
Cordialement,
Philippe.
 
re

tu dis: pour être franc ton code je ne le comprends pas avec tes $, @, %.

c'est pourtant simplissime !

A$ est idem à Dim A As String
A% est idem à Dim A As Integer
@ c'est une valeur currency

il y a encore d'autres, un peu de recherche te renseignerait

quand au 7:30 il est facile de modifier le format !

voir ceci:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B5:C35")) Is Nothing Then
   Application.EnableEvents = False
   R$ = Replace(Target, ",", ".")
   V@ = Val(R$)
   H% = Int(V)
   M$ = Str(V - H): M$ = Trim(Replace(M$, ".", ""))
   If Len(M$) < 2 Then M$ = M$ & "0"
   Target = Str(H) & ":" & M$
   Application.EnableEvents = True
End If
End Sub
 
Dernière édition:
Bonjour le forum,
Avançant dans ma feuille de pointage, je reviens vers vous car je rencontre un problème avec mes heures de nuit.
je ne comprends pas pourquoi elles ne se comptabilisent plus, du coup mes heures de jours sont fauusent.
Vous seriez gentil pour m'aider sur ce point
Vous joint un fichier de ou j'en suis.
Cordialement ,
Philippe.
 

Pièces jointes

Bonjour,

c'est normal tes cellules ne sont pas au bon format pour qu'Excel puissent effectuer un calcul temps !
tu as même des format texte alors ... rien ne va plus !

essaies ceci en format personnalisé dans toutes tes cellules horaires et verras apparaître les résultats !
[h] : mm
 
- 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

Discussions similaires

Réponses
10
Affichages
338
Retour