Erreur date mal interprétée

Bonjour,

Je rencontre un soucis avec les dates par macro

j'ai un fichier temp et pour deux colonnes j'indique:

Application.ActiveWorkbook.Worksheets("Temp").Range("I1", "I" & derlign).NumberFormat = "dd/mm/yyyy"
Application.ActiveWorkbook.Worksheets("Temp").Range("L1", "L" & derlign).NumberFormat = "dd/mm/yyyy"

aussi et dans ce fichier temp les dates sont correctement interprétées

Ensuite j'exporte ces données dans un fichier tiers

tout fonctionne sauf les dates qui sont inversés

au lieu d'avoir le 01/03/2021 j'ai le 3 janvier

pourtant et comme vous pourrez le voir ci-dessous j'ai:

début = .ListColumns("Start_Date").DataBodyRange.Rows(i)

ceci étant dit j'ai un doute sur

début As Variant, fin As Variant,

mais si je mets as date alors erreur d'incompatibilité.

une idée svp?

Merci

Public Sub Reports()

 Dim tb_projects As ListObject
    Dim dic_statuts As Object, dic_projects As Object
    Dim i As Integer
    Dim PI_interne As String, Acronym As String, Topic As String, début As Variant, fin As Variant, commentaire As String, statut As String, chemin As String, fichier As String
    Dim Investigator_firstname As String, Investigator_name As String, Budget_Requested As Currency
    Dim id_projet As Variant, clé As Variant, Cancel As Boolean, iRow2 As Integer, sData As String, X As Integer, iRow1 As Integer, destination As String, S As String, Rep As String, Nom As String
    Dim wb As Workbook
    Dim project_Range As Variant

    Set dic_statuts = CreateObject("Scripting.Dictionary")
    Set tb_projects = [Temp].ListObject

    With tb_projects
        For i = 0 To .ListRows.Count
            id_projet = .ListColumns("Id_Project").DataBodyRange.Rows(i)
            Acronym = .ListColumns("Acronym").DataBodyRange.Rows(i)
            Topic = .ListColumns("Topic").DataBodyRange.Rows(i)
            début = .ListColumns("Start_Date").DataBodyRange.Rows(i)
            fin = .ListColumns("End_Date").DataBodyRange.Rows(i)
            commentaire = .ListColumns("Comments").DataBodyRange.Rows(i)
            statut = .ListColumns("Status").DataBodyRange.Rows(i)

Hello,

Test ton numberformat comme ceci :

NumberFormat = "m/d/yyyy"

Bonjour,

Essayer ceci

            début =CDate( .ListColumns("Start_Date").DataBodyRange.Rows(i))
            fin =CDate( .ListColumns("End_Date").DataBodyRange.Rows(i))

Avec

dim début as Date, fin as Date

Si il y a incompatibilité, cela signifie que pour la ligne i, les cellules "Start Date" et "End Date" ne contiennent pas de date mais du texte.

    

Bonjour,

Merci pour vos retours,

J'ai tenté votre approche Thev et me retourne avec l'erreur d'incompatibilité

Ceci étant cela m'échappe mais j'ai bien demandé lors de la création du fichier temp que les colonnes soit mise en format date:

la première concernant les start date et la deuxieme les end date

Application.ActiveWorkbook.Worksheets("Temp").Range("I1", "I" & derlign).NumberFormat = "dd/mm/yyyy"
Application.ActiveWorkbook.Worksheets("Temp").Range("L1", "L" & derlign).NumberFormat = "dd/mm/yyyy"

Aussi et meme si je verifie dans le fichier temp lui meme c'est bien en format date

A toutes fins utiles voici ma macro de création de fichier temp

Public Sub CustomTriFiltre()
Dim r As Range
Dim rngLstTri As Range
Dim derlign As Long

'Sheets.Add.Name = "Temp"
derlign = Sheets("Projects").Cells(Rows.Count, "A").End(xlUp).row

Sheets.Add.Name = "Temp"
Worksheets("Temp").Range("P2").Value = "Active"
Worksheets("Temp").Range("P3").Value = "Negociation"
Worksheets("Temp").Range("P4").Value = "Submitted"
Worksheets("Temp").Range("P5").Value = "Drafting"
Worksheets("Temp").Range("P6").Value = "Rejected"
Worksheets("Temp").Range("P7").Value = "Abandonned"
Worksheets("Temp").Range("Q2").Value = "Closed"

