VBA - Excel - copie d'un CSV vers un XLS

Signaler
Messages postés
44
Date d'inscription
mercredi 8 septembre 2004
Statut
Membre
Dernière intervention
24 mai 2008
-
 jepassaisparla -
Bonjour,

Je cherche à copier le contenu d'une feuille d'un fichier CSV, dans une feuille d'un fichierXLS.

Mon problème:
Lorsque j'ouvre un fichier CSV à la main (double clic), il apparaît comme un fichier xls (données réparties dans les différentes cellules) et je peux copier/coller son contenu sans problème.

Lorsque j'ouvre un fichier CSV via VBA (Set book = Workbooks.Open("C:\file.csv")) il m'ouvre le fichier mais il m'affiche le contenu en CSV (avec les ;) et non pas comme quand je le fais à la main.
Du coup lorsque j'essaie de copier coller (via VBA/ou à la main) ce contenu dans un fichier xls, le xls contient un contenu CSV (avec les ;) mais en aucun cas me met en forme les données CSV dans les différentes lignes/colonnes.

Y a-t-il d'autre moyen d'ouvrir un CSV de sorte à ce qu'il apparaîsse comme un fichier XLS ?

Merci de votre aide.

A+

23 réponses

Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
salut,

c'est bizarre, normalement les csv s'ouvre avec Excel s'il est installé.
Au pire ouvre le comme un fichier texte, c'est pas compliqué

@++

le mystérieux chevalier,"Provençal, le gaulois"
Messages postés
44
Date d'inscription
mercredi 8 septembre 2004
Statut
Membre
Dernière intervention
24 mai 2008

Merci mais j'ai mal du me faire comprendre.

Lorsque je l'ouvre via VBA, le fichier s'ouvre avec Excel simplement le contenu est un contenu CSV (un espèce de format txt avec les ;). Je souhaiterais que les données soient mises en page (dispersées sur les tableau) et non présentées en CSV brut.

J'espère que je me fais comprendre.

Merci. A+
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Arf, tu as raison, bug bizarre !!
Pire que ça, avec l'enregistreur de macro, t'as juste la commande ..Open.., mais rien n'indique le choix du Txt / csv..
Pourtant, dans mes config régionales de mon pc, le séparateur de liste est bien le point-virgule..

Bref, j'ai tenté Workbooks.Open "C:\file.csv", , 4
Ca marche pas,

Mais j'ai remplacer dans le csv les point virgules par des virgules, et là ça s'ouvre nickel.

C'est pour le moment la seule alternative que je te propose, ouvrir ton fichier csv avec le bloc notes, CTRL H pour remplacer tous tes ; en , puis :
Workbooks.Open "C:\file.csv", , 2

@++

le mystérieux chevalier,"Provençal, le gaulois"
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
.. rajoute une virgule avant 2 :
Workbooks.Open "C:\file.csv", , , 2

(en avais oublié une )
@++

le mystérieux chevalier,"Provençal, le gaulois"
Messages postés
44
Date d'inscription
mercredi 8 septembre 2004
Statut
Membre
Dernière intervention
24 mai 2008

Merci.

Mais cela m'étonne qu'il n'existe pas un moyen tout fait tout propre.

D'autres idées ou solutions ?

Je rappelle mon problème : copier (via VBA) une feuille d'un fichier CSV vers une feuille d'une fichier XLS.

Merci.
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Ca m'intrigue aussi
Je vais essayer de trouver quelque chose pour que ça fonctionne, j''ai ma petite idée, bien que ce ne soit pas top
Ton fichier est-il toujours au même endroit et nommé pareil ?

@++

le mystérieux chevalier,"Provençal, le gaulois"
Messages postés
44
Date d'inscription
mercredi 8 septembre 2004
Statut
Membre
Dernière intervention
24 mai 2008

Oui tu peux le considérer.
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Ok,

Arf, j'ai planté Excel
Je persévère

@++

le mystérieux chevalier,"Provençal, le gaulois"
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Elle est pas mal celle là...

je tente de lancer le fichier avec ShellExecute, il me plante Excel..
Mais c'est bizarre, seul les fichier csv et xls plante. J'avais tenté ceci :

Option Explicit

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As
Long

Private Const sFile As String = "Nouveau.csv"
Private Const SW_SHOWNORMAL = 1

Sub Test()
    Dim lRet As Long
    
MsgBox ThisWorkbook.Path

lRet = ShellExecute(0&, vbNullString, ThisWorkbook.Path & "" & sFile, vbNullString, ThisWorkbook.Path,
SW_SHOWNORMAL)

Workbooks(sFile).Activate
Cells.Copy

ThisWorkbook.Activate
Range("A1").PasteSpecial xlPasteAll
Workbooks(sFile).Close False

End Sub
~
<small>[code.aspx?ID=39466 Mortalino] ~
Colorisation automatique</small>

Peut être car cette appli est déjà instanciée, va savoir !
Je cherche autre chose

@++

le mystérieux chevalier,"Provençal, le gaulois"
Messages postés
44
Date d'inscription
mercredi 8 septembre 2004
Statut
Membre
Dernière intervention
24 mai 2008

La solution pourrait aussi être cherchée dans cet axe:

