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 :

Macro : Remplacer "." par "/" pour prise en compte format date


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Janvier 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2015
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Macro : Remplacer "." par "/" pour prise en compte format date
    Bonjour,

    Je réalise une extraction sous format excel de données contenues dans un autre logiciel. On nommera le fichier excel "Extraction".

    J'utilise ensuite une macro sous un second fichier excel, nommé ici "Utilisation", qui me permet de copier les informations du fichier "Extraction" et de la mettre en page dans le fichier "Utilisation".

    Lors de l'extraction des dates sont extraites dans mon premier fichier "Extraction". Ces dates aparaissent alors simplement en format "Standard" dans les cellules concernées. De plus, les dates extraites sont sous format 20.01.2015 et non pas 20/01/2015.

    J'ai intégré dans ma macro présente dans mon fichier "utilisation" le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    WB.Activate
      Range("E3:E30000").Copy
            WB_Principal.Activate
                Range("J3:J30000").Select
                ActiveSheet.Paste
                'Remplacer "." par "/"
                Selection.Replace What:=".", Replacement:="/", LookAt:=xlPart, _
                SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
                ReplaceFormat:=False
                Selection.HorizontalAlignment = xlLeft
    La première partie importe peu, il s'agit des workbook source et cible définis par macros précédemment.
    On s’intéressera à la partie suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'Remplacer "." par "/"
                Selection.Replace What:=".", Replacement:="/", LookAt:=xlPart, _
                SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
                ReplaceFormat:=False
                Selection.HorizontalAlignment = xlLeft
    La macro fonctionne et transpose bien les dates de format de cellule "Standard" de type xx.yy.zzzz en format de cellule "Date" de type xx/yy/zzzz.

    Néanmoins, sans aucune explication pour certaines dates il y a une inversion entre le mois et l'année (ce qui est très problématique parceque je créer ensuite une valeur dans une autre colonne en fonction de la date avec une fonction IF / THEN)
    Exemple : 01.10.2015 devient 10/01/2015

    J'ajoute que si fait je fais la modification manuellement avec Ctrl+F sur la colonne et "Remplacer" "." par "/", il n'y a aucune inversion dans les dates, cela fonctionne parfaitement.

    En espérant avoir été clair,

    Merci d'avance !

  2. #2
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonsoir Neuronne, bonsoir le forum,

    Peut-être comme ç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
    Dim CEL As Range 'déclare la variable CEL (CELlule)
    Dim J As Byte 'déclare la variable J (Jour)
    Dim M As Byte 'déclare la variable M (Mois)
    Dim A As Integer 'déclare la variable A (Année)
    Dim D As Date 'déclare la variable D (Date)
     
    For Each CEL In Selection 'boucle sur toutes les cellules CEL de la sélection (à adapter)
        On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
        J = Split(CEL.Value, ".")(0) 'récupère le jour J (génère une erreur si la cellule ne contient pas le caractère point (.))
        If Err <> 0 Then GoTo suite 'si une erreur a été générée va à l'étiquette "suite"
        M = Split(CEL.Value, ".")(1) 'récupère le mois M
        A = Split(CEL.Value, ".")(2) 'récupère l'année A
        D = CDate(A & "-" & M & "-" & J) 'définit la date D
        CEL.Value = D 'renvoie la date dans la cellule (elle s'adapte au format de la cellule sans intervertir les mois et les jours)
    suite: 'étiquette
    On Error GoTo 0 'annule la gestion des erreurs
    Next CEL 'prochaine cellule de la boucle
    [Édition]
    Je cherchais dans mon cerveau de crevette qui m'avait donné ce plan et je viens juste de le voir sévir sur un post similaire. Rdurupt ! La classe...
    À plus,

    Thauthème

    Je suis Charlie

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Bonjour,

    À partir du menu Convertir (Données), tu peux choisir un format de date (ici jma), ce qui donne ce bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Range("J3:J30000").TextToColumns Destination:=Range("J3"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
            Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
            :=Array(1, 4), TrailingMinusNumbers:=True
    MPi²

  4. #4
    Candidat au Club
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Janvier 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2015
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Punaiiiise trop fort ca fonctionne direct !!!

    Merci pour la réponse rapide et surtout l'efficacité !

    PS : Quelqu'un sait pourquoi ma technique créait des erreurs ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Ta techniques ne fait pas d'erreur elle transforme en dates américain et Excel les convertie en dates français!

  6. #6
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonsoir,

    La raison de ton problème est que tu transfères une valeur de type String ( le résultat de REPLACE est de type string ) vers une cellule qui n'est pas de type string, mais de type Date. Ce qui oblige la conversion de la valeur d'un type vers un autre type (String vers Date). Il semble que quand une valeur est transférée de VBA vers Excel, si la valeur contient une date, la conversion fait appel à une fonction interne archaique de VBA qui considère toujours la date comme étant au format américain ( mm/jj/aaaa ).
    Pour éviter cette conversion, une seule solution : que la variable et la cellule soient du même type.
    Ne jamais envoyer une variable String vers une cellule Date, ni envoyer une variable Date vers une cellule au format Texte.
    Ni envoyer une variable de type date vers une cellule au format numérique, ce qui provoque aussi la conversion non souhaitée.

    Docmarti_Pourquoi la conversion au format de date americain.xls
    Cordialement

    Docmarti.

  7. #7
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    tout d'abord mes meilleurs voeux à tous les lecteurs du forum.
    Super intéressant ton constat Docmarti, merci.
    eric

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour
    il serait interessant que tu observe le resultat de ces deux sub (en exemple) qui sont sensées faire la meme chose sauf que seule la sub "test0" fait le boulot correctement

    les 2 sub mette la plage de destination au format text les dates ne devraient donc pas etre inversées sauf que la 2 inverse

    alors pose toi la question "mise a part la methode différente (qui n'arien a voir avec le phenomene) qu'est ce qui est fait différement

    je te donne un indice (amont/aval)

    tu comprendra peu etre a quel moment tu peux modifier tes "." en "/" et dans quoi

    tout simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test0()
    'copie des dates de la colonne "A" dans colonne"B" avec remplacement du separateur textuel des dates
        tableau = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp)).Value
        texte = Replace(Join(Application.Transpose(tableau), vbCrLf), ".", "/")
        tableau = Split(texte, vbCrLf)
        With Cells(1, "B").Resize(UBound(tableau) + 1, 1)
            .NumberFormat = "@": .Value = Application.Transpose(tableau): .HorizontalAlignment = xlLeft
        End With
    End Sub


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test2()
    'copie des dates de la colonne "A" dans colonne"B" avec remplacement du separateur textuel des dates(ne fonctionne pas!!!!)
        With Cells(1, "b")
            Set plage = .Parent.Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp))
            With .Resize(plage.Rows.Count, 1)
                .NumberFormat = "@": .HorizontalAlignment = xlLeft
                .Value = plage.Value
                .Replace What:=".", Replacement:="/", LookAt:=xlPart, SearchOrder:=xlByRows
     
            End With
        End With
    End Sub
    un autre exemple en travaillant directement les cellules de destination en y injectant la date réencodée au format date par "Cdate"


    ce qui implique que les cellules seront au format date(dd/mm/yyyy) automatiquement car c'est une date que l'on injecte et non le string de la date
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test3()
    'copie des dates de la colonne "A" dans colonne"B" avec remplacement du separateur textuel des dates
        tableau = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp)).Value
        texte = Replace(Join(Application.Transpose(tableau), vbCrLf), ".", "/")
        For i = 1 To UBound(tableau)
            Cells(i, "B").Value = CDate(Replace(tableau(i, 1), ".", "/"))
        Next
    End Sub
    verification
    Nom : Capture.JPG
Affichages : 3934
Taille : 127,0 Ko
    alors qu'au depart elles etaient au format standard
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/05/2015, 17h28
  2. Macro remplacer un point par un espace
    Par Gaaraorion dans le forum VBA Word
    Réponses: 4
    Dernier message: 23/12/2014, 09h30
  3. Réponses: 13
    Dernier message: 31/03/2010, 16h25
  4. Réponses: 1
    Dernier message: 24/05/2008, 17h04

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