Import .csv dans .xls (1 .csv par feuille) [Résolu/Fermé]

Signaler
Messages postés
13
Date d'inscription
samedi 2 mars 2013
Statut
Membre
Dernière intervention
3 mars 2013
-
Messages postés
7
Date d'inscription
samedi 11 janvier 2014
Statut
Membre
Dernière intervention
27 novembre 2014
-
Bonjour,
je débute en VBA (depuis 3h) et, of course, je rame ;)

Question (déjà posé côté Forum VB)
Je recherche un exemple de macro(s) VBA Excel (2003, dans mon cas) capable d'importer tous les fichiers .csv d'1 répertoire donné dans 1 fichier .xls unique, à raison d'1 fichier .csv par feuille dans le fichier .xls ;
les fichiers .csv ne comportent que des chaines de caractères (séparées par 1 ',' ou 1 ';' au choix)
chaque feuille devra porter le nom du fichier .csv importé correspondant (sans l'extension .csv, bien sûr)
et, si possible, le fichier .xls doit être distinct du fichier .xls où se trouve la macro, et il sera créer ou recréer à chaque lancement de la macro;

Bon, bien sûr, j'ai vu pas mal d'exemples dans ce domaine sur les forums, mais comme ce n'est jamais tout à fait mon cas, ça demande des adaptations ce qui, vu mon niveau, reste assez laborieux, pour le moment ;

D'avance, merci pour votre aide charitable


11 réponses

Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 198
Bonjour,

Si tu pouvais nous mettre un exemple sans éléments personnels mais avec la macro que tu as commencée sur https://www.cjoint.com/ puis nous mettre le lien généré ici ce serait plus facile de t'aider.
Messages postés
13
Date d'inscription
samedi 2 mars 2013
Statut
Membre
Dernière intervention
3 mars 2013
4
Le code étant court, je le copie/colle ici, si ça ne pose pas de pb :
(j'ai vu des entrées de ce forum agrémenté de liens cijoint.com, qui n'étaient plus accessibles bien que ça semblait répondre à mon besoin)

C'est un code repris sur le site, ici, et très légèrement retouché :
Sub import_CSV_in_xls()
Dim principal As ThisWorkbook
Dim repertoire As String, fichier$
Dim i As Integer
i = 0
Application.ScreenUpdating = False
Set principal = ThisWorkbook
repertoire = ThisWorkbook.Path & "\csv_files\"
fichier = Dir(repertoire & "*.csv")
Do While fichier <> ""
i = i + 1
Workbooks.Open (repertoire & fichier)
ActiveSheet.UsedRange.Copy Destination:=principal.Sheets(i).Range("A" & Rows.Count).End(xlUp).Offset(0)
ActiveWorkbook.Close
fichier = Dir
Loop
End Sub


Les pbs avec ce code sont les suivants :
1) je suis obligé de créer les Feuilles à la main avant de lancer la macro
2) cette macro n'affecte pas le nom des csv importés aux feuilles du fichier xls
3) il y a 1 pb sur l'import dans la 1er feuille
4) l'import des csv se fait dans l'.xls dans lequel se trouve cette macro

Comme évoqué, les csv sont très basiques, du genre :
Contenu du file1.csv :
entete1,entete2,entete3,entete4
toto,titi,tata,tutu

Merci
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 198
Bonsoir,

Je te regardes cela de près mais le planning est un peu chargé...
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 198
Bonsoir bigstyx,

Voici le classeur qui devrait résoudre les fonctionnalités que tu voulais réaliser :

https://www.cjoint.com/c/CCcxRzVG3wY
Messages postés
7
Date d'inscription
samedi 11 janvier 2014
Statut
Membre
Dernière intervention
27 novembre 2014
53
Ça fonctionne du 1er coup ! gbinforme est juste trop fort !
Messages postés
13
Date d'inscription
samedi 2 mars 2013
Statut
Membre
Dernière intervention
3 mars 2013
4
merci bcp;
j'obtiens l'erreur ci-dessous quand je le lance en cliquant sur le bouton "Importer" :
Compile error:
Variable not defined

L'erreur pointe sur la 1ere ligne Sub import ... (mise en jaune) et sur la variable xlOpenXMLWorkbook (mise en blanc sur fond noir)

Au passage, quand j'ouvre ce fichier "CCcxRzVG3wY_recup_csv.xlsm", il est converti, sans doute parce que je suis en Excel 2003 comme je l'indiquais au début ...
y aurait-il un rapport avec le pb ?
une idée ?

merci
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 198
Bonsoir bigstyx,

je suis en Excel 2003 comme je l'indiquais au début ...

Au temps pour moi, j'avais zappé l'information évidente !
Ceci devrait mieux fonctionner :

https://www.cjoint.com/c/CCdj2FZ0dsQ
Messages postés
13
Date d'inscription
samedi 2 mars 2013
Statut
Membre
Dernière intervention
3 mars 2013
4
non, même erreur, en fait ...
mauvais fichier renvoyé sur cijoint.com, peut-être ...?
merci
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 198
Problème sur le type de fichier 2003, regardes ceci :

