Problème de conversion de dates via VBA

Salutations,

Je suis face à un problème qui à l'air con comme ça, mais j'ai passé toute l'après midi dessus, sans succès.

Je bosse sur un tableau qui analyse les commandes en retard de notre ERP. L'ERP sort automatiquement un tableau excel, dans le quel les dates sont enregistré en format texte, comme ci-dessous :

9/10/2009 00:00:00
20/10/2010 00:00:00
13/02/2018 00:00:00

(oui, nous avons de gros retards !)

Je copie-colle le tout dans un nouveau tableau via une macro VBA pour tout mettre en page. Afin de pouvoir traiter ces dates comme des dates, j'ai intégré dans mon code vba un remplacement, comme suit :

Selection.Replace What:=" 00:00:00", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False

Le résultat semble parfait :

9/10/2009
20/10/2010
13/02/2018

Toutes les dates ayant moins de 13 jours deviennent des dates correctes. Par contre, toutes les autres (J13-J31) restent en format texte, et restent inutilisables. J'en déduis que lors de la conversion, Excel s'embrouille avec le format US et EU.

Ce que je ne pige pas, c'est qu'en faisant le remplacement des " 00:00:00" manuellement, via Ctrl+F, la conversion se passe correctement.

(en gros, je remplace le " 00:00:00" par rien, sur toute la plage de données)

Pourquoi ça ne passe pas en VBA ? Que pourrais-je faire pour régler le problème ?

J'aimerais éviter de devoir faire une loop à travers toutes les dates pour les convertir une par une..

Les dates alignées sur la droite sont bonnes. Celles alignées sur la gauche sont buguées

Je vous remercie d'avance pour toute aide.

Bonjour,

Essaie ceci :

Sub TestDate()
    Dim c As Range, Plg As Range
    With ActiveSheet
        Set Plg = .Range("B4:B" & .Range("B" & .Rows.Count).End(xlUp).Row)
    End With
    Application.ScreenUpdating = False
    For Each c In Plg
        If IsDate(Trim(Replace(c, "00:00:00", ""))) Then
            c = DateValue(Trim(Replace(c, "00:00:00", "")))
        End If
    Next c
    Plg.NumberFormat = "dd/mm/yyyy"
End Sub

Revoir s'il y a lieu la définition de la plage à convertir...

Cordialement.

Merci pour la réponse rapide.

Je teste ça demain au petit matin, je n'ai pas accès au fichier d'ici.

bonjour

salut MFerrand

Excel sait lire les extractions d'ERP (xls, csv, txt... ) et peut même lire l'ERP directement si on lui laisse l'autorisation

sans VBA, donc sans soucis

https://www.youtube.com/watch?v=gwW2CDdvUUs

Bonjour,

Essaie ceci :

Sub TestDate()
    Dim c As Range, Plg As Range
    With ActiveSheet
        Set Plg = .Range("B4:B" & .Range("B" & .Rows.Count).End(xlUp).Row)
    End With
    Application.ScreenUpdating = False
    For Each c In Plg
        If IsDate(Trim(Replace(c, "00:00:00", ""))) Then
            c = DateValue(Trim(Replace(c, "00:00:00", "")))
        End If
    Next c
    Plg.NumberFormat = "dd/mm/yyyy"
End Sub

Revoir s'il y a lieu la définition de la plage à convertir...

Cordialement.

Ca marche impec, et c'est rapide !

Bon, j'comprend toujours pas pourquoi ça ne passait pas avec mon code, mais le principal c'est que ça fonctionne.

Merci pour le coup de main, en tout cas !

Bonjour,

Sans conversion explicite, VBA reconnaît les dates selon le format américain, donc il ne convertissait pas les dates non reconnues selon un format mm/jj/aaaa, et elle demeurait en texte.

L'utilisation d'une fonction de conversion force la reconnaissance selon les paramètres régionaux système...

Cordialement.

Rechercher des sujets similaires à "probleme conversion dates via vba"