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 !
Bonjour à toutes et tous .
Pour un projet de comptage de chrono, j'ai adapté un fichier simple qui fonctionne. Toutefois même si les cellules sont en format hh:mm:ss, l'affichage dans ma listbox en reconverti en chiffre valeur comme 2.45633218985263. Qui pourrait me solutionner cette anomalie par un code VBA dans mon fichier. Pour info, je suis un papy bidouilleur d'occasion et presque nul en informatique... Mais une explication serait la bienvenue pour comprendre la correction.
Grand merci par avance
= Distance en mètres à parcourir / (durée en jours × nombre d'heure dans un jour × nombre de mètres dans un km)
Format Standard.
(Rappel : Les durées et instants affichées par formats d'heures ou de dates sont en réalité toujours stockées en jours.)
Bonjour.
Les instructions qui chargent les textes :
VB:
For I = 1 To UBound(BD)
For C = 1 To NbCol
Select Case C: Case 3, 4, 5: Tbl(I, C) = Format(BD(I, C), "h:mm:ss"): Case Else: Tbl(I, C) = BD(I, C): End Select
Next C, I
Un format de cellule ne corrige jamais le type de donnée de sa valeur, il décide seulement de la façon dont elle y est affichée. Or une valeur dont l'affichage relève d'un format d'heure est en réalité une durée en jours.
Je ne comprends rien à ce que vous voulez faire avec votre macro UserForm_Initialize alors je l'ai remplacée par :
VB:
Private Sub UserForm_Initialize()
Dim i&, j%
BD = [TabChrono].Resize(, 11).Value2
For i = 1 To UBound(BD)
For j = 3 To 5
BD(i, j) = Format(BD(i, j), "hh:mm:ss")
Next j, i
ListBox1.List = BD
End Sub
Bonjour.
Les instructions qui chargent les textes :
VB:
For I = 1 To UBound(BD)
For C = 1 To NbCol
Select Case C: Case 3, 4, 5: Tbl(I, C) = Format(BD(I, C), "h:mm:ss"): Case Else: Tbl(I, C) = BD(I, C): End Select
Next C, I
Un format de cellule ne corrige jamais le type de donnée de sa valeur, il décide seulement de la façon dont elle y est affichée. Or une valeur dont l'affichage relève d'un format d'heure est en réalité une durée en jours.
Bonjour Dranreb et merci de s'être penché sur mon problème d'affichage. Malheureusement comme préciser auparavant, je suis un peu nul en informatique et plus encore en VBA... donc je prend bien votre correction mais ne sais pas trop ou la mettre dans le code de mon fichier... J'ai bien essayer a différent endroit mais rien ne change. Est-il possible que vous me l'insériez dans mon fichier et me le renvoyer en lien ? J'ignore si la procédure est "correcte" sur le forum mais pour moi c'est la facilité d'usage et la finalité d'un fichier opérationnel.
Grand Merci a vous.
Pour expliquer l'affichage "bizarre" : dans la ListBox les heures s'affichaient au format Scientifique 4,40277777777778E-02
mais on ne voyait pas E-02.
Pour expliquer l'affichage "bizarre" : dans la ListBox les heures s'affichaient au format Scientifique 4,40277777777778E-02
mais on ne voyait pas E-02.
Merci Job75... Mais, ... vos réponses sont certainement très bonnes, mais le fait que je suis nul en VBA et en informatique en général, je ne sais pas trop ou mettre vos formules. Aussi le fait d'avoir remplacer, modifier le Private sub Userform_initialize, plus rien ne fonctionne. Je suis donc pas plus avancé qu'auparavant.
Ben non, je ne peux plus ouvrir mon fichier ... en tout cas cela ne fonctionne pas chez Moi.
J'ai donc repris mon fichier originel et essayer d'adapter votre code mais vu mon niveau, soit ça me met des erreurs de compilation, soit je ne peux plus ouvrir le fichier... mais dans tous les cas l'affichage reste en format scientifique.
Joignez peut être le fichier tel que vous l'avez corrigé selon nos indications, peut être qu'on pourra vous dire où votre inexpérience à engendré des incohérences, ce qui pourrait la réduire … Mais, n'était-ce donc pas vous qui aviez écrit le code originel ?
Ben non, je ne peux plus ouvrir mon fichier ... en tout cas cela ne fonctionne pas chez Moi.
J'ai donc repris mon fichier originel et essayer d'adapter votre code mais vu mon niveau, soit ça me met des erreurs de compilation, soit je ne peux plus ouvrir le fichier... mais dans tous les cas l'affichage reste en format scientifique.
Tu aurais dû anonymiser les données de ton fichier "Originel". Pour avoir du code par rapport à ce qu'il y a dans ce fichier (données, format et structure). Ce qui t'aurait évité les plantages que tu rencontres.
Bonjour
c'est un peu le désavantage d'utiliser le raccourci
VB:
BD = Range(NomTableau).Resize(, NbCol + 1).Value ' Array: + rapide
car ce tableau va contenir des éléments textes et numérique donc vba va le prendre comme array texte par defaut
donc
ton erreur était de mettre cdate a toute les colonnes dans ton code
alors que seules les colonnes 3,4,5 en avait besoins
ça fait parti des erreurs qu'énigmatiquement VBA ne relève pas
car en effet quand le nombre est trop grand ou trop de décimales
il affiche ces nombres au format scientifique
parti de la comme vba l’interprète comme du texte puisqu'il y a des lettres
donc cdate sur une chaine qui n'est pas au format numérique ou"xx/xx/xxxx" ben ça ne peut pas marcher
par contre ( et c'est là que c'est énigmatique)des que la valeur sont DANS !!! le tableau(tbl) vba le relis comme un numérique quand elles le sont
c'est donc après qu'il faut le retransformer
Code:
Dim Tbl(): ReDim Tbl(1 To UBound(BD), 1 To NbCol + 1)
For i = 1 To UBound(BD)
For c = 1 To NbCol
Tbl(i, c) = BD(i, c)'on met les valeurs comme tel'
'conversion pour les timeline avec cdate(colonne 3,4,5)
If c >= 3 And c <= 5 Then Tbl(i, c) = CDate(Tbl(i, c))
Next c: 'on le met comme tel
Tbl(i, c) = BD(i, NbCol + 1) 'je sais pas a quoi ça sert
Next i
TriMultiCol Tbl, 1, LBound(Tbl), UBound(Tbl)
Me.ListBox1.List = Tbl
réactive ton xlp.xlam dans les références j'a"i du le déréférencer car je n'ai pas ce complément
ps :je viens de me rendre compte que se sont mes vielles méthodes que tu utilise
Bonjour
c'est un peu le désavantage d'utiliser le raccourci
VB:
BD = Range(NomTableau).Resize(, NbCol + 1).Value ' Array: + rapide
car ce tableau va contenir des éléments textes et numérique donc vba va le prendre comme array texte par defaut
donc
ton erreur était de mettre cdate a toute les colonnes dans ton code
alors que seules les colonnes 3,4,5 en avait besoins
ça fait parti des erreurs qu'énigmatiquement VBA ne relève pas
car en effet quand le nombre est trop grand ou trop de décimales
il affiche ces nombres au format scientifique
parti de la comme vba l’interprète comme du texte puisqu'il y a des lettres
donc cdate sur une chaine qui n'est pas au format numérique ou"xx/xx/xxxx" ben ça ne peut pas marcher
par contre ( et c'est là que c'est énigmatique)des que la valeur sont DANS !!! le tableau(tbl) vba le relis comme un numérique quand elles le sont
c'est donc après qu'il faut le retransformer
Code:
Dim Tbl(): ReDim Tbl(1 To UBound(BD), 1 To NbCol + 1)
For i = 1 To UBound(BD)
For c = 1 To NbCol
Tbl(i, c) = BD(i, c)'on met les valeurs comme tel'
'conversion pour les timeline avec cdate(colonne 3,4,5)
If c >= 3 And c <= 5 Then Tbl(i, c) = CDate(Tbl(i, c))
Next c: 'on le met comme tel
Tbl(i, c) = BD(i, NbCol + 1) 'je sais pas a quoi ça sert
Next i
TriMultiCol Tbl, 1, LBound(Tbl), UBound(Tbl)
Me.ListBox1.List = Tbl
réactive ton xlp.xlam dans les références j'a"i du le déréférencer car je n'ai pas ce complément Regarde la pièce jointe 1216416
ps :je viens de me rendre compte que se sont mes vielles méthodes que tu utilise
Bonjour Patrick
Grand merci pour toutes tes explications (même si j'ai pas tous compris)
en fait je suis nul en informatique et en VBA, mais j'arrive en général a adapter pour mes besoins sporadiques un vieux fichier récupéré sur internet. Le coté "base de données" avec aide d'écriture par textboxs me va très bien, mais parfois l'adaptation comme dans le cas présent est un peu difficile pour mes connaissances. J'ai donc repris ton exemple qui fonctionne pour les affichages mais pour une raison que j'ignore apporte quelques perturbations mineures ailleurs (au niveau enregistrement et copie de lignes en double.... En fait avec les différentes solutions glanées, j'ai enfin pu résoudre la totalité des problèmes pour l'exécution de mon fichier et donc, ... pour moi c'est une affaire résolue. Je met le fichier complet en lien car j'aimerai y ajouter une fonction mais la aussi, je ne trouve pas la formule à insérer .
Il s'agit de calculer un temps de pénatité en seconde ( 10 secondes par pénalité) et transposer ce temps dans la colonne temps pénalité afin que le calcul du temps officiel soit fait automatiquement . C'est à dire cellule colonne D reçoit le résultat de cellule colonne K multiplié par 10 secondes.
Soit, comment multiplier un chiffre simple par des secondes pour obtenir un résultat en h:mm:ss. Si la réalisation est possible cela m'éviterait de rentrer manuellement les temps de pénalités.
Je mettrais le cas résolu dans quelques jours pour savoir si ma demande ci dessus en faisable.
Bien cordialement et encore grand merci à tous les intervenants.
perso a part les sub de tri je changerais tout
par exemple pour le problème de temps je le fera"is directement dans BD qui est un variant tableau et contient le tableau de la feuille
exemple
bref je commencerais comme ça
VB:
Private Sub UserForm_Initialize()
NomTableau = "TabChrono" ' à Adapter
NbCol = Range("TabChrono").Columns.Count
BD = Range(NomTableau).Resize(, NbCol + 1).Value ' Array: + rapide
For i = 1 To UBound(BD) '
BD(i, UBound(BD, 2)) = i ' index de ligne dans la colonne ajoutée
For c = 3 To 5
BD(i, c) = CDate(BD(i, c)) ' tant qu'a faire on fait tout de suite la conversion decimale to time puisque l'on fait déjà une boucle pour la colonne indexation de ligne
Next c
Next i
BD(1, UBound(BD, 2)) = "Ligne"'on ajoute l'entete de la colonne supplementaire d'indexation
'parti de la tu a le tableau complet avec les valeur temps en bon et due forme et la colonne des numeros de ligne
Me.ComboTri.Column = Range(NomTableau & "[#HEADERS]").Resize(, NbCol + 1).Value
Il s'agit de calculer un temps de pénatité en seconde ( 10 secondes par pénalité) et transposer ce temps dans la colonne temps pénalité afin que le calcul du temps officiel soit fait automatiquement . C'est à dire cellule colonne D reçoit le résultat de cellule colonne K multiplié par 10 secondes.
- 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