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
bonsoir,
il conviendrait de mettre le fichier exemple csv également
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
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
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
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
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 SubBonjour 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 SubBonjour
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.Rangepar
wsr.Range("A2:I" & dl+1).Copy ws1.Range("releve__617").ListObject.ListRows.Add.Rangecette 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