PROJET ambitieux fichier CSV avec VBA

Bonjour, j'ai depuis quelques temps à exécuter chaque mois la même procédure et j'aimerais l'exécuter avec une macro. Je dois aller chercher un fichier CSV dans mes téléchargements et le modifier pour l'introduire dans mon fichier principal. Alors voici les détails. Est-ce que j'en demande trop?

1. En étant dans mon Feuillet "Caisses_2020 " fichier excel actif et sur la dernière ligne libree plus 1 et avec

un bouton macro déjà créé et en cliquant sur le dit bouton;

2. Je voudrais que la macro ouvre le dossier telechargements(downloads) et qu'elle sélectionne le fichier

CSV "releve" (qui en passant aura toujours la même forme à tous les mois) et qu'elle me le copie sur une

nouvelle feuille dans le même fichier (en passant probablement par la fenêtre d'importation de données).

3. De la j'aimerais que la macro transforme les données soit la suppression des colonnes 14, 12, 11, 7, 5, 2 et

1. (J'ai déjà le code vba pour cette partie de la macro) Ex: colonne(14).Delete colonne(12).Delete et ainsi

de suite; y a t'il plus simple?...

Mais IMPORTANT aussi supprimer la première ligne (FAMEUSE LIGNE QUI NE PEUT ÊTRE SUPPRIMÉ de

facon conventionelle). Je m'explique: Excel me renvoie (suite à la transformation du CSV) un nouveau

feuillet par exemple Feuil3 (voir fichier joint) avec une mise en forme conditionnelle que j'aimerais

conserver mais toutefois avec dans la 1ere ligne dans A1 Colomn1 avec liste déroulante, dans B1

Colomn2 avec liste déroulante... ainsi de suite. Je n'en veux pas car quand le feuillet est fini d'être

modifié, j'aimerais que la macro copie les données en conservant la même mise en forme mais sans la

dite LIGNE dans la dernière ligne libre plus 1 de mon Feuillet "Caisses_2020 "

4. Finalement Supprimer le feuillet temporaire et terminer la macro en sélectionnant la dernière ligne de

"Caisses_2020 ".

OUF OUF

Merci

17excel-macro.xlsx (44.84 Ko)

bonsoir,

il conviendrait de mettre le fichier exemple csv également

Bonjour à tous

bonsoir,

il conviendrait de mettre le fichier exemple csv également

+1

Puisque tu importes avec une requête c'est dans la requête que tu dois faire cela pas en VBA après importation brute

Rebonjour

Désolé, alors j'inclus le fichier exemple releve.test.csv. Je l'ai modifié pour respecter les demandes du forum en espérant qu'il soit ok. Je suis un retraité de 74 ans. J'ai eu à travailler avec Excel depuis quelques décennies et je me débrouille, pas comme un expert mais je suis capable de modifier des formules et le code VBA (par moments) et j'aime çà.

Merci encore de me donner un coup de main

Normand

18releve-test.csv (633.00 Octets)

Bonjour

N'as-tu pas modifié le CSV ?

Il est dénormalisé donc si cela est du à une action de ta part, il diffère du cas réél et ce qu'on te proposera ne fonctionnera pas sur le cas réel

Bonjour

C'est vrai, en voulant modifier le fichier csv original, le résultat est terrible. Seulement qu'en supprimant la dernière ligne ou en voulant seulement changer une donnée, çà me renvoie un résultat complètement différend. Alors quoi faire? Si j'envoie le fichier original çà devrait fonctionner ?? Mais ce sont des données bancaires. Je vous envoie celui avr 2019.

Voyez ce que vous pouvez fairfe

Merci

11releve.xlsm (29.11 Ko)

RE

Ce qu'il faudrait c'est le CSV original : une fois ouvert dans Ecxel, des transformations sont faites dessus

Et le CSV que tu avais joint a une structure ne correspondant pas à un csv (des guillemets mals placés comme si on l'avait ouvert puis enregistré avec un outil inadapté)

Éventuellement poste le en MP pour la confidentialité

Le but est de te donner une solution qui fonctionne sur le(s) vrai(s) fichier(s) d'où le nécessité d'avoir le cas réel ou non transformé

Rebonjour

Alors 78chris voici le fichier csv original. Je l'ai testé. Le CSV est l'original et quand je vais le chercher avec Données fichier text/csv, une fenêtre s'ouvre avec les bonnes informations et lorsqu'on charge on obtient ce qu'on vois dans l'autre fichier joint.

Merci

Comment mettre le msg en MP

13releve-7.csv (5.15 Ko)

RE

Cette fois le CSV est bon et il faut effectuer les modifications dans la requête

J'ai fait ce que j'ai compris de ton 1er message et j'ai typé les données car il faut récupérer des dates et des montants et non du texte comme dans ton exemple.

J'ai mis le nom du dossier dans la cellule B1 : ainsi tu peux remettre le tiens puis Données, Actualiser tout (le fichier est supposé s'appeler releve.csv donc pas releve(7) ou autre

Je ne voit pas ton onglet Caisses_2020 dans tes exemple donc je n'ai pu faire plus

@ suivre

12recup-csv.xlsx (20.75 Ko)

Bonjour

La question est: peut-on avec une macro aller chercher le fichier csv, ensuite modifier avec une requête les colonnes et le charger dans une autre feuille. J'ai essayé mais le résultat n'est vraiment pas convaincant. J'aimerais simplement qu'on me dirige sur une bonne piste avec le code VBA

Merci

bonjour,

une proposition vba

Sub aargh()
    Set twb = ThisWorkbook
    Set ws1 = twb.Sheets("caisse_2020")
    dlws1 = ws1.Cells(Rows.Count, 1).End(xlUp).Row
     fname = "c:\downloads\releve.csv" ' à adapter éventuellement

     ' enlever les commentaires pour activer une boite de dialogue pour choisir le fichier releve à charger
    '    With Application.FileDialog(msoFileDialogFilePicker)
    '        .AllowMultiSelect = False
    '        .Title = "Sélection du fichier relevé"
    '        .Filters.Clear
    '        .Filters.Add "Excel files", "*.csv*"
    '        If .Show = True Then
    '            fname = .SelectedItems(1)
    '        Else
    '            MsgBox "pas de fichier sélectionné"
    '            Exit Sub
    '        End If
    '    End With

    Set wbcsv = Workbooks.Open(fname)
    Set wsr = ActiveSheet
    For Each col In Array(14, 12, 11, 7, 5, 2, 1)
        wsr.Columns(col).Delete shift:=xlToLeft
    Next
    dl = wsr.Cells(Rows.Count, 1).End(xlUp).Row
    wsr.Range("A2:I" & dl).Copy ws1.Range("releve__617").ListObject.ListRows.Add.Range
    wbcsv.Close False

End Sub

Bonjour h2so4

Merci beaucoup pour ton code. Je l'ai essayé et ça marche presque bien.

une des choses qui cloche c'est l'instruction: dlws1 = ws1.Cells(Rows.Count, 1).End(xlUp).Row. Elle ne semble pas fonctionner, je comprends qu'elle veut dire dernière ligne de Caisses_2020, mais en réalité le curseur ne se rend pas à la dernière ligne. Si je la remplace par Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Offset(2, 0). Ça fonctionne; toutefois j'aimerais comprendre le dlws1??

Mais le bogue le plus important c'est l'instruction de copie vers Caisses_2020 la macro s'arrête tout simplement. Je pense comprendre un peu le raisonnement à part le Range("releve__617")??

Merci encore

bonjour,

bonjour, cette macro fonctionne chez moi, sur base des fichiers exemple que tu as mis.

dlws1 est inutile et cette instruction peut être supprimée.

range("releve_617") réfère à ton tableau sur la feuille caisse_2020 qui doit recevoir les résultats. (si ton tableau ne se nomme pas ainsi, il faut adapter le nom, de même il faut vérifier le nom de la feuille associé à ws1 (qui correspond à la feuille qui contient le tableau)

Si la réalité de tes fichiers ne correspond pas aux fichiers exemples que tu as mis, il me semble normal que la macro ne puisse pas fonctionner correctement.

voici le code adapter et commenté

Sub aargh()
    Set twb = ThisWorkbook
    Set ws1 = twb.Sheets("caisses_2020") ' feuille qui doit recevoir les données du csv

     fname = "c:\downloads\releve.csv" ' chemin du csv à adapter éventuellement

     ' enlever les commentaires pour activer une boite de dialogue pour choisir le fichier releve à charger
    '    With Application.FileDialog(msoFileDialogFilePicker)
    '        .AllowMultiSelect = False
    '        .Title = "Sélection du fichier relevé"
    '        .Filters.Clear
    '        .Filters.Add "Excel files", "*.csv*"
    '        If .Show = True Then
    '            fname = .SelectedItems(1)
    '        Else
    '            MsgBox "pas de fichier sélectionné"
    '            Exit Sub
    '        End If
    '    End With

    Set wbcsv = Workbooks.Open(fname) 'ouvrir csv
    Set wsr = ActiveSheet 'wsr =feuille du csv
    For Each col In Array(14, 12, 11, 7, 5, 2, 1) 'suppression des colonnes inutiles
        wsr.Columns(col).Delete shift:=xlToLeft
    Next
    dl = wsr.Cells(Rows.Count, 1).End(xlUp).Row 'nombre de lignes du csv
    wsr.Range("A2:I" & dl).Copy ws1.Range("releve__617").ListObject.ListRows.Add.Range 'ajout des lignes à la fin du tableau releve_617 sur la feuille ws1
    wbcsv.Close False 'on ferme le csv

End Sub

Bonjour

C'est formidable, suite à quelques modifications la macro fonctionne très bien.

J'aimerais toutefois qu'une ligne vide s'introduise entre chaque mois, alors j'essaie cette instruction

( Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Offset(2, 0).Select ) mais ou exactement, je ne le sais pas!!

Il y a t'il un meilleur code pour ça??

Merci encore

bonjour,

essaie ceci

remplace cette instruction

wsr.Range("A2:I" & dl).Copy ws1.Range("releve__617").ListObject.ListRows.Add.Range

par

wsr.Range("A2:I" & dl+1).Copy ws1.Range("releve__617").ListObject.ListRows.Add.Range

cette instruction ajoute une ligne vide à la fin de chaque copie, au lieu d'en ajouter une au début de chaque copie.

je te déconseille fortement de le faire cependant. Si par après tu veux faire des calculs sur tes données, ces lignes blanches risquent de compliquer ton travail.

Rebonjour

C'est super, alors je continue mon projet qui est encore plus complexe. Pour le moment je suis très content avec ton aide.

Merci et à la prochaine

Rechercher des sujets similaires à "projet ambitieux fichier csv vba"