IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème de date


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 44
    Par défaut Problème de date
    Bonjour,

    Je me permets de vous poser une nouvelle question puisque la dernière a trouvé réponse rapidement ici

    J'ai un fichier confidentiel excel (extraction de SAP) qui contient des dates au format JJ.MM.AAAA
    Je souhaite les changer au format JJ/MM/AAAA pour les coller dans un autre fichier.
    J'ai fait la manip à la main en utilisant CTRL+F et en faisant replace "." par "/". Elle marche mais si je fais la même chose sous VBA avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Range("A2").Select
        Selection.Replace What:=".", Replacement:="/", LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
    me transforme certaines dates en MM/JJ/AAAA et d'autres toujours en JJ/MM/AAAA

    pour illustrer ça je vous met en pièce jointe un petit fichier excel avec des valeurs factices.
    Vous pouvez tester avec cette petite macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Sub test()
     
    colonne = 2
    debut = 3
    fin = Cells(debut, colonne).End(xlDown).Row
     
    Range(Cells(debut, colonne), Cells(fin, colonne)).Select
    Selection.Replace What:=".", Replacement:="/", LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
    For i = debut To fin
        If Cells(i, colonne) <> Cells(i, colonne + 1) Then
            Cells(i, colonne + 2) = "ERREUR"
        End If
    Next i
     
    End Sub


    A noter que le fichier réel contient bien plus de colonnes.

    Comment faire ?


    merci d'avance !
    Fichiers attachés Fichiers attachés

  2. #2
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Par défaut
    Alors, soit tu utilises la fonction format soit tu rentres tes données dans une variable string et tu les traites en string pour les restituer dans une colonne qui a un format date

  3. #3
    Invité
    Invité(e)
    Par défaut
    bonjour,
    les date au format("jj.mm.yyyy") sont vue dans vb comme du texte:
    08.01.2013 serra vue comme 01/08/2013 et 31.12.2013 en 31/12/2013
    car il n'existe pas 31 mois dans l'année.
    vb cherche à convertir ton texte en date il ne sais pas faire la différence entre
    01 jour et 01 mois il vas au plus cours dans un ordre croissant de valeurs 01 jour, 08 mois et 2013 année!
    01.08.07 date réduite 01/07/2008!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A2") = CDate(Replace(Range("A2"), ".", "/"))

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 44
    Par défaut
    Merci rdurupt cela marche très bien effectivement !

    Par contre je t'avoue que je ne comprends pas trop. Si Replace(Range("A2"), ".", "/") me donne un string qui peut aussi bien m'avoir gardé la forme dd/mm/yyyy ou avoir changé en mm/dd/yyyy comment la fonction CDATE peut elle renvoyer la bonne date comme je la voulais ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    vb ne comprend que le grand Breton ou les date sont YYYY-MM-DD il ne tien pas compte des paramètres régionaux de Windows.
    "01/08/2013" c'est pas une date un point de vue VB. Cdate lui tien compte des paramètres régionaux et Cdate("01/08/2013") c'est bien une date valide.
    du reste:
    Cdate("01/08/2013") te donnera 01/08/2013.
    Cdate("2013/08/01") te donnera 01/08/2013.
    Cdate("2013-08-01") te donnera 01/08/2013.
    Dernière modification par Invité ; 29/08/2013 à 16h16.

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 44
    Par défaut
    ce que je ne comprends pas c'est que si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("A2").Value="01.08.2013"
    Range("A2") = CDate(Replace(Range("A2"), ".", "/"))
    alors comme Replace(Range("A2"), ".", "/") me renvoie le String "08/01/2013" c'est comme si je faisais CDATE("08/01/2013") donc il devrait me retourner 08/01/2013 certes bien au format date mais en tant que 08 janvier. Mais il me retourne (ce qui est bien ce que je voulais je te rassure) 01/08/2013
    A contrario si j'avais 11.08.2013 la fonction replace renvoie 11/08/2013 et CDATE ne change pas l'ordre cette fois-ci.
    Tu vois là où je bloque pour essayer de comprendre comment marche ta fonction ?

    Je me répète pour pas qu'il n'y ait de malentendu, Cdate(replace(...)) fait exactement ce que je veux c'est juste que je n'arrive pas à comprendre pourquoi et ça m'intrigue.

  7. #7
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Robert.
    Je ne crois plus qu'on puisse dire que vb ne comprend que le grand Breton.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    Sub Excel_et_DatesDeTypeString()
     
     Cells.Clear
     
    'VBA interprete bien les dates en tenant compte des parametres regionaux de Windows.
    'La preuve, si on demande a VBA de transformer "03/02/1997" en date,
    '1. soit avec la commande CDate
     
    result = CDate("03/02/1997")
    Range("B2").Value = result
     
     
     
    '2. soit en attribuant "03/02/1997" a une variable de type Date
     
    Dim maVar As Date
    Range("A3").Value = "'" & "03/02/1997"
    maVar = Range("A3").Value
    Range("B3").Value = maVar
     
     
    'On obtient bien "03/02/1997"
     
    'C'est Excel qui bizarrement interprete  mal les dates de format String en provenance de VBA.
     
    'Si on execute la commande suivante,
    Range("B4").Value = "03/02/1997"
     
    'ou bien
    Dim strV As String
    strV = Range("B3").Value '"03/02/1997"
    Range("B5").Value = strV
     
    'Excel ne tient pas compte des parametres regionaux
    'et s'imagine qu'il s'agit d'une date au format americain
    'et affiche "02/03/1997"
     
    'En consequence, en VBA, on ne doit jamais se permettre d'ecrire sur une feuille Excel une date de type String.
    'Toujours une date de type Date, soit avec une variable de type Date, soit avec la commande de conversion CDate.
     
     
    'Cela explique que la commande Replace suivante ne fonctionne pas, alors que Remplacer fonctionne parfaitement dans Excel:
    Range("A6").NumberFormat = "@"
    Range("B6").NumberFormat = "@"
     
    Range("A6").Value = "03.02.1997"
    Range("B6").Value = "03.02.1997"
     
    Range("B6").Select
        Selection.Replace What:=".", Replacement:="/", LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
    'On obtient 02/03/1997
    'Car Excel ne tient pas compte des parametres regionaux quand une date de type String provient de VBA.
     
     
    Range("c2") = "CDate(" & """03/02/1997""" & ")"
    Range("C3") = "Variable de type Date"
    Range("C4") = "String en provenance de VBA"
    Range("C5") = "Variable de type String"
    Range("C6") = "String en provenance de VBA"
     
    End Sub

  8. #8
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Citation Envoyé par EngueEngue Voir le message
    Alors, soit tu utilises la fonction format soit tu rentres tes données dans une variable string et tu les traites en string pour les restituer dans une colonne qui a un format date
    EngueEngue,
    Cette technique ne fonctionne que pour les jours entre 13 et 31, pas pour les jours de 1 a 12.

    Docmarti.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Sub Test3()
    Cells.Clear
    Range("A7:B8").Clear
     
    [B3] = "Quand on entre manuellement sur une feuille  01/08/2013 ou 31/08/2013, Excel interprete correctement la date."
     
    [B5] = "Quand il recoit les memes valeurs STRING au format jj/mm/AAAA en provenance de VBA, Excel se trompe toujours."
     
    [a7] = "01/08/2013": [B7] = " Erreur de Excel qui intervertit le jour et le mois"
     
     Debug.Print CDate("01/08/2013"); "VBA estime que c'est le 01 du "; Month(CDate("01/08/2013")); " ieme mois"
     
     
    [a8] = "31/08/2013": [B8] = "Erreur de Excel qui tente d'intervertir jour et mois, constate que le 8 du 31 ieme mois n'est pas une date. C'est donc du texte selon Excel."
     
     Debug.Print CDate("31/08/2013"); "VBA estime que c'est le 31 du "; Month(CDate("31/08/2013")); " ieme mois"
     
    [B10] = "En VBA, Il faut  convertir les dates de type STRING avec la commande Cdate avant de les envoyer dans une cellule d'une feuille Excel. "
     
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de date dans requête de màj imbriquée
    Par VirginieGE dans le forum Langage SQL
    Réponses: 11
    Dernier message: 20/07/2004, 15h34
  2. problème de date
    Par baboune dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 10/06/2004, 10h52
  3. Problème de date dans MONTHS_BETWEEN
    Par ghostlord79 dans le forum Oracle
    Réponses: 10
    Dernier message: 07/04/2004, 11h21
  4. Problème conversion date
    Par mat.M dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/03/2004, 15h05
  5. Encore un probléme de date avec TADO !
    Par bNoureddine dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/02/2004, 18h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo