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 :

Excel 2010 . Vba - Copier-coller une chaîne "date" inverse jour et mois


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Cadre France-Télécom en retraite
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Cadre France-Télécom en retraite
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Par défaut Excel 2010 . Vba - Copier-coller une chaîne "date" inverse jour et mois
    Bonjour à tous.

    Version Excel : 2010

    Dans un fichier de suivi bancaire, pour chacun des mouvements, je dispose dans chaque cellule de la colonne A de la date d'opération de la banque et dans la cellule correspondante de la colonne B de diverses informations dont la date du mouvement.
    Je souhaite chaque fois que ces deux dates sont différentes récupérer la chaîne donnant la date dans la colonne B pour la coller dans la colonne A en lieu et place de la date d'opération de la banque.

    Dans la macro VBA traitant ce suivi bancaire, apparemment je sais récupérer le chaîne qui m'intéresse dans la cellule de B et la coller dans celle de A.
    Voici le bout de code censé faire le travail pour une date définie par une chaîne de caractère du type jj/mm/aa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            For Each Cellule In Range("F5:F" & Lig_NumDernière)
                If Mid(Cellule.Value, 3, 1) = "/" Then
                    Chaîne = Mid(Cellule.Value, 1, 8)
                    Range("A" & Cellule.Row).Value = Chaîne
                End If
            Next Cellule
    Le problème est que si "Chaîne" égale "06/08/20", une fois écrite dans la colonne A, elle devient "08/06/2020".
    Si, par jeu, je force "Chaîne" à la valeur "toto", l'écriture se passe bien.
    À la main, en copiant "06/08/20" dans la cellule de B et en le collant dans la cellule de A, tout va bien aussi, quel que soit le mode de collage ('sur' la cellule ou 'dans' la cellule).
    Dans la cellule de A, avec ou sans intervention de la macro, le format de nombre est un classique "date" & "*14/03/2001".

    Je pourrais sûrement m'en sortir en manipulant le "/" pour voiler la structure de la date, mais ce ne serait ni élégant, ni instructif.
    Merci à celle ou à celui qui m'expliquera ce que Excel fait, comment le faire obéir... ou quelle erreur je fais puisque, étant assis devant le clavier, je suis ma principale source de problèmes informatiques.

    Très cordialement,
    André Blanquer

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je ne comprends pas la finalité mais si c'est juste pour inverser l'ordre d'affichage, il suffit simplement de modifier son format. Une date n'est qu'un nombre en excel.

    Je conseille avant tout de lire le tutoriel Création, enregistrement et fusion de formats personnalisés

    Attention qu'en VBA le format doit être géré en anglais Y pour l'année, M pour le mois et D pour le jour
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 385
    Par défaut
    Bonjour,

    Ta variable chaîne ne serait-elle pas déclarée en String par hasard ? Ou carrément non déclarée ?

    Si c'est le cas, VBA ne sait pas que c'est une date quand il récupère la valeur, par contre au moment où il la met dans Excel, il suppose que c'est une date et il va la mettre en date, sauf que VBA est en anglais (contrairement à Excel qui se paramètre dans la langue qu'on veut, soit en français dans ton cas).
    Du coup pour lui, il avait une date, et les anglais écrivent les dates en commençant par le mois, puis le jour, puis l'année.

    Déclare ta variable en Date et le problème sera réglé normalement.


  4. #4
    Membre habitué
    Homme Profil pro
    Cadre France-Télécom en retraite
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Cadre France-Télécom en retraite
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Par défaut
    Merci à tous les deux pour vos réponses instantanées.

    I. Mat955

    Dans mes macros option explicit est de rigueur ;
    et dans une user form nommée « a00_Variables », je définis toutes les variables, en mode Public bien sûr.

    Votre idée que je récupérais la chaîne de caractères porteuse de la date qui m’intéressait par une variable du type string est très logique.
    D’ailleurs, j’ai immédiatement créé une variable Public ChaîneDate as Date, au cas où…

    Mon code est plus direct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For Each Cellule In Range("F5:F" & Lig_NumDernière)
    ()
    If Mid(Cellule.Value, 3, 1) = "/" Then
    Range("A" & Cellule.Row).Value = Left(Cellule.Value, 8)
    End If
    ()
    Next Cellule
    II. M. Tulliez

    Pour éclairer le but de ma manœuvre, voici d’abord un choix de lignes de mouvements bancaires :

    Date Libellé
    11/08/2020 RETRAIT DAB/TPE INTERNE
    11/08/2020 ACHAT CB GO SPORT 10.08.20 CARTE NUMERO 441
    07/08/2020 CARTE X8441 06/08/20 A 11H24 RETRAIT DAB LA BANQUE POSTALE

    Les données en Date et Libellé sont fournies par ma banque.
    Vous constaterez que les banquiers sont des gens rigoureux et logiques :
    dans la colonne Libellé les dates sont soit de la forme jj/mm/aa, soit de la forme jj.mm.aa !

    Mon code va créer la colonne Imputation et modifier des données dans certaines lignes de la colonne Date.
    En fin de traitement des informations de date, il fait quelques modifications cosmétiques à la colonne Date,
    en particulier un NumberFormat = "dd/mm/yy;@".

    Les résultats sortis par le code sont en gras.

    Date Libellé Imputation
    11/08/20 RETRAIT DAB/TPE INTERNE Dab
    10/08/20 ACHAT CB GO SPORT 10.08.20 CARTE NUMERO 441 Go Sport
    08/06/20 CARTE X8441 06/08/20 A 11H24 RETRAIT DAB LA BANQUE POSTALE Dab BanPostale

    Vous constaterez que la date d’achat chez Go Sport est respectée, mais pas celle du retrait dans le DAB.

    II. Du nouveau

    Je viens de constater que tout se passe correctement pour les dates postérieures à 13…
    et que le problème se pose quand la date du jour est comprise entre 01 et 12.
    Comme il y a douze mois dans l’année, je verrais bien là le problème gestion de dates subodoré par vous deux.

    La solution pragmatique serait de faire subir à la colonne libellé un vigoureux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     .Replace What:="/", Replacement:="."
    qui résoudrait le problème en utilisant des lignes de code déjà écrites pour traiter le cas jj.mm.aa.
    Sauf que cela va me compliquer l'élimination de chaînes de caractères inutiles...

    IV. Conclusion temporaire

    Pour compléter ma formation, M. Tulliez, demain je plonge dans les liens que vous m’avez indiqués.
    Mais j’avoue que j’aimerais trouver (pas forcément tout seul) une solution qui permettrait de gérer les dates jj/mm/aa.
    Et de ne pas me compliquer la vie pour supprimer certaines chaînes... Mais les difficultés sont aussi instructives.
    Bref, si vous avez une idée, je serais preneur.

    Cordialement
    André Blanquer

  5. #5
    Membre habitué
    Homme Profil pro
    Cadre France-Télécom en retraite
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Cadre France-Télécom en retraite
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Par défaut Éléments de solution
    Bonjour à tous.
    Bonjour à Mat955 et à Philippe Tulliez.

    Après avoir relu le contenu des liens proposés, relus mes propres copies de didacticiels et continué à chercher sur la Toile, je suis parvenu à mes fins.

    D’abord j’ai suivi l’idée personnelle énoncée dans mon premier message :
    « La solution pragmatique serait de faire subir à la colonne Libellé un vigoureux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Replace What:="/", Replacement:="."
    qui résoudrait le problème en utilisant des lignes de code déjà écrites pour traiter le cas "jj.mm.aa". »

    Cela a marché… presque.

    Cela a bien écrit dans la colonne Date un string "jj.mm.aa", mais comme j’avais dans la colonne Date un mélange de "jj.mm.aa" et de "jj/mm/aa",
    j’ai codé un vigoureux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Replace What:=".", Replacement:="/"
    sur la colonne Date. Résultat : plus de "jj.mm.aa"… mais des "mm/jj/aa".

    ¡Caramba! Encore raté.

    Deuxième idée :
    . extraire un string porteur de la date du jour, un autre porteur du mois et un dernier porteur de l’année ;
    . les rassembler dans un string "jour/mois/année".
    Sur les cellules contenant : «ACHAT CB GO SPORT 10.08.20 CARTE NUMERO 441», préalablement réduite par la macro à «GO SPORT 10.08.20»
    cela a fonctionné.
    Vous trouverez mon code ci-dessous :

    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
    Dim  Année As String
    Dim Cellule As Range
    Dim Chaîne As String
    Dim Chaînette As String
    Dim Compteur As Integer
    Dim DateÉvénement As Date
    Dim JourN As Integer
    Dim Jour As String
    Dim Lig_NumDernière As Integer
    Dim MoisN As Integer
    Dim Mois As String
     
    For Each Cellule In Range("F2:F" & Lig_NumDernière)
     
            'chaîne : nombre de caractères
     
            Compteur = Len(Cellule)
     
            'fin de chaîne : xxxxxxxx jj.mm.aa
     
            If Mid(Cellule.Value, Compteur - 2, 1) = "." And Mid(Cellule.Value, Compteur - 5, 1) = "." _
            Then
                Année = Mid(Cellule.Value, Compteur - 1, 2)
                MoisN = Mid(Cellule.Value, Compteur - 4, 2)
                JourN = Mid(Cellule.Value, Compteur - 7, 2)
                DateÉvénement = JourN & "/" & MoisN & "/" & Année
                Range("A" & Cellule.Row).Value = DateÉvénement
                Range("F" & Cellule.Row).Value = Left(Cellule.Value, Compteur - 9)
            End If
     
            'début de chaîne : jj/mm/aa xxxxxxxx
     
            If Mid(Cellule.Value, 3, 1) = "/" And Mid(Cellule.Value, 6, 1) = "/" Then
                Année = Mid(Cellule.Value, 7, 2)
                MoisN = Mid(Cellule.Value, 4, 2)
                JourN = Mid(Cellule.Value, 1, 2)
                DateÉvénement = JourN & "/" & MoisN & "/" & Année
                Range("A" & Cellule.Row).Value = DateÉvénement
                Range("F" & Cellule.Row).Value = Mid(Cellule.Value, 18, Compteur)
            End If
    Tout allait donc bien.
    Puis j’ai voulu coder l’enregistrement du fichier sous un nom de la forme : "BanPos - 200811-200201.xls"
    où "200811" représente la date du dernier mouvement bancaire et "200201" celle du premier.
    Cet ordre année-mois-jour pour ordonner par date des fichiers de même nom.

    Quand le code écrit dans la même idée que précédemment traitait une date du type "01/02/20",
    il renvoyait un string Jour à "1" et un string Mois à "2". Et pas question de coder un If pour complémenter Jour et Mois à "01" et "02"
    car Len(Jour) et Len(Mois) renvoyaient "2".

    Patatras !

    Recherche dans la Toile pour trouver en :
    https://forums.commentcamarche.net/f...e-de-caractere
    le post titré « Convertir une date en chaîne de caractère ».
    Je cite Pijaku :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub test()
     
        Dim maDate As Date, strDate As String
     
        maDate = CDate("02/01/2013")                                   'ici on a bien une date au format Date
        MsgBox maDate
        strDate = Format(maDate, "dddd dd mmmm yyyy")  'ici on obtient un String
       MsgBox strDate
     
    End Sub
    Cette idée, adaptée à mon cas, a donné le code suivant, code opérationnel :

    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
    '' Enregistrer le fichier ''
     
        Chaîne = Format(Range("A" & Lig_NumDernière).Value, "ddd dd mm yy") 'mar. 11 08 20
        Année = Mid(Chaîne, 12, 2)
        Mois = Mid(Chaîne, 9, 2)
        Jour = Mid(Chaîne, 6, 2)
        Chaîne = "BanPos - " & Année & Mois & Jour & "-"
     
        Chaînette = Format(Range("A2").Value, "ddd dd mm yy") 'sam. 01 02 20"
        Année = Mid(Chaînette, 12, 2)
        Mois = Mid(Chaînette, 9, 2)
        Jour = Mid(Chaînette, 6, 2)
        Chaîne = Chaîne & Année & Mois & Jour
     
        ActiveWorkbook.SaveAs _
            Filename:="D:\ (…) relevés informatiques\" & Chaîne & ".xls", FileFormat:=xlExcel8
    La solution proposée par Pijaku me paraît excellente et je l’en remercie.

    Mais si quelqu’un a mieux à proposer que ma solution et celle de Pijaku, je suis preneur.
    Je fermerai cette conversation dans quelques jours.

    Merci à tous,
    André Blanquer

    PS au modérateur :
    Je n'ai pas manqué d'utiliser la balise #.
    Vous avez raison, c'est franchement plus lisible.
    Mais cela me montre qu'il me faudra éviter les noms de variables commençant par Date !

Discussions similaires

  1. [XL-2016] [Débutant vba] Copier-Coller une cellule dans la première cellule vide d'une colonne nommé
    Par AlexandreB94 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/11/2019, 11h10
  2. Réponses: 4
    Dernier message: 12/04/2016, 12h13
  3. [XL-2007] VBA: Copier/coller une plage de valeur
    Par kimou75 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 25/02/2016, 16h43
  4. Réponses: 4
    Dernier message: 17/12/2012, 13h29
  5. Réponses: 1
    Dernier message: 19/12/2006, 16h12

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