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 :

[VBA-E] Converstion auto multiformats de dates


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 38
    Par défaut [VBA-E] Converstion auto multiformats de dates
    Bonjour,

    J'ai un classeur Excel avec de nombreuses feuilles, chacune d'entre elles comprenant de très nombreuses données (chiffres, dates, etc.).

    J'aimerais concevoir une petite macro permettant d'harmoniser le format des dates présentes sachant, et c'est là que je coince que j'ai des dates aussi bien en français qu'en anglais et qu'Excel ne reconnait visiblement pas l'anglais.

    Quelques exemples de dates présentes :

    17May07 --> ne reconnaît pas
    11Mar07 --> il reconnaît, normal, Mars commence pareil dans les 2 langues
    11/02/07 --> ok
    11/03/2007 --> ok

    Que puis-je faire ?

    Merci

  2. #2
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    et ces dates elles viennent d'ou ..?

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LaDate = CDbl(CDate("11/03/2007"))
    LaDateFormatée = Format(LaDate, "ddmmmmyyyy")
    Quelque soit la langue, VBA traduira
    Maintenant, si tu veux l'avoir en anglais dans une version française, tu dois faire un tableau de correspondance et l'appliquer au N° du mois de ta date
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LeMois = array("","Jan", "feb", "mar", "apr", "may","jun","jul"...)
    LaDateFormatée = Format(LaDate, "dd") & LeMois(Month(Ladate)) & Format(LaDate,"yyyy")
    Edit
    Comme ta question est "à l'envers" de ce que je te propose, tu découpes ta date en testant les caractères pour identifier le mois et, d'après le mois en anglais, tu peux retrouver l'index du tableau qui correspond au mois... et donc reconstituer la date

    Tiens, amuse-toi
    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
    Sub DateFormatSelonLaLangue()
    LaDate = CDbl(CDate("11/05/2007"))
    LaDateFormatée = Format(LaDate, "ddmmmmyyyy")
    MsgBox LaDateFormatée
    LeMois = Array("", "Jan", "feb", "mar", "apr", "may", "jun", "jul")
    LaDateFormatée = Format(LaDate, "dd") & LeMois(Month(LaDate)) & Format(LaDate, "yyyy")
    MsgBox LaDateFormatée
    For i = 1 To Len(LaDateFormatée)
        If Asc(Mid(LaDateFormatée, i, 1)) > 57 Then
            m = Mid(LaDateFormatée, i, 2)
            Exit For
        End If
    Next
    For j = 0 To UBound(LeMois)
        If LCase(LeMois(j)) = LCase(Mid(LaDateFormatée, i, 3)) Then Exit For
    Next
    LaDateFormatée = Left(LaDateFormatée, i - 1) & "/" & j & "/" & Mid(LaDateFormatée, i + 3, Len(LaDateFormatée) - i - 2)
    LaDateFormatée = Format(LaDateFormatée, "ddmmmyyyy")
    MsgBox LaDateFormatée
     
    End Sub
    N'oublie pas de déclarer les variables

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 38
    Par défaut
    Les dates viennent d'une extraction spéciale sur laquelle je ne peux pas agir, je ne peux donc pas modifier le format à la source.

    boudiou, ça c'est du code

    Je vais essayer de comprendre tout ça

    Merci et...à bientôt je sens vu ce que je vois

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Il n'y a que le tableau et les dernières lignes de code qui t'intéressent
    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
    Dim LaDateFormatée, i as byte, LeMois()
    LeMois = Array("", "Jan", "feb", "mar", "apr", "may", "jun", "jul") 'etc
    LaDateFormatée = Cells(NoLigne,NoCol) 'je récupère la date en anglais
    For i = 1 To Len(LaDateFormatée )
     
        'je vérifie si c'est un chiffre ou un caractère
        If Asc(Mid(LaDateFormatée, i, 1)) > 57 Then 'C'est un caractère, je sors
            Exit For
        End If
    Next
    For j = 0 To UBound(LeMois)
        If LCase(LeMois(j)) = LCase(Mid(LaDateFormatée, i, 3)) Then Exit For
    Next
    For j = 0 To UBound(LeMois)
        If LCase(LeMois(j)) = LCase(Mid(LaDateFormatée, i, 3)) Then Exit For
    Next
    LaDateFormatée = Left(LaDateFormatée, i - 1) & "/" & j & "/" & Mid(LaDateFormatée, i + 3, Len(LaDateFormatée) - i - 2)
    Cells(NoLigne,NoCol) = Format(LaDateFormatée, "ddmmmyyyy")
    Et tu passes à la date suivante
    Tu pourrais aussi passer la date lue dans la cellule en paramètre à cette sub
    Ou tu pourrais en faire une fonction qui retourne la date re-formatée à substituer à la date lue dans la cellule... etc

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 38
    Par défaut
    Bon, autant être franc...je suis largué

    Je sais, je sais mais ça dépasse de nettement ce que j'ai l'habitude de faire.

    1) En essayant ton code, Excel me dit qu'il y a un bug à cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LaDateFormatée = Left(LaDateFormatée, i - 1) & "/" & i & "/" & Mid(LaDateFormatée, i + 3, Len(LaDateFormatée) - i - 2)
    2) D'autre part, je ne vois pas comment bien l'exploiter

    Ce que je souhaite effectivement, c'est que toutes les dates "bizarres" des lignes 8 à 11 de chaque feuille de mon classeur soient remplacées, sachant qu'il y en a plusieurs par lignes...je ne sais pas si c'est faisable ?

    Désolé d'être long à la détente, j'apprends

    Au pire

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Désolé, je n'avais pas vu que tu étais en panne.
    L'erreur sur la ligne : Si tu as une erreur, c'est qu'il te manque une référence dans VBA. Vas dans l'éditeur VB -> Outils -> Références
    Si tu as une référence marquée "MANQUANT"... elle manque. Sans doute un ocx.
    Tu dis
    A+

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Hello,
    J'ai corrigé le code... A vouloir répondre trop vite, on se ramasse.
    J'avais oublier la boucle correspondant au mois... et comme pour mon test j'utilisais la date d'aujourd'hui, que i correspondait toujours à 3 pour le prmier caractère rencontré, j'avais mars et j'étais content
    J'avais oublié la boucle permettant de retrouver le mois dans le tableau "LeMois" et donc l'index du mois
    Pour me faire pardonner, j'ai fait ça
    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
    Sub Formater()
    Dim Wk As Workbook
    Dim Ws As Worksheet
    Dim Plage As Range
        Set Wk = Workbooks("Classeur1")
        Set Ws = Wk.Worksheets("Feuil1")
        Set Plage = Ws.Range("A1:A11")
        For Each Cel In Plage
            Cel.Value = DateFormatee(Cel.Value)
        Next
    End Sub
     
    Function DateFormatee(Ad As String) As Date
    Dim LaDateFormatée As String, i As Byte, LeMois(), j as Byte
    LeMois = Array("", "Jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "now", "dec") 'etc
        If Trim(Ad) = "" Or IsDate(Ad) Then
            DateFormatee = Ad
            Exit Function 'La date est en français, on sort avec la date lue
        End If
        LaDateFormatée = Ad 'je récupère la date en anglais
        For i = 1 To Len(LaDateFormatée)
            'je vérifie si c'est un chiffre ou un caractère
            If Asc(Mid(LaDateFormatée, i, 1)) > 57 Then 'C'est un caractère, je sors
                Exit For
            End If
        Next
        For j = 0 To UBound(LeMois) 'recherche dans LeMois le N° du mois anglais
            If LCase(LeMois(j)) = LCase(Mid(LaDateFormatée, i, 3)) Then Exit For
        Next
        'on a le mois (j) on reconstitue la date au format "j/m/a"
        LaDateFormatée = Left(LaDateFormatée, i - 1) & "/" & j & "/" & Mid(LaDateFormatée, i + 3, Len(LaDateFormatée) - i - 2)
        'On formate la date au format voulu
        DateFormatee = Format(LaDateFormatée, "dd mmm yyyy")
    End Function
    Bref, fais un essai et tiens-moi au courant.

    Edit
    En discutant de ton problème avec bbil, on a pensé que tu pouvais avoir mélangé dans une colonne une date au format français "normal" et d'autre en anglais.
    J'ai donc ajouté un test sur la date lue et exclus de l'analyse les dates en français pour ne traiter que les dates en "étranger"

    Encore une remarque : Excel n'accepte pas le format jjmmmyyyy comme une date. Pour que la date soit prise comme telle, le format doit être un format de date jj mmm yyyy ou jj/mm/yy ou ce que tu veux mais une date.
    Bref, j'ai apporté une autre correction au code

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 38
    Par défaut
    Re-coucou

    Bon, j'ai pu tester le code que tu as écrit et Excel ne digère semble-t-il pas ce passage là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LaDateFormatée = Left(LaDateFormatée, i - 1) & "/" & j & "/" & Mid(LaDateFormatée, i + 3, Len(LaDateFormatée) - i - 2)
    Entre temps, j'ai continué à essayer de me creuser la tête pour harmoniser toutes ces dates. Un de mes problèmes étaient que certaines cellules contenaient des espaces avant/après les dates ce qui empêchait qu'elles soient reconnues comme telles.

    En me servant de la fonction trim, j'ai donc fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim NombreColonnes As String
    Dim i As Long, j As Long
     
    For i = 2 To Sheets.Count
        Sheets(i).Select
        NombreColonnes = ActiveSheet.UsedRange.Columns.Count
        Range("A8").Select
     
            For j = 1 To NombreColonnes
                ActiveCell = Trim(ActiveCell)
                ActiveCell.Offset(0, 1).Select
            Next j
     
    Next i
    Résultat : Les espaces sont bien supprimés

    1ère conséquence inattendue : Les dates qui me posaient problème (celle de type 10Apr07) sont converties en 10/04/07...que demander de mieux ? Je ne sais pas pourquoi en revanche (des idées ?) car si j'essaye de supprimer manuellement les espaces d'une cellule avec ce type de date, rien ne se passe

    2è conséquence plus embêtante : Les dates qui étaient "sages" comme 08/06/07 se transforment en 06/08/07...je ne sais toujours pas pourquoi ?

    J'ai essayé de relancer le nettoyage et le 06/08/07 repasse bien en 08/06/07 mais ça déglingue le 10Apr07 qui s'étaient transformé en 10/04/07 et qui passe donc en 04/10/07 (j'ai jamais tout à la fois).

    En revanche, les dates avec des "grands chiffres" pour les jours comme 24/03/07 ne sont pas inversées (pas de méprise entre jour et mois US et FR)

    Qu'est-ce que je peux faire ?

    Merci pour le coup de main, j'apprécie beaucoup

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 38
    Par défaut
    A partir de mon code, j'ai essayé de résoudre les quelques désagréments présents...j'ai donc ajouter une condition Isdate pour ne pas toucher les dates déjà reconnues comme telles. Ca donne ça :

    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
    'On Error Resume Next
     
    Dim NombreColonnes As String
    Dim i As Integer, j As Integer
     
    For i = 2 To Sheets.Count
        Sheets(i).Select
        NombreColonnes = ActiveSheet.UsedRange.Columns.Count
        Range("D8").Select
        j = 4
     
        Do While j <= NombreColonnes
     
            If Not IsDate(ActiveCell) Then
                ActiveCell = Format(Trim(ActiveCell), "dd/mm/yyyy")
            End If
     
            ActiveCell.Offset(0, 6).Select
            j = j + 6
     
        Loop
     
    Next i
    Ca fait un peu bidouillage mais si quelqu'un a une explication sur le pourquoi du comment ou une meilleure idée...je suis preneur

Discussions similaires

  1. Réponses: 8
    Dernier message: 08/06/2006, 11h20
  2. [VBA] Calculer la différence entre deux dates
    Par T'chab dans le forum Access
    Réponses: 13
    Dernier message: 11/05/2006, 15h12
  3. [VBA-E]sauvegarde fichier nom et date
    Par elkhy dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/04/2006, 19h20
  4. [VBA] [excel] MàJ auto tab croisé dynamique
    Par Angel79 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/02/2006, 10h05
  5. Réponses: 21
    Dernier message: 31/01/2006, 16h39

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