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 :

Extraction dates TXT format DD/MM-DD/MM à convertir en dates [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Auditeur interne
    Inscrit en
    Août 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Auditeur interne
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Août 2018
    Messages : 8
    Par défaut Extraction dates TXT format DD/MM-DD/MM à convertir en dates
    Bonjour,

    Je me permets de vous contacter car, suite à mes différentes recherches et lectures (j'ai bien lu le tuto gérer et comprendre les dates sous Excel du site et différents Topics sur le forum), je ne parviens pas à trouver une solution "simple" à mon problème.

    J'ai une extraction TXT de données que je cherche à exploiter sous Excel.
    J'ai déjà codé pas mal d'éléments qui me permettent d'exploiter mes fichiers de mieux en mieux, grâce notamment aux très bons conseils lus sur ce forum, mais sur ce point je bloque.

    Dans la colonne (C) créée après un TextToColumns, la plage de dates apparaît au format DD/MM-DD/MM, soit par exemple 31/03-07/04 pour la période de 31/03/2018 au 07/04/2018. J'avais dans un premier temps séparé cette colonne en trois colonnes DD/MM (C) | - (D) | DD/MM (E) afin d'exploiter les colonnes C et E et de supprimer la D, soit celle des tirets. Plusieurs problèmes ont été rencontrés :
    • Dans certains cas, le format date de la liste est D/MM (exemple 8/03 au lieu de 08/03) ce qui pose problème pour le TextToColumns
    • Dans d'autres, la date affichée après le TextToColumns inverse le mois et le jour (exemple 12/01 qui devient 01/12)

    Enfin, autre problème rencontré, la date générée met automatiquement l'année en cours mais je souhaiterais que dans le cas où ma période est 08/12-15/01, je puisse appliquer la condition suivante "si MM est compris entre 10 et 12 alors YY = N-1 sinon N".

    Mon objectif est donc de passer d'une colonne C contenant une valeur texte type "31/03-07/04" à une colonne C contenant la date 31/03/2018 et une colonne D la date 07/04/2018 et géré les exceptions possibles du type "15/12-8/01" pour qu'elle devienne des valeurs dates 15/12/2017 en colonne C et 08/01/2018 en colonne D.

    Je ne vous propose pas de début de code parce que je coince réellement sur l'angle d'attaque à aborder. Dans pas mal d'autres situations que j'ai eu avec mon extraction, j'ai pu trouver une réponse en cherchant et en essayant mais là je coince

    Je vous remercie par avance pour votre aide !!

    JEJ

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    j'ai un doute sur ce que tu tentes de nous dire :

    la plage de dates apparaît au format MM/YY-MM/YY, soit par exemple 31/03-07/04
    Pour moi ce format déjà c'est du DD/MM-DD/MM avec implicitement l'année en cours...
    C'est bien cela ?

    Ensuite, tu nous donnes un bout de ton point de départ, mais je n'ai pas pu comprendre ton point d'arrivée, pourrais-tu nous dire par exemple :
    - je pars de 31/03-07/04
    - je veux arriver .....

    Parce qu'au delà des problèmes que tu rencontres sur le texttocolumn, il nous faut savoir ce que tu veux avoir au bout

    Merci pour nous.
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre du Club
    Homme Profil pro
    Auditeur interne
    Inscrit en
    Août 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Auditeur interne
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Août 2018
    Messages : 8
    Par défaut
    Bonjour Jean-Philippe,

    Merci pour ton retour et désolé pour le manque de clarté !
    J'ai modifié mon post initiale pour essayer d'être plus précis dans ma requête...
    Dis moi si ce n'est toujours pas clair !

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    D'accord, oui c'est déjà beaucoup mieux

    On peut arriver facilement à ce que tu souhaites.

    On va fonctionner en trois temps
    - manipuler la chaine JJ1/MM1-JJ2/MM2 pour en extraire les Jours Mois 1 et 2
    - déterminer l'année qui s'y rattache (je crois comprendre que si la date de début est nécessaire dans le passé, et que la date de fin est celle qui suit immédiatement la date de début)
    - faire une fonction qui retourne les 2 dates (une par retour de fonction + 1 par ByRef, ou sinon une procédure avec 2 ByRef)

    Une fois le résultat obtenu, il suffira de faire la mise à jour des cellules.
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    bonsoir
    a tester
    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
    Option Explicit
    Private Type dat: debut As String: fin As String: End Type
    Sub test()
        Dim x As dat
        x = date_debut_fin("31/03-07/04")
        MsgBox "test1" & vbCrLf & "debut " & x.debut & " fin :" & x.fin
     
     x= date_debut_fin("31/03-01/03")
        MsgBox "test2" & vbCrLf & "debut " & x.debut & " fin :" & x.fin
     
        'test format mono chiffre
        x = date_debut_fin("8/3-9/3")
        MsgBox "test3 avec format mono chiffre" & vbCrLf & "debut " & x.debut & " fin :" & x.fin
    End Sub
    '
    '
    '
    Function date_debut_fin(ByVal chaine$) As dat
        Dim d As dat
        d.debut = CDate(Split(chaine, "-")(0) & "/" & Year(Date))
        d.fin = CDate(Split(chaine, "-")(1) & "/" & Year(Date))
        If CDate(d.fin) < CDate(d.debut) Then d.fin = CDate(Split(chaine, "-")(1) & "/" & Year(Date) + 1)
        date_debut_fin = d
    End Function
    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

  6. #6
    Membre du Club
    Homme Profil pro
    Auditeur interne
    Inscrit en
    Août 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Auditeur interne
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Août 2018
    Messages : 8
    Par défaut
    Bonjour à tous les deux,

    Désolé pour le délai de réponse, je m’attèle à ce problème entre d'autres sujets...
    N'étant pas du tout expert en codage (je m'y suis mis cet été et découvre petit à petit ses joies et difficultés...), vos retours me semblent intéressant mais j'ai des difficultés à voir par où commencer...
    Alors pour reprendre dans l'ordre :

    Jean-Philippe :
    • Je ne suis pas bien sûr de comprendre ce que tu veux dire là :
      (je crois comprendre que si la date de début est nécessaire dans le passé, et que la date de fin est celle qui suit immédiatement la date de début)
    • et je n'ai jamais fait de fonction sur VBA, d'où mon sentiment quand je lis ça :
      faire une fonction qui retourne les 2 dates (une par retour de fonction + 1 par ByRef, ou sinon une procédure avec 2 ByRef)

    Patrick :
    • la première partie "31/03-07/04" renvoie bien date début "31/03/2018" et date fin ":07/04/2018".
    • la seconde partie ne correspond pas aux cas que je rencontre : quand tu fais le test sur "31/03-01/03", il me renvoie bien date début "31/03/2018" et date fin ":01/03/2019" mais ce n'est pas un cas que je rencontre dans mes données. La plage sera toujours du 01/10/201X au 30/09/201X+1 (nous sommes donc en ce moment sur l'année X+1). Il faudrait donc que pour toutes périodes (date début ou date début et date fin) se trouvant du 01/10 au 31/12 cela affiche en ce moment 2017 et pour tout le reste depuis janvier 2018. A partir du 1er octobre de cette année, j'aimerais que 2017 devienne 2018 et 2018 devienne 2019.
    • Enfin le test format mono chiffre fonctionne bien.

    J'ai testé de mon côté un code beaucoup moins sympa et qui ne fonctionne pas complètement :
    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
    Sub TEST2()
    '
    ' TEST2 Macro
    '
    '
     Dim PremLigne As Long, DernLigne As Long
        PremLigne = 6
        DernLigne = Range("A" & Rows.Count).End(xlUp).Row
     
        Columns("D:E").Insert Shift:=xlToRight
        Range("D" & PremLigne & ":D" & DernLigne).FormulaR1C1 = _
            "=IFERROR(DATEVALUE(LEFT(RC[-1],5)),DATEVALUE(LEFT(RC[-1],4)))"
        Range("E" & PremLigne & ":E" & DernLigne).FormulaR1C1 = _
            "=IFERROR(DATEVALUE(RIGHT(RC[-2],5)),DATEVALUE(RIGHT(RC[-2],4)))"
     
        Range("D" & PremLigne & ":E" & DernLigne).Formula = Range("D" & PremLigne & ":E" & DernLigne).Value
     
        Range("D" & PremLigne & ":E" & DernLigne).NumberFormat = "m/d/yyyy"
        Range("A5:J5").AutoFilter
     
        ActiveSheet.Range("A" & PremLigne - 1 & ":J" & DernLigne).AutoFilter Field:=4, Operator:= _
            xlFilterValues, Criteria2:=Array(1, "10/1/2018", 1, "12/31/2018")
        Columns("D:D").Replace What:="2018", Replacement:="2017", LookAt:=xlPart, _
            SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
     
        ActiveSheet.Range("A" & PremLigne - 1 & ":J" & DernLigne).AutoFilter Field:=5, Operator:= _
            xlFilterValues, Criteria2:=Array(1, "10/1/2018", 1, "12/31/2018")
        Columns("E:E").Replace What:="2018", Replacement:="2017", LookAt:=xlPart, _
            SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
     
        ActiveSheet.ShowAllData
     
    End Sub
    Mon filtre n'a remplacé les années que pour le mois de décembre. Dans mon échantillon test, la première date "de 2017" rencontrée est le 7 novembre, je pense donc que c'est peut être pour ça que mon filtre ne prend pas tous les mois souhaités. Sinon, j'avoue que ça a moins de "gueule" que vos fonctions et que je suis assez intéressé de comprendre vos méthodes pour progresser !

    Merci encore pour vos réponses

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/07/2010, 13h47
  2. Convertir une date en format Mysql?
    Par jacko842 dans le forum VB.NET
    Réponses: 1
    Dernier message: 24/04/2010, 20h10
  3. Réponses: 2
    Dernier message: 26/08/2008, 07h04
  4. Réponses: 18
    Dernier message: 07/02/2008, 15h04
  5. Convertir une date au format excel en datetime SQL server
    Par ALLB dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 20/07/2004, 11h28

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