https://www.cjoint.com/c/CCdlHzxXGqV
Messages postés
13
Date d'inscription
samedi 2 mars 2013
Statut
Membre
Dernière intervention
3 mars 2013
4
l'erreur a changé :
après avoir cliqué sur le bouton "Importer", il m'ouvre 1 petite fenêtre contenant 1 croix rouge et le nombre 400, plus les 2 boutons OK et Help ;
une idée ?
merci
Messages postés
13
Date d'inscription
samedi 2 mars 2013
Statut
Membre
Dernière intervention
3 mars 2013
4
en fait, ce dernier pb était du au fait que le séparateur dans mes fichiers csv étaiente des virgules; en les créant avec point-virgules, pas de soucis ;
un grand merci !
2 questions annexes (eh oui, on en veut toujours un peu plus) :
1) comment supprimer, via la même macro, les feuilles Sheet2 et Sheet3 présentes à l'arrivée dans le fichier .xls ainsi créé (Sheet1 a bien été retiré) (j'ai la version Excell anglaise)
2) est-il possible de réordonner les onglets, dans la même macro ? du genre :inverser les feuilles 1 et 2 ?

encore merci pour cette macro; ça m'aide beaucoup
Messages postés
13
Date d'inscription
samedi 2 mars 2013
Statut
Membre
Dernière intervention
3 mars 2013
4
J'ai parlé un peu vite, dans mon dernier poste :
1) quel que soit le type de .csv (avec ',' ou avec ';' ), je n'ai plus l'erreur 400 ; bizarre;
2) si j'utilise des .csv avec des ',', le fichier .xls résultant est OK (à part les 2 feuilles Sheet2 et Sheet3 évoquées)
3) si j'utilise des .csv avec des ';', le fichier .xls résultant est également correctement créé, mais chaque ligne de mes .csv se retrouve dans 1 seule cellule avec les ';' visibles ;

Ce résultat est un peu bizarre, dans la mesure où, sur mon poste, quand j'ouvre un .csv via Excel par un simple doucle-click dessus (quel que soit le fichir .csv) il faut que le séparateur soit des ';' pour que chaque mot du csv se retrouve bien dans des cellules différentes, alors que si le séparateur est 1 ',' une ligne complète se retrouve dans 1 seule cellule ;
il me semble que cette différence de comportement est lié aux paramètres régionaux sur mon poste,
mais, comme évoqué, le comportement est exactement opposé avec la macro ;
bon, ce n'est pas très gênant car je peux créer mes .csv (via Python) avec des ',' ou des ';' au choix
Restent les 2 questions annexes évoquées si tu as encore un peu de dispo;

merci dans tous les cas
Messages postés
13
Date d'inscription
samedi 2 mars 2013
Statut
Membre
Dernière intervention
3 mars 2013
4
J'ai résolu la 1ere question de supprimer les feuilles vides Sheet2 et Sheet3 en rajoutant ceci :
au début :
Dim s2 As String, s3 As String
s2 = "Sheet2"
s3 = "Sheet3"
. . .
et après wbs.Sheets(feu).Delete :
wbs.Sheets(s2).Delete
wbs.Sheets(s3).Delete
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 198
Bonjour bigstyx,

Désolé pour le retard, mais le planning était un peu chargé et je n'avais pas pu tester correctement. Je te propose cette version qui devrait mieux fournir son résultat de façon conforme :

https://www.cjoint.com/c/CCdvo7H4mxK
Messages postés
13
Date d'inscription
samedi 2 mars 2013
Statut
Membre
Dernière intervention
3 mars 2013
4
bonjour et merci,
ça marche nickel tant que le nom de mes fichiers .csv ne comporte pas plus de 31 caractères (sans compter la chaine ".csv" à la fin du nom) ;
si le nom d'1 des CSV dans le rep fait 32 car. de longueur ou plus, j'ai l'erreur 400 au lancement de la macro ;
une idée pour éviter cette limite ?

Concernant le dernier point de positionner les onglets dans 1 certain ordre, j'ai modifié le script python (celui qui me crée les 10 csv dans le répertoire csv_files) pour que ces 10 csv portent des noms allant de 1-xxx.csv à 10-yyy.csv ;
grâce à ce numéro, les csv sont rangés dans l'ordre que je souhaite dans l'.xls;

mais, je voudrais pouvoir retirer ce préfixe x- au niveau du nom des onglets car les noms des onglets doivent suivre un format donné;
est-ce faisable dans la macro ?
J'espère ne pas trop abuser de ta patience
Merci pour ton aide précieuse
Messages postés
13
Date d'inscription
samedi 2 mars 2013
Statut
Membre
Dernière intervention
3 mars 2013
4
Bonjour,
bon, j'ai réglé mes 2 pbs ci-dessus en codant ceci :
onglet = Mid(fic, 4)
ActiveSheet.Name = Left(onglet, InStrRev(onglet, ".") - 1)

J'ai fait en sorte que le préfixe de mes csv aille de 01- à 10- pour pouvoir retirer les 3 premiers caractères à tous coups;
du coup, le nom des onglets ne dépasse plus les 31 car. de long;
donc, ça marche

merci encore