Sheets("Projects").Range("A1:N" & derlign).Copy
Sheets("Temp").Range("A1").PasteSpecial Paste:=xlPasteValues
Set r = Sheets("Temp").Range("A2:N" & derlign)
Set rngLstTri = Sheets("Temp").Range("P2", Sheets("Temp").Range("P2").End(xlDown))

    Application.AddCustomList (rngLstTri)
    ' on trie en fonction de la liste personnalisée
    Sheets("Temp").Sort.SortFields.Clear

       r.Sort key1:=[M2], order1:=1, ordercustom:=Application.CustomListCount + 1, _
           key2:=[G2], order2:=1

    Sheets("Temp").Sort.SortFields.Clear
    Application.DeleteCustomList Application.CustomListCount

    ' on  enlève ce qu'il y a en colonne filtre
    Sheets("Temp").Range("A1:N" & derlign).AutoFilter Field:=13, Criteria1:="<>" & Sheets("Temp").Range("Q2")

Sheets("Temp").ListObjects.Add(xlSrcRange, Range("A1:N" & derlign), , xlYes).Name = "Temp"
Application.ActiveWorkbook.Worksheets("Temp").Range("I1", "I" & derlign).NumberFormat = "dd/mm/yyyy"
Application.ActiveWorkbook.Worksheets("Temp").Range("L1", "L" & derlign).NumberFormat = "dd/mm/yyyy"
Reports
End Sub

Bonjour à tous

Aussi et meme si je verifie dans le fichier temp lui meme c'est bien en format date

Le format ne préjuge pas du type de donnée...

je viens d'ajouter la macro de fichier temp dans mon post précédent

je prends toutefois en compte de votre remarque mais alors comment vérifier le type de donnée?

RE

Dans Excel, élargir la colonne, alignement par défaut : si cela se cale à gauche... c'est du texte

Ou en sélectionner plusieurs et voir la barre d'état

En VBA IsDate(cells(5,1)) par exemple

merci hormis deux cellules tous se sont bien alignées à droite dans le tableau de départ

cependant dans le fichier temp généré avec tri semble lui avoir des problèmes surtout pour les dates de fin

pourtant quand je regarde ma macro (voir post précédent) je ne vois rien pouvant posé soucis

d'autant que j'indique pour ces colonnes qu'elles doivent etre en format date.je vais tenté toutefois d'enlever ce code sait on jamais

je n'arrive à rien alors voila des extractions

=> fichier projects c'est la base de laquelle proviens le temp

=> le fichier temp est créer apres filtration par statut

=> le fichier rapport est celui généré et présente les résultats

du fichier projects au temp les dates sont bien conservées mais lorsque je créer le fichier rapport cela bug

pourtant je ne vois pas d'ou le problème peut venir

la macro générant le rapport est situé dans un de mes premiers posts

5temp-projects.xlsx (16.43 Ko)
3temp-projects.xlsx (16.43 Ko)
4rapports.xlsx (12.81 Ko)

merci pour votre aide

RE

Tu as joint 2 fois le même fichier

  • La colonne L de temp-projects.xlsx contient plus de textes que de dates et il n'y a qu"une feuille
  • Dans rapport toutes ces End Date sont passées en texte

Pourquoi ne pas utiliser PowerQuery plutôt que VBA ?

oui oups ma faute voici le fichier oublié à savoir le fichier de base

Tu as joint 2 fois le même fichier

=> Oui c'est corrigé avec cet ajout

La colonne L de temp-projects.xlsx contient plus de textes que de dates et il n'y a qu"une feuille

=> Il n'y a qu'une feuille car c'est une extraction et j'ai juste copie l'onglet

comment corriger cela afin que les dates soit bien en format date car a priori le soucis vient de la

Dans rapport toutes ces End Date sont passées en texte

Pourquoi ne pas utiliser PowerQuery plutôt que VBA ?

=> c'est suite à une discussion ou les experts avait débattu et in fine on m'avait orienté vers vba lol

5projets.xlsx (14.07 Ko)

j'ajoute tout de meme que le probleme apparait surtout dans la colonne des dates de début

mais peut etre que le probleme initial vient de ma base projects du coup

RE

Comme déjà fit le format n'est que l'habit qui ne fait pas le moine

Dans projet les Start Date sont en date mais les End Date sont en partie texte en partie numérique comme ensuite dans Temp

Une date dans être de type date (en réalité numérique), le format n'est qu'un habillage : tu peux écrire toto dans une cellule et la mettre au format date. Totro restera un texte

TU n'a pas répondu concernant PowerQuery plus souple et plus simple que VBA

Re,,
merci pour votre retour.

J’ai bien cerné que le problème vient du type de donnée parfois en mode texte et d’autre date.

Dois je corriger cela dans le fichier projects qui est la source de tout ?
si oui comment procéder afin de changer le type et non la forme?

enfin si je vous avais répondu mais dans la citation désolé: => c'est suite à une discussion ou les experts avait débattu et in fine on m'avait orienté vers vba lol

Re

D'ou vient cette base ? Extraction ? Saisie ?

Re,

si vous faites référence à la base projet, c'est par saisie via des formulaires. je peux toutefois intervenir direct sur les enregistrements si nécessaire.

toutefois si je check l'enregistrement via form

j'ai

If (Initial_StartDate <> Project_Start_Date) Then
P_page.Cells(Match, 9) = Format(Project_Start_Date, "dd/mm/yyyy")
End If

du coup ca devrait bien etre un format date qui s'insère correctement

RE

Format formate la donnée en texte

https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/format-function-visual-basic-for-applications?f1url=%3FappId%3DDev11IDEF1%26l%3Dfr-FR%26k%3Dk(vblr6.chm1008925);k(TargetFrameworkMoniker-Office.Version%3Dv16)%26rd%3Dtrue

Bonjour et merci pour ce partage

néanmoins je ne suis pas sur de comprendre

l'objectif n'est pas de changer en texte mais en format date non?

j'ai corrigé tout dans la base.

toutes les dates sont correct y compris dans temp.

ceci étant dit le problème apparait toujours dans le rapport

comment une date correct dans temp peut etre inversée dans rapport?

exemple 01/03/2021 dans temp devient le 03/01/2021

voici en pièce jointes les extractions

apres lecture il apparait que le transpose pourrait altérer les jours et mois...

2rapport.xlsm (13.34 Ko)
3temp-projects.xlsx (16.49 Ko)
le process est le suivant

  Set dic_statuts = CreateObject("Scripting.Dictionary")
    Set tb_projects = [Temp].ListObject

    With tb_projects
        For i = 0 To .ListRows.Count
            id_projet = .ListColumns("Id_Project").DataBodyRange.Rows(i)
            Acronym = .ListColumns("Acronym").DataBodyRange.Rows(i)
            Topic = .ListColumns("Topic").DataBodyRange.Rows(i)
            début = .ListColumns("Start_Date").DataBodyRange.Rows(i)    If statut <> "Closed" Then
            If Not dic_statuts.exists(statut) Then Set dic_statuts(statut) = CreateObject("Scripting.Dictionary")
            Set dic_projects = dic_statuts(statut)
            dic_projects(id_projet) = Array(statut, Acronym, Topic, début, fin, commentaire, Investigator_firstname, Investigator_name, CLng(Budget_Requested))
            Set dic_statuts(statut) = dic_projects

            End If
    i = 0
        For Each clé In dic_statuts
            Set dic_projects = dic_statuts(clé)
            .Range("A4").Offset(i).Resize(dic_projects.Count, 9) = Application.Transpose(Application.Transpose(dic_projects.Items))
            i = i + dic_projects.Count
        Next clé

bon bah je pense avoir trouvé tout seul:

il me fallait ajouter .formulaLocal

.Range("A4").Offset(i).Resize(dic_projects.Count, 9).FormulaLocal = Application.Transpose(Application.Transpose(dic_projects.Items))

C'est bien le transpose qui posait soucis

Rechercher des sujets similaires à "erreur date mal interpretee"