none
Inversion du jour et du mois dans une date sous Excel RRS feed

  • Question

  • Bonjour,

    Un de nos clients constate un problème sur une application qu'on lui a développé. Je n'arrive pas à reproduire son problème qui le suivant :

    Notre application va lire dans une base de donnée une serie de date et va les injecter dans un fichier Excel. Le problème apparait quand le jour est inférieur à 12. Dans ce cas le jour et le mois sont inversé dans le fichier Excel.

    J'ai donc envoyé une version du logiciel à notre client qui trace étape par étape la valeur de cette date et elle est conforme jusqu'à l'injection dans la cellule Excel et c'est à la relecture que le jour et la mois sont inversés.

    Pour cela j'utilise la classe : Microsoft.Office.Interop.Excel version 1.6.0.0 pour Excel 12.0 en C#

    J'ai essayé de forcer dans le format "jj/mm/aaaa" avec xlRange.NumberFormatLocal = "jj/mm/aaaa";

    Mais cela ne résout pas le problème.

    J'ai commencé des recherches sur internet et apparemment le même se produit chez certains utilisateurs de VBA sous Excel. Ce qui me laisse à croire que le problème est plutôt du coté de Excel que de notre logiciel.

    Avez-vous des informations à ce sujet ? une solution ? des tests qui pourraient être réalisé ?

    Je vous remercie d'avance

     

    lundi 24 janvier 2011 09:30

