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 :

Importation de fichier cvs sur classeur modification date jj/mm vers mm/jj [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2018
    Messages : 8
    Par défaut Importation de fichier cvs sur classeur modification date jj/mm vers mm/jj
    Bonjour à tous (deuxième fois de la journée ),

    J'avais réalisé il y a quelques temps une macro que j'avais laissé de coté et je viens de me replonger dedans.

    Cette macro à pour but de compiler dans un classeur des données en provenance de multiples fichiers CSV.
    Ces fichier CSV sont construits de cette manière :

    Nom : Exemple2.jpg
Affichages : 202
Taille : 110,8 Ko

    La copie des données vers ma feuille principale se passe bien sauf que mes dates subissent une inversion entre le jour et le mois. Au lieu d'avoir jj/mm/aaaa j'obtiens mm/jj/aaaa une fois l'ensemble des fichiers compilés.

    Voici le code concerné :

    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
     
     
    For i = 1 To deltajour
     
    MyDate = DateAdd("d", 1, MyDate) 
    fichier = Format(MyDate, "yyyymmdd") 
     
        'Ouvre le fichier à consolider
        Set Wb = Workbooks.Open(chemin & fichier & "-" & fichier2 & extension)
        MsgBox (chemin & fichier & " - " & fichier2 & extension) 'Verification de la valeur retournée
     
        'Sélectionne la feuille où se trouvent les données
        Sheets(1).Select
        MsgBox (Range("A2"))
     
        For j = 1 To 1000
        Cells(i, 1) = maDateStr
        Cells(i, 1).Value = CDate(maDateStr)
        Next j
     
     
        MsgBox (Range("A2"))
     
        'Compte le nombre de lignes à copier
        n = WorksheetFunction.CountA(Range("A:A"))
     
        'Compte le nombre de colonnes à copier
        m = ActiveSheet.UsedRange.Columns.Count
     
        'Copie les données
        Range(Cells(2, 1), Cells(n, m)).Copy
     
        'Active le classeur de synthèse
        Workbooks("Traitement_données.xlsm").Activate
     
        'Sélectionne la feuille où on va coller les données
        Sheets(1).Select
     
        'Compte le nombre de lignes non vides et ajoute 1 pour avoir le numéro de la première ligne vide
        c = WorksheetFunction.CountA(Range("A:A")) + 1
     
        'Sélectionne la première cellule vide
        Range("A" & c).Select
     
        'Colle les données
        ActiveSheet.Paste
     
        Application.CutCopyMode = False
     
        'Ferme la base de données qui a été consolidée et passe à la suivante
        Wb.Close False
     
    Next i
     
    End Sub
    J'essaye donc de forcer la date à rester dans un format français via la boucle (notement avec le CDate...)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     For j = 1 To 1000
        Cells(i, 1) = maDateStr
        Cells(i, 1).Value = CDate(maDateStr)
     Next j
    incluse dans la première boucle for mais j'obtiens une erreur "Erreur d'éxcécution '13': Incompatibilité de type"

    J'ai cherché pas mal de solutions sur internet et je dois avouer que je désespéré un peu... (j'ai également tenté pas mal d'autres solutions sans succès également...)

    Je sollicite donc à nouveau votre aide

    Merci d'avance !
    Alex.

  2. #2
    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
    bonjour
    on ne sait pas comment tu injecte ton csv dans ton fichier
    dans tout les cas j'utilise une solution radicale je met ma colonne date dans la destination au format text comme ca ell subit pas la conversion de format
    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

  3. #3
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour !

    Comme un vrai fichier csv est un simple fichier texte avec pour séparateur la virgule (d'où le "v" de son nom !),
    le point pour séparateur décimal et les dates au format US et comme nativement le VBA est au même standard
    alors il ne doit pas y avoir de souci …

    J'en conclus donc le fichier est à la sauce européenne avec des dates ne respectant donc pas le format US
    mais avec l'aide VBA interne (pas assez précise pour le coup) et les nombreuses discussions de ce forum
    traitant exactement du même sujet  - une ritournelle ! -  il y a de quoi s'en sortir
    et bien souvent en une seule et unique ligne de code !
    Sinon joindre un fichier csv (s'il ne passe pas le renommer en .csv.txt) …

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2018
    Messages : 8
    Par défaut
    Bonjour patricktoulon, Merci de ta réponse.
    J'ai tenté ce que tu fait mais sans succès, lors de l'importation le résultat est le même...

    Pour ce qui est de l'importation de mon fichier, c'est présent dans le code que j'ai mis ?
    Je n'ai pas mis le reste du code car c'est simplement des lignes qui permettent de définir les variables "chemin, fichier, fichier2" et elles sont un peu lourde de par mon codage de débutant ^^

    Voici l'ensemble donc
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
     
     
    Sub importcsv()
     
    '------------------Varriables principales--------------------------
    Dim chemin As String
    Dim fichier As Long
    Dim fichier2 As String
    Dim deltajour As Long
    Dim fichier3 As Long
    Dim extension As String
    Dim Wb As Workbook
     
     
    '-----------------Varaibles pour ecrire dates----------------
    Dim an1 As Integer
    Dim mois1 As Integer
    Dim jour1 As Integer
    Dim MyDate As Date
     
    Dim an2 As Integer
    Dim mois2 As Integer
    Dim jour2 As Integer
    Dim MyDate2 As Date
    '------------------------------------------------------------------
     
    UserForm1.Show 'Affichage de la userform
     
     
    '----------------------------Conversion Date début ----------------------
    an1 = UserForm1.TextBox6.Value
    mois1 = UserForm1.TextBox4.Value
    jour1 = UserForm1.TextBox1.Value
     
    MyDate = DateSerial(an1, mois1, jour1)
    'Partie restante mise dans la boucle FOR
    '-----------------------------------------------------------------
     
    '----------------------------Conversion Date fin ----------------------
    an2 = UserForm1.TextBox5.Value
    mois2 = UserForm1.TextBox3.Value
    jour2 = UserForm1.TextBox2.Value
     
    MyDate2 = DateSerial(an2, mois2, jour2)
     
    fichier3 = Format(MyDate2, "yyyymmdd")
    MsgBox (fichier3)
    '-----------------------------------------------------------------
     
     
    '--------------------------Choix du type de données---------------
    If UserForm1.OptionButton1 = True Then
            fichier2 = mesurestype1
    End If
     
    If UserForm1.OptionButton2 = True Then
            fichier2 = mesurestype2
    End If
     
    If UserForm1.OptionButton3 = True Then
            fichier2 = mesurestype3
    End If
     
    If UserForm1.OptionButton4 = True Then
            fichier2 = mesurestype4
    End If
    '-----------------------------------------------------------------
    chemin = "C:\Users\user1\Downloads\Extraction\"
    extension = ".csv"
     
    '--------------------------------Calcul de la limite d'itérations à faire
    deltajour = DateDiff("d", MyDate, MyDate2) 'Fait la différence en terme de jours entre les deux dates fixées --> deltajour est utilisé ensuite dans la boucle for pour définir le nombre d'itérations
    MsgBox (deltajour) 'Verification de la valeur retournée
     
    '---------------------------------Boucle de recherche de fichiers---------------------------------------------------
    For i = 1 To deltajour
     
    MyDate = DateAdd("d", 1, MyDate) 'Ajoute à la cible "d" = jours --> +1
    fichier = Format(MyDate, "yyyymmdd") 'Permet de retranscrire la date en un bloc de chiffre correspondant au nom des fichiers
    'MsgBox (fichier)
     
        'Ouvre le fichier à consolider
        Set Wb = Workbooks.Open(chemin & fichier & "-" & fichier2 & extension)
        MsgBox (chemin & fichier & " - " & fichier2 & extension) 'Verification de la valeur retournée
     
        'Sélectionne la feuille où se trouvent les données
        Sheets(1).Select
     
        For J = 1 To 1000
        Sheets(1).Range("A" & J).Value = CDate(Format(Sheets(1).Range("A" & J).Value, "dd/mm/yyyy"))
        Next J
     
        MsgBox (Range("A2"))
     
        'Compte le nombre de lignes à copier
        n = WorksheetFunction.CountA(Range("A:A"))
     
        'Compte le nombre de colonnes à copier
        m = ActiveSheet.UsedRange.Columns.Count
     
        'Copie les données
        Range(Cells(2, 1), Cells(n, m)).Copy
     
        'Active le classeur de synthèse
        Workbooks("Traitement_données.xlsm").Activate
     
        'Sélectionne la feuille où on va coller les données
        Sheets(1).Select
     
        'Compte le nombre de lignes non vides et ajoute 1 pour avoir le numéro de la première ligne vide
        c = WorksheetFunction.CountA(Range("A:A")) + 1
     
        'Sélectionne la première cellule vide
        Range("A" & c).Select
     
        'Colle les données
        ActiveSheet.Paste
     
        Application.CutCopyMode = False 'Evite le message de conserver le contenu du presse papier avant de fermer le classeur
     
        'Ferme la base de données qui a été consolidée et passe à la suivante
        Wb.Close False 
     
    Next i
     
    End Sub
    J'ai donc récemment essayé d'appliquer cette ligne de commande suite a mes recherches WEB mais sans succès (erreur 13):
    (L'idée est que une fois rentré dans la première boucle "For" et que le fichier csv est ouvert, je traite les dates de la colonne A1.)
    " For J = 1 To 1000
    Sheets(1).Range("A" & J).Value = CDate(Format(Sheets(1).Range("A" & J).Value, "dd/mm/yyyy"))
    Next J"

    Malgré tout je ne suis pas sur d'avoir bien saisi l'utilité de la méthode "Cdate" et je ne comprends vraiment pas mon erreur...

    Bonjour Marc-L,
    Merci de ton aide et des détails, pourtant dans mes CSV, les dates sont bien au format francais jj/mm/aaa...
    Je vais voir pour envoi d'un csv dès que possible du fichier en lui meme !
    En image voici ce que ca donne :
    Nom : Exemple3.jpg
Affichages : 194
Taille : 167,2 Ko

  5. #5
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Citation Envoyé par Alex-Le-Zombiz Voir le message
    pourtant dans mes CSV, les dates sont bien au format francais jj/mm/aaa...
    Justement c'est bien là le problème, relire mon post …
    Ne devrait plus l'être via le paramètre Local à True à l'ouverture si le fichier texte a été bien conçu …
    Et n'en déplaise à l'ignorant distribuant des !

    Déjà vérifier juste en double-cliquant sur l'icône du fichier depuis l'Explorateur Windows ou encore via un glisser / déposer …

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    Justement c'est bien là le problème, relire mon post …
    Ne devrait plus l'être via le paramètre Local à True à l'ouverture si le fichier texte a été bien conçu …
    Et n'en déplaise à l'ignorant distribuant des !

    Déjà vérifier juste en double-cliquant sur l'icône du fichier depuis l'Explorateur Windows ou encore via un glisser / déposer …
    bonjour Marc,

    je te propose de monter un club!

    maintenant je supprime mais messages en précisant comme raison -1! c'est d'une grande efficacités!

  7. #7
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Salut Robert !

    ♪ ça s'en va et ça revient ! ♫   Serait-ce toujours la ritournelle de la pensée unique ?!  

    Au fait c'est le C de CSV pour la virgule, Comma en anglais, il y a un manque d'humour ces temps-ci …

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2018
    Messages : 8
    Par défaut
    J'avais mal interprété lors de la première lecture visiblement oui

    En mettant le paramètre local = true le fichier s'importe de manière brute (sans séparation par les virgules --> tout dans une seule case)
    J'ai donc laissé mon programme tout compiler et j'ai ensuite demandé à excel de séparer via la virgule.
    Résultat : --> Tout fonctionne, les dates sont mises correctement

    Le "Set WB" devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Set Wb = Workbooks.Open(chemin & fichier & "-" & fichier2 & extension, , , , , , , , , , , , , True)
        MsgBox (chemin & fichier & " - " & fichier2 & extension) 'Verification de la valeur retournée
    et après ma boucle "For" j'ai ajouté la procédure de séparation par les virgules (extraite de l'enregistreur de macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Columns("A:A").Select
        Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
            Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
            :=Array(Array(1, 4), Array(2, 1), Array(3, 1)), TrailingMinusNumbers:=True
    Je regarderais pour l’alléger une fois tout mon codage terminé (ce qui ne saurais tarder ^^)

    En tout cas Merci de ton aide et de ton humour !

    Je passe le sujet en résolu

  9. #9
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    Alors tes csv seraient au format US sauf les dates ?!
    Si c'est possible de joindre un exemple d'un fichier csv (s'il ne passe pas le renommer en .csv.txt)
    car en général une seule ligne de code est nécessaire pour ouvrir ce genre de fichier …

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

Discussions similaires

  1. Comment importer un fichier CVS dans C++ sur iMac ?
    Par Laurent111 dans le forum C++
    Réponses: 7
    Dernier message: 20/12/2016, 10h14
  2. Importer un fichier caseware sur excel
    Par chakev dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 12/06/2008, 15h50
  3. Importer un fichier pdf sur excel
    Par chakev dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/06/2008, 00h01
  4. Importer plusieurs fichiers dans un classeur
    Par formabox dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 11/09/2007, 17h50
  5. Peut on importer un fichier excel sur sage 500
    Par tedy75 dans le forum Excel
    Réponses: 3
    Dernier message: 11/02/2006, 19h18

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