Variable tableau et milliseconde

chax

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

  • Variable tableau milliseconde.xlsm
    14.9 KB · Affichages: 40

Dranreb

XLDnaute Barbatruc
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
VB:
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:

chax

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

eriiic

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

Dranreb

XLDnaute Barbatruc
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:

chax

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

mapomme

XLDnaute Barbatruc
Supporter XLD
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-Variable tableau milliseconde- v1.xlsm
    16.7 KB · Affichages: 37

Dranreb

XLDnaute Barbatruc
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.
 

Dranreb

XLDnaute Barbatruc
C'est effectivement le 1er cas que je vois où il faut obligatoirement utiliser Value2
VB:
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.
 

eriiic

XLDnaute Barbatruc
Pas bête le .value2, on y pense rarement.

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 ?
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
 

Discussions similaires

Réponses
25
Affichages
1 K

Statistiques des forums

Discussions
315 088
Messages
2 116 087
Membres
112 656
dernier inscrit
VNVT