Toutes les réponses

  • Bonjour,

    Je vous invite à explorer sans garantie de réussite :(

    Pour ce qui est du fichier Excel, est-il généré par programmation ou démarrer-vous d'un modèle ? En ce cas, je vous proposerait de formater la cellule directement dans le modèle. c'est à dire que la cellule soit préformatée avec le format adéquat.

    Le problème pourrait être du aux options régionales sont elles différentes sur le poste hébergeant la Base de données et celui hébergeant Excel ? En d'autres termes est ce que tous est définit sur français - france y compris peut être la version de votre application Excel.

    Une date n'étant qu'un numéro de série, vérifier à quelle moment (étape) celui-ci est modifié.
    Pour le 01/02/2009 vous devriez avoir 39845 et non pas 39815 qui correspond au 02/01/2009.
     


    En espérant avoir pu rendre service (MehdiH)
    Retrouvez moi sur Office Users
    lundi 24 janvier 2011 10:34
  • Effectivement, c'est un test que j'ai demandé à notre client.

    Mettre la cellule dans le format spécifié. Sans succès. Puis insérer une date manuellement et là elle apparait dans le bon sens.

     

    Je lui ai également demandé de vérifier ces paramètres régionaux et tout est apparemment en français.

    La base de données est effectivement sur un PC différent mais mais la date apparait dans le bon sens lors de la lecture dans la BDD jusqu'a l'écriture dans le fichier Excel.

    Je lui ai envoyé une version du logiciel modifiée qui écrit dans un fichier texte la date lors des différentes étapes de la conversion.

    Elle apparait toujours dans le bon sens jusqu'à la relecture de la valeur dans le fichier Excel où elle est inversée.

    Merci pour votre réponse


     

     

     

    lundi 24 janvier 2011 13:38
  • Bonjour,
     
    Un problème ressemblant au votre m 'est arrivé,
    lors d 'une extraction d'une base de données tiers vers Excel.
    La date extraite de la base de donnée était extraite au format américain MJA
    (mois, jour, année).
    Lors de l'importation Excel essayait d'interpréter ce champ comme une date
    française (JMA).
    La date affichée 11/05/2010 dans l'application externe
    est exportée sous le format US MJA : 05/11/2010.
    Excel en l'important va l'interpréter comme une date
    française : 05/11/2010 : Il y a donc au final inversion
    entre le mois et la date.
     
    Ainsi même une date pouvant apparaitre exacte dans Excel
    pouvait être mal interprétée par Excel.
    Si une donnée ne peut pas être interprétée comme une date,
    cette donnée sera importée comme du texte
     
    Pour résoudre cela, je crois que j'avais importé via un fichier texte
    ( peut-être un txt ?) en précisant dans la boite de dialogue
    'Assistant importation' que ce champ date US était au format MJA.
     
    Une 2ième solution étant les données une fois importées
    d 'utiliser une fonction pour convertir les champs importés
    en date française.
     
    du type:
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Function Conv_Date_US_FR(X) As Date
    'X sur la feuille Excel représente une date US valide
    'soit sous format date soit sous format texte
    Dim Z
    'On Error GoTo Err_Conv_Date_US_FR
     
    If VarType(X) = vbString Then
     Z = Split(X, "/")
     Conv_Date_US_FR = DateSerial(Z(2), Z(0), Z(1))
       Exit Function
    Else
     Conv_Date_US_FR = DateSerial(Year(X), Day(X), Month(X))
     Exit Function
    End If
     
    'On retourne une erreur
    'Err_Conv_Date_US_FR:
    'Conv_Date_US_FR = 1 / 0
     
    End Function
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
     
    Une 3ième solution  (les données une fois importées),
    était de sélectionner les champs concernés et
    d 'utiliser 'Données Convertir' en précisant le format MJA
     
    Pour reproduire le Pb et tester les solutions
    créez un fichier texte DATEUS.TXT (MJA) avec les lignes
    01/02/2010
    01/13/2010
    12/11/2010
    06/23/2010
    puis ouvrez ou importer le dans Excel.
     
    J 'espère que cela va vous donner des pistes pour votre cas.
     
    ____________________________________________________________
    "ACELTIS" a écrit dans le message de groupe de discussion :
    51495244-e2d3-44f6-b70d-0eabd0424593@communitybridge.codeplex.com...
     
    Bonjour,
     
    Un de nos clients constate un problème sur une application qu'on lui a
    développé. Je n'arrive pas à reproduire son problème qui le suivant :
     
    Notre application va lire dans une base de donnée une serie de date et va
    les injecter dans un fichier Excel. Le problème apparait quand le jour est
    inférieur à 12. Dans ce cas le jour et le mois sont inversé dans le fichier
    Excel.
     
    J'ai donc envoyé une version du logiciel à notre client qui trace étape par
    étape la valeur de cette date et elle est conforme jusqu'à l'injection dans
    la cellule Excel et c'est à la relecture que le jour et la mois sont
    inversés.
     
    Pour cela j'utilise la classe : Microsoft.Office.Interop.Excel version
    1.6.0.0 pour Excel 12.0 en C#
     
    J'ai essayé de forcer dans le format "jj/mm/aaaa" avec
    xlRange.NumberFormatLocal = "jj/mm/aaaa";
     
    Mais cela ne résout pas le problème.
     
    J'ai commencé des recherches sur internet et apparemment le même se produit
    chez certains utilisateurs de VBA sous Excel. Ce qui me laisse à croire que
    le problème est plutôt du coté de Excel que de notre logiciel.
     
    Avez-vous des informations à ce sujet ? une solution ? des tests qui
    pourraient être réalisé ?
     
    Je vous remercie d'avance
     
     
    • Modifié CharAbeuh mardi 25 janvier 2011 07:37 moins confus
    mardi 25 janvier 2011 06:34
  • Bonjour,

     

    Donc notre cas la date est au format Français de bout en bout : dans la base de données, dans le logiciel, lors de l'envoi vers Excel.

    Et je spécifie à Excel de mettre la date au format Francais.

    voici le code :

     

    xlRange = (Range)xlSheet.Cells[ligne_dep, int
    
    .Parse(onglet.col_date)];
    xlRange.NumberFormatLocal = "jj/mm/aaaa"
    
    ;
    
    string
    
     iii = (DateTime.ParseExact(row["DateFin"
    
    ].ToString(), "dd/MM/yyyy HH:mm:ss"
    
    , CultureInfo.InvariantCulture)).ToString("dd/MM/yyyy HH:mm:ss"
    
    );
    xlRange.set_Value(Missing.Value, iii);
    
    

    Je ne comprends pas pourquoi elle se retrouve inversée dans la cellule Excel alors qu'à aucun moment cette date est au format US ...

    Je vous remercie pour votre réponse

     

    mardi 25 janvier 2011 15:22
  • Bonjour,

    Sous toutes reserves car je ne pas familier avec le langage que vous avez utiliser,

    il semble que vous convertisser la valeur en texte (ToString). Si cela est exacte pourquoi ne pas passer directement une date avec une instruction de type (ToDate)
     

     


    En espérant avoir pu rendre service (MehdiH)
    Retrouvez moi sur Office Users
    mardi 25 janvier 2011 15:33
  • Bonsoir,
     
    En cherchant sur Google, il a un vieil article MSDN qui traite des dates
    transmises à Excel.
    Notamment, semblerait-il, la nécessité de passer les dates en format string
    via le format US.
     
    Peut-être une autre piste pour vous ?
     
    Bon courage !
       ______________________________________________________________________________
    "ACELTIS" a écrit dans le message de groupe de discussion :
    8d97c061-6cba-4024-b8f5-c10bccf6ee35@communitybridge.codeplex.com...
     
    Bonjour,
     
    Donc notre cas la date est au format Français de bout en bout : dans la base
    de données, dans le logiciel, lors de l'envoi vers Excel.
     
    Et je spécifie à Excel de mettre la date au format Francais.
     
    voici le code :
     
    xlRange = (Range)xlSheet.Cells[ligne_dep, int .Parse(onglet.col_date)];
    xlRange.NumberFormatLocal = "jj/mm/aaaa" ; string iii =
    (DateTime.ParseExact(row["DateFin" ].ToString(), "dd/MM/yyyy HH:mm:ss" ,
    CultureInfo.InvariantCulture)).ToString("dd/MM/yyyy HH:mm:ss" );
    xlRange.set_Value(Missing.Value, iii);
     
    Je ne comprends pas pourquoi elle se retrouve inversée dans la cellule Excel
    alors qu'à aucun moment cette date est au format US ...
     
    Je vous remercie pour votre réponse
     
     
    mardi 25 janvier 2011 18:57
  • Avec le lien:
     
    _________________________________________________________________
    "CharAbeuh"  a écrit dans le message de groupe de discussion :
    aeb72dae-2405-4e1b-9f1a-8f2cd00c3296@communitybridge.codeplex.com...
     Bonsoir,
     
    En cherchant sur Google, il a un vieil article MSDN qui traite des dates
    transmises à Excel.
    Notamment, semblerait-il, la nécessité de passer les dates en format string
    via le format US.
     
    Peut-être une autre piste pour vous ?
     
    Bon courage !
      ______________________________________________________________________________
    "ACELTIS" a écrit dans le message de groupe de discussion :
    8d97c061-6cba-4024-b8f5-c10bccf6ee35@communitybridge.codeplex.com...
     
    Bonjour,
     
    Donc notre cas la date est au format Français de bout en bout : dans la base
    de données, dans le logiciel, lors de l'envoi vers Excel.
     
    Et je spécifie à Excel de mettre la date au format Francais.
     
    voici le code :
     
    xlRange = (Range)xlSheet.Cells[ligne_dep, int .Parse(onglet.col_date)];
    xlRange.NumberFormatLocal = "jj/mm/aaaa" ; string iii =
    (DateTime.ParseExact(row["DateFin" ].ToString(), "dd/MM/yyyy HH:mm:ss" ,
    CultureInfo.InvariantCulture)).ToString("dd/MM/yyyy HH:mm:ss" );
    xlRange.set_Value(Missing.Value, iii);
     
    Je ne comprends pas pourquoi elle se retrouve inversée dans la cellule Excel
    alors qu'à aucun moment cette date est au format US ...
     
    Je vous remercie pour votre réponse
     
    mardi 25 janvier 2011 21:07
  • Bonjour

    Une solution simple est de récupérer le no de série par clng(cdate(madate)) pour de l'écrire dans la cellule

    Il ne reste plus qu'à formater la cellule par Numberformat en dd/mm/yyyy

    vendredi 17 août 2018 11:31
  • Bonjour,

    Je me suis pas mal frotté il y a 15 ans à la gestion des dates dans une application internationale, c'était sous Access.

    J'en suis venu à la conclusion qu'il faut faire les échanges avec la base de données avec des fonctions comme SerialDate, qui reçoivent toujours leurs arguments dans le même ordre : année, mois, jour, heures, minutes, secondes.

    J'ai vu dans le fil évoquer des nombres série récupérés avec d'autres fonctions, à première vue il s'agit du même principe.

    Il faut donc passer le temps voulu sur la mise au point d'une fonction qui va préparer une requête par concaténation (les outils modernes proposent des solutions pour éviter ça mais je suppose que sous Excel il faudra bien en passer par là ; mais pour être franc ça fait dix ans que je ne touche plus à Excel).

    On peut avoir à concaténer les arguments pour faire appel à deux fonctions, une en syntaxe SQL pour appeler la base de données, une en syntaxe VBA pour récupérer le résultat. Et les deux s'appellent l'une l'autre, voire se génèrent l'une l'autre.

    Je pars du principe que le développeur de l'application va savoir se débrouiller tout seul comme un grand pour gérer les différents niveaux de guillemets que cela implique.

    Pour la mise en forme de la date pour affichage à l'utilisateur, il y a des chances que ça soit d'autant plus simple qu'il suffit de mettre la date dans une cellule et de gérer le format d'affichage de celle-ci. Mais il n'est pas exclu que j'aille un peu vite en besogne en disant ça si il y a à gérer des états par exemple. Le gros problème que posent les applications Office, c'est qu'elles ne lèvent pas une exception lorsqu'elles ne reçoivent pas les éléments de la date dans l'ordre attendu, et du coup ont une chance sur deux de retourner une date fausse.

    Par SerialDate (ou l'équivalent) ce problème ne devrait pas se poser, on sait à quelle date on a affaire, et du coup on n'a plus qu'à la mettre en forme selon le paramétrage de l'application.

    dimanche 19 août 2018 12:43
  • Ah il est vrai que le fichier Excel peut stocker des dates en interne.

    Il faut se demander si les dates qui posent problème ne proviennent pas d'un import, par exemple en CSV.

    Ce que j'ai dit au sujet des échanges SQL peut se redire, en le mettant en forme, des échanges CSV.

    dimanche 19 août 2018 12:59
  • Bonjour VG77.

    - Je vois que vous êtes "tout neuf" sur ce forum

    - Avez-vous conscience que vous répondez à une question posée il y a 7 ans, le 25 janvier 2011 ?

    Espérons qu'ACELTIS ait trouvé la solution depuis 7 ans.

    Bonne continuation sur le forum.


    Ex-helpeur de Community. Désormais sur http://dechily.org/Forum_Aski/

    dimanche 19 août 2018 15:34