XL 2016 Affichage "bizarre" dans une listbox

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 !

la bidouille

XLDnaute Nouveau
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
 

Pièces jointes

Solution
Bonjour.
Vous pouvez aussi appliquer :
Code:
=Accueil!$H$4/([@[Chrono Officiel]]*24000)
= 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.
 
Dernière édition:
Bonjour la bidouille, TooFatBoy, Bernard,

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
J'ai mis 11 colonnes pour la ListBox.

Je vous laisse en faire ce que vous voulez.

A+
 

Pièces jointes

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.
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 si, les colonnes 3 4 5 de la ListBox sont maintenant affichées correctement, c'est bien ce que vous vouliez !

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.
Bonsoir,

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.

Bonne soirée.
 
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
1744611800387.png


ps :je viens de me rendre compte que se sont mes vielles méthodes que tu utilise
 

Pièces jointes

Dernière édition:
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.
 

Pièces jointes

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
 
Bonjour,
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.
Vous pouvez mette en Chronos!D2 la formule :
Code:
=[@[Total pénalités]]*10/86400
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

Discussions similaires

Retour