1. Ce site utilise des "témoins de connexion" (cookies) conformes aux textes de l'Union Européenne. Continuer à naviguer sur nos pages vaut acceptation de notre règlement en la matière. En savoir plus.

Variable tableau et milliseconde

Discussion dans 'Forum Excel' démarrée par chax, 12 Janvier 2018.

  1. chax

    chax XLDnaute Nouveau

    Inscrit depuis le :
    29 Mai 2011
    Messages :
    16
    "J'aime" reçus :
    0
    Bonjour à tous
    J'ai un problème assez simple à expliquer mais pour lequel je ne trouve pas de solution

    1. J'ai une liste de dates en millisecondes (format jj/mm/aaaa hh:mm:ss,000)
    2. Je copie cette liste dans une variable tableau
    3. J'affiche dans un msgbox ou je copie sur une feuille Excel ma variable tableau => Problème : un arrondi est réalisé : le résultat obtenu est sous le format jj/mm/aaaa hh:mm:ss

    Question :
    Y a t-il un moyen de conserver le format jj/mm/aaaa hh:mm:ss,000 lorsque l'on utilise une variable tableau ?

    Merci pour votre aide
     

    Pièces jointes:

  2. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    12735
    "J'aime" reçus :
    752
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    Bonsoir.
    En fait l'information semble conservée exacte dans le tableau.
    C'est la conversion en texte d'un Variant/Date qui ne restitue pas les millièmes de secondes
    Code (Visual Basic):
    Sub Essai()
    Dim TEntré(), L As Integer, D As Double, TSorti() As String
    TEntré = ThisWorkbook.Sheets(1).Range("A1:A8").Value
    ReDim TSorti(1 To UBound(TEntré, 1))
    For L = 1 To UBound(TEntré, 1)
       D = TEntré(L, 1)
       TSorti(L) = Format(D, "dd/mm/yyyy hh:mm") & ":" & Format((D * 1440 - Int(D * 1440)) * 60, "00.000")
       Next L
    MsgBox Join(TSorti, vbLf)
    End Sub
     
    Dernière édition: 13 Janvier 2018
    chax aime votre message.
  3. chax

    chax XLDnaute Nouveau

    Inscrit depuis le :
    29 Mai 2011
    Messages :
    16
    "J'aime" reçus :
    0
    Bonjour,
    Merci beaucoup pour votre réponse.
    Cette méthode fonctionne très bien et permet de me débloquer dans mon projet.

    J'ai 2 questions complémentaires suite à votre réponse :
    1. Mon objectif final est d'utiliser certaines lignes de la variable tableau dans la plage de cellules d'une feuille Excel. Dans ce cas, est-on obligé passer par une conversion de la date en texte ? c'est-à-dire, le stockage dans une variable tableau est-il nécessairement réalisé sous forme de texte ?

    2. Avec la méthode ci-dessus, si j'affiche la variable tableau dans une plage de cellules (au lieu d'une msgbox) alors j'obtiens une chaine de caractères (cf. texte décalé vers la gauche). Pour autant, cela ne m'empêche pas de faire des opérations entre les lignes de cette plage. Comment cela s'explique t-il ?

    Merci d'avance
     
  4. eriiiic

    eriiiic XLDnaute Accro

    Inscrit depuis le :
    12 Juillet 2008
    Messages :
    1976
    "J'aime" reçus :
    115
    Utilise:
    Excel 2010 (PC)
    Bonjour,

    pour avoir des valeurs numériques dans tes cellules transmet leur la valeur en Double.
    Donc tu crées un autre tableau que tu alimentes ligne à ligne avec cdbl(ta_date_du_1er_tableau)
    Le format choisi sur la colonne fera le reste.

    2) excel interprète la chaine pour voir s'il peut convertir en numérique. Là il reconnait une date et l'évalue.
    eric
     
  5. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    12735
    "J'aime" reçus :
    752
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    Bonjour.
    C'est seulement pour l'afficher qu'on est obligé de convertir en String soit par CStr implicite ou explicite, soit par Format, une valeur numérique Double, Date ou Currency, parce que ce n'est qu'avec des caractères, donc du texte, qu'on peut les visualiser. Excel le fait de façon transparente via un format de cellule. Il vaut mieux éviter de renseigner des cellules par des expressions String si elles doivent y être enregistrées sous forme numérique.
     
    Dernière édition: 13 Janvier 2018
  6. chax

    chax XLDnaute Nouveau

    Inscrit depuis le :
    29 Mai 2011
    Messages :
    16
    "J'aime" reçus :
    0
    Bonjour,

    eriiiic :
    Si Excel interprète automatiquement la chaine et reconnait une date, quel est l'intérêt de créer une 2ème variable tableau ? c'est plus "propre" ? plus rapide ?

    Dranreb : si je comprend bien, les valeurs sont toujours sous format de date à l'intérieur de la variable tableau et ce n'est qu'à l'affichage msgbox (mise au format texte obligatoire) ou cellule (mise au format texte automatique) que l'on perd le format date ? Dans ce cas, pourquoi quand on met le format personnalisé "hh:mm:ss,000" sur la cellule, celui-ci perd tout de même le ",000" ?

    Merci
     
  7. mapomme

    mapomme XLDnaute Barbatruc

    Inscrit depuis le :
    1 Novembre 2011
    Messages :
    4647
    "J'aime" reçus :
    720
    Sexe :
    Masculin
    Habite à:
    Angers
    Utilise:
    Excel 2010 (PC)
    Bonjour chax, Dranreb,

    On peut aussi utiliser la propriété Value2 qui pour des dates, heures ou des Currency contient la valeur numérique (de type double) stockée par Excel. Pour illustrer, voir le fichier joint.
     

    Pièces jointes:

    chax aime votre message.
  8. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    12735
    "J'aime" reçus :
    752
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    Le format de cellule n'est généralement pas appliqué si la cellule contient une valeur String.
    La cellule affiche sa valeur String telle qu'elle est.
    Joignez ce que vous avez essayé, là je ne comprends pas bien vos questions.
    J'ai seulement défini un second tableau TSorti() As String pour pouvoir tout afficher à la fin avec une seule MsgBox.
     
  9. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    12735
    "J'aime" reçus :
    752
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    C'est effectivement le 1er cas que je vois où il faut obligatoirement utiliser Value2
    Code (Visual Basic):
    Sub Essai()
    Dim TEntré(), L As Integer, D As Double, TSorti() As String
    TEntré = ThisWorkbook.Sheets(1).Range("A1:A8").Value
    ReDim TSorti(1 To UBound(TEntré, 1))
    For L = 1 To UBound(TEntré, 1)
       D = TEntré(L, 1)
       TSorti(L) = Format(D, "dd/mm/yyyy hh:mm") & ":" & Format((D * 1440 - Int(D * 1440)) * 60, "00.000")
       Next L
    MsgBox Join(TSorti, vbLf)
    With ThisWorkbook.Sheets(1).Range("C1:C8")
       .Value2 = TEntré
       .NumberFormat = "dd/mm/yyyy hh:mm:ss.000"
       End With
    End Sub
    Bien vu mapomme.
     
  10. eriiiic

    eriiiic XLDnaute Accro

    Inscrit depuis le :
    12 Juillet 2008
    Messages :
    1976
    "J'aime" reçus :
    115
    Utilise:
    Excel 2010 (PC)
    Pas bête le .value2, on y pense rarement.

    Tout dépend si le contenu doit être utilisé de multiples fois, voire même par des formules matricielles, ou simplement lu.
    Une valeur numérique est prête à être utilisée sans besoin de l'interpréter à chaque fois. Les traitements de chaines sont toujours coûteux.
    Maintenant que tu peux le faire sans traitement supplémentaire avec .value2 ne te retiens surtout pas ;-)
    eric
     
  11. chax

    chax XLDnaute Nouveau

    Inscrit depuis le :
    29 Mai 2011
    Messages :
    16
    "J'aime" reçus :
    0
    Bonsoir,

    La méthode que vous venez de me proposer correspond exactement à ce que je souhaitais ; c'est en plus rapide et facile à mettre en oeuvre. C'est excellent !

    Merci à tous les 3
    Bonne soirée
     

Partager cette page