réussir à ce que Excel, après avoir ouvert le fichier CSV via Workbooks.Open "C:\file.csv", affiche les données dans les cellules (comme il le fait quand j'ouvre le fichier CSV avec un double clic)...
Messages postés
44
Date d'inscription
mercredi 8 septembre 2004
Statut
Membre
Dernière intervention
24 mai 2008

En tout cas bien tenté.
Messages postés
44
Date d'inscription
mercredi 8 septembre 2004
Statut
Membre
Dernière intervention
24 mai 2008

Je viens de tomber sur ça :


une solution consiste à changer ton extension de fichier en txt et d'utiliser


Workbooks.OpenText


les paramètres de opentext te permettent de définir tes délimiteurs

je vais essayer
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Mouais,

je suis tombé aussi dessus, mais mes tests sont infructueux, tente chez toi en Pas à pas (F8), on ne sait jamais :

Option Explicit

Private Const sFile     As String = "\Nouveau.csv"
Private Const sFileTxt  As String = "\Nouveau.txt"

Sub Test()
    Dim lRet As Long
    
Name ThisWorkbook.Path & sFile As ThisWorkbook.Path &
sFileTxt

Workbooks.OpenText ThisWorkbook.Path & sFileTxt, xlWindows,
1, xlDelimited,
True

Workbooks(sFileTxt).Activate
Cells.Copy

ThisWorkbook.Activate
Range("A1").PasteSpecial xlPasteAll
Workbooks(sFileTxt).Close False

End Sub
~
<small>[code.aspx?ID=39466 Mortalino] ~
Colorisation automatique</small>

@++

le mystérieux chevalier,"Provençal, le gaulois"
Messages postés
44
Date d'inscription
mercredi 8 septembre 2004
Statut
Membre
Dernière intervention
24 mai 2008

Pour moi ça ça marche :

    Set mnemonics_book = Workbooks.Open(mnemonics_csv.Text)
    mnemonics_book.SaveAs Filename:=Replace(mnemonics_csv.Text, ".csv", ".txt")
    Workbooks.OpenText Filename:=Replace(mnemonics_csv.Text, ".csv", ".txt"), DataType:=xlDelimited, Other:=True, OtherChar:=";"

Toujours ouvert à de meilleurs propositions

Merci.
A+
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Bah je sais pas si il y a une meilleur solution, mais malgrè les péripéties du dev que je te propose, on arrive à nos fins
Je t'ai tout commenté :

Option Explicit

Private Const sFile     As String = "Nouveau.csv"
Private Const sFileTxt  As String = "Nouveau.txt"

Sub Test()
' je ne connaissais pas, mais appremment ça sert à renommer le XLS
en CSV
    Name ThisWorkbook.Path & "" & sFile As ThisWorkbook.Path & "" & sFileTxt

' là il ouvre le fichier texte (et donc ce n'est plus un csv ...
temporairement)
Workbooks.OpenText Filename:=ThisWorkbook.Path & "" & sFileTxt, Origin:=xlWindows, _
    StartRow:=1, DataType:=xlDelimited, Semicolon:=True

' on l'active et copie
toutes ses données
Workbooks(sFileTxt).Activate
Cells.Copy

'on active le
classeur contenant le code pour coller les données
ThisWorkbook.Activate
Range("A1").PasteSpecial xlPasteAll

' on
enregistre le fichier texte transformé, mais en cvs à nouveau
Workbooks(sFileTxt).SaveAs ThisWorkbook.Path & "" & sFile

' on le ferme
Workbooks(sFile).Close False

' et on efface le fichier
texte créé temporairement
Kill ThisWorkbook.Path & "" & sFileTxt

End Sub
~
<small>[code.aspx?ID=39466 Mortalino] ~
Colorisation automatique</small>

Content d'avoir trouvé cette soluce, j'espère qu'elle te conviendra

@++

le mystérieux chevalier,"Provençal, le gaulois"
Messages postés
44
Date d'inscription
mercredi 8 septembre 2004
Statut
Membre
Dernière intervention
24 mai 2008

It is perfect.

Merci beaucoup pour ton temps.

A+
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
de rien, après une nuit de travail, vais me coucher
Bon WE ;)

@++

le mystérieux chevalier,"Provençal, le gaulois"
Messages postés
44
Date d'inscription
mercredi 8 septembre 2004
Statut
Membre
Dernière intervention
24 mai 2008

Lol

Merci.

Bonne nuit.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Mortalino,

j'ai pas l'aide excel sous la main, mais il me semble que dans l'instruction WorkBook.Open, tu as la possibilité d'ouvrir un fichier texte en lui spécifiant le séparateur.

Certainement avec l'option 4, comme tu étais parti au départ, mais il faut en plus spécifier le séparateur dans un autre argument de l'instruction.

Je l'avais déjà fait pour un fichier tabulé, car effectivement depuis VBA, il ne me reconnaissais pas le format.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Voila ce que je viens de trouver dans la liste des sujets en rapport ci-dessous.

C'est pas WorkBook.Open, mais WorkBook.OpenText :

Workbooks.OpenText Filename:= NomDuFichier , _
                    Origin: =xlWindows, _
                    StartRow:= 1, _
                    DataType:=xlDelimited, _
                    TextQualifier:= _
                    xlDoubleQuote, _
                    ConsecutiveDelimiter:=False, _
                    Tab:=False, _
                    Semicolon:=True, _
                    Comma:=False, _
                    Space:=False, _
                    Other:=False

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #