Exporter en CSV

Résolu/Fermé
senecartour Messages postés 324 Date d'inscription dimanche 12 mai 2013 Statut Membre Dernière intervention 29 octobre 2020 - 2 déc. 2014 à 12:06
Le Pingou Messages postés 12182 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 7 novembre 2024 - 4 déc. 2014 à 21:46
Bonjour,

J'ai créé une macro pour exporter en CSV des plages de données après les avoir définies.
Je me suis basé sur une macro que m'avait proposé "LePingou" qui fonctionne bien sur mon ancien fichier. Je remercie au passage "Lepingou".

J'ai essayé de l'adapter dans cette situation mais je n'arrive pas.
En résumé, j'ai défini des plages qui m'intéressent dans une base de données et souhaiterais exporter uniquement les plages sélectionnées en CSV.

La macro se plante sur une ligne au niveau des codes permettant d'exporter les données en csv mais je n'arrive pas à trouver l'origine du problème.

Voici le fichier avec la macro: https://www.cjoint.com/c/DLcmm55f8sT

Merci pour votre aide.



21 réponses

jordane45 Messages postés 38275 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 8 novembre 2024 4 696
2 déc. 2014 à 12:18
Bonjour,

TU donnes un chemin.. mais sans nom de fichier...
par exemple :
Open chemin & "\test.csv" For Output As #1

0
senecartour Messages postés 324 Date d'inscription dimanche 12 mai 2013 Statut Membre Dernière intervention 29 octobre 2020 3
2 déc. 2014 à 14:11
J'ai déjà donné le chemin dans:

Set FSO = CreateObject("Scripting.FileSystemObject")
If Not (FSO.FolderExists(chemin & "\EXP")) Then
FSO.CreateFolder (chemin & "\EXP")
End If
If Not (FSO.FolderExists(chemin & "\EXP\" & feuille)) Then
FSO.CreateFolder (chemin & "\EXP\" & feuille)
End If

Je ne pense pas que ce soit un problème de chemin. Aussi, j'ai mis ce que vous m'avez conseillé mais il y a juste le repertoire qui est crée mais pas le fichier CSV.

Pourriez-vous, s'il vous plâit, jeter un coup d'oeil sur le fichier joint?

Merci d'avance!
0
jordane45 Messages postés 38275 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 8 novembre 2024 4 696
2 déc. 2014 à 14:34
Je ne sais pas ce que tu essayais de faire au juste .. mais visiblement tu essayais de concatener un objet RANGE avec du text....

Essayes ce code :
Sub export_csv()
Dim separateur, cellule, feuille, chemin, strChaine As String
Dim lideb, codeb, lifin, cofin, cofintitre As Long
Dim plagetitre, plageentete, plagetitrechamp, plagedonnees, plagetotale As Range
Dim FSO As Object
Dim ligne_precedente As Integer

separateur = "^"
chemin = Application.ActiveWorkbook.Path
feuille = ActiveSheet.Name

'Je défini les bornes que je vais utiliser pour la définition de mes plages
cofintitre = Range("B1").End(xlToRight).Column
lideb = 7
codeb = 2
lifin = Cells(Rows.Count, codeb).End(xlUp).Row
cofin = Cells(lideb, Columns.Count).End(xlToRight).Column


'Je défini le chemin d'accès du répertoire de dépôt de mes fichier csv
Set FSO = CreateObject("Scripting.FileSystemObject")
If Not (FSO.FolderExists(chemin & "\EXP")) Then
    FSO.CreateFolder (chemin & "\EXP")
End If
If Not (FSO.FolderExists(chemin & "\EXP\" & feuille)) Then
    FSO.CreateFolder (chemin & "\EXP\" & feuille)
End If


'Je défini mes quatre plages
Set plagetitre = Range(Cells(1, 2), Cells(1, cofintitre))
plagetitre.Select

Set plageentete = Range(Cells(2, 2), Cells(2, cofintitre))
plageentete.Select

Set plagetitrechamp = Range(Cells(3, 2), Cells(3, cofintitre))
plagetitrechamp.Select

Set plagedonnees = Range(Cells(lideb, codeb), Cells(lifin, cofintitre))
plagedonnees.Select

Set plagetotale = Union(plageentete, plagetitrechamp, plagedonnees)

'J'exporte ma plage totale en CSV
'C'est à ce niveau que je rencontre des problèmes
Open chemin & "\test.csv" For Output As #1
ligne_precedente = plageentete.Row
For Each cell In plagetotale
 'On concatene les cellules avec le séparateur..
 strChaine = strChaine & separateur & cell.Value
  'On passe à la ligne suivante
  If (cell.Row > ligne_precedente) Then
    strChaine = strChaine & vbCrLf
  End If
  ligne_precedente = cell.Row
Next
'On retire le premier caractère separateur
strChaine = rigth(strChaine, Len(strChaine) - 1)

'On écrit le fichier
Print #1, strChaine
strChaine = ""

'Fermeture du fichier
Close #1
Set FSO = Nothing
Set plagedat = Nothing
Set Plagetit = Nothing
MsgBox "Fichier : " & chefichcsv & " disponible"
End Sub


0
Bonjour

Voila encore une macro
regarde bien deja la macro copy

http://cjoint.com/?0Lco1X50Eqt

A+
Maurice
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
senecartour Messages postés 324 Date d'inscription dimanche 12 mai 2013 Statut Membre Dernière intervention 29 octobre 2020 3
2 déc. 2014 à 14:52
Bonjour Maurice,
Le lien que vous m'avez donné ne fonctionne pas.
Pourriez-vous, s'il vous plaît, me l'envoyer une nouvelle fois?

Merci!
0
Le Pingou Messages postés 12182 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 7 novembre 2024 1 448
2 déc. 2014 à 15:01
Bonjour,
Eh bien il fonctionne très bien, il faut juste le copier et la coller dans votre navigateur internet....!
Salutations
Le Pingou
0
jordane45 Messages postés 38275 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 8 novembre 2024 4 696
2 déc. 2014 à 15:26
vous avez testé mon code corrigé ??
0
Re
Voila

http://www.cjoint.com/?0Lco1X50Eqt

A+
Maurice
0
senecartour Messages postés 324 Date d'inscription dimanche 12 mai 2013 Statut Membre Dernière intervention 29 octobre 2020 3
Modifié par jordane45 le 2/12/2014 à 17:47
Maurice,
J'ai adapté une nouvelle fois votre code en l'adaptant à mon fichier. Plus besoin de copier les plages dans un autre onglet pour ensuite exporter en csv.
L'export se fait directement depuis l'onglet.
Lorsque je lance ma macro, le fichier csv est cré mais ne se met pas dans le repertoire export.
Aussi, mon souhait est de mettre chaque fichier csv dans un sous repertoire portant le nom de l'onglet.
EX; Si j'exporte l'onglet "donnees", le fichier csv qui va porter le nom "donnees.csv" doit se trouver dans un sous repertoire appelé donnees dans le quel on a notre fichier csv.
voici mon code modifié:

Sub CreatRepertoire()
Chemin = ActiveWorkbook.Path & "\"
   MonRep = Chemin & "EXP"
      If Dir(MonRep, vbDirectory) = "" Then
         MkDir (MonRep)
         Call Export(MonRep)
      End If
 Call Export(MonRep)
End Sub

Private Sub Export(Chemin)

Dim separateur, trChaine As String
Dim lideb, codeb, lifin, cofin, cofintitre As Long
Dim plagetitre, plageentete, plagetitrechamp, plagedonnees, plagetotale As Range
Dim FSO As Object


separateur = "^"
Chemin = Application.ActiveWorkbook.Path


'Je défini les bornes que je vais utiliser pour la définition de mes plages
cofintitre = Range("B1").End(xlToRight).Column
lideb = 7
codeb = 2
lifin = Cells(Rows.Count, codeb).End(xlUp).Row
cofin = Cells(lideb, Columns.Count).End(xlToRight).Column


'Je défini mes trois plages à exportrer dans mon fichier csv
Set plageentete = Range(Cells(2, 2), Cells(2, cofintitre))
plageentete.Select


Set plagetitrechamp = Range(Cells(3, 2), Cells(3, cofintitre))
plagetitrechamp.Select

Set plagedonnees = Range(Cells(lideb, codeb), Cells(lifin, cofintitre))
plagedonnees.Select

'Ma plage totale est la somme des trois plages que je vais exporter. Je n'ai pas besoin d'exporter ma plage de titre
Set plagetotale = Union(plageentete, plagetitrechamp, plagedonnees)

Nomfichier = ActiveSheet.Name
Ext = ".csv"
Fichier = Nomfichier & Ext
'Chemin = ActiveWorkbook.Path & Application.PathSeparator
CheminFiche = Chemin & "\" & Fichier
separateur = "^"
Nlig = Cells(Rows.Count, 2).End(xlUp).Row
   Set Plage = plagetotale
   
      Open CheminFiche For Output As #1
         For Each Lig In Plage.Rows
            Tmp = ""
               For Each Cel In Lig.Cells
                  Tmp = Tmp & CStr(Cel.Text) & separateur
               Next
            Print #1, Tmp
         Next
      Close
   Set Plage = Nothing
MsgBox "Terminer"
End Sub



Merci d'avance pour votre aide très utile pour moi.


EDIT : Ajout des balises de code (jordane)
0
jordane45 Messages postés 38275 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 8 novembre 2024 4 696
2 déc. 2014 à 17:48
Merci de bien vouloir utiliser la coloration syntaxique (les balises de code) lorsque tu postes du code sur le forum.
Explications disponibles ici :
https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
0
senecartour Messages postés 324 Date d'inscription dimanche 12 mai 2013 Statut Membre Dernière intervention 29 octobre 2020 3
2 déc. 2014 à 15:00
Ok! Merci Maurice,
Je teste et je vous tiens au courant!

0
re
je pense que tes Set sont pas bon

moi je prefere une copy avant car je voie se que je vais transferer HI

ses toi qui voie

A+
Maurice
0
Le Pingou Messages postés 12182 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 7 novembre 2024 1 448
3 déc. 2014 à 10:55
Bonjour senecartour,
Si j'ose une petite remarque, pourquoi dans la procédure [Private Sub Export(Chemin)] vous changez le chemin du répertoire (voir ligne : Chemin = Application.ActiveWorkbook.Path) que vous avez créé dans la procédure [Sub CreatRepertoire()] ....... ?

0
senecartour Messages postés 324 Date d'inscription dimanche 12 mai 2013 Statut Membre Dernière intervention 29 octobre 2020 3
3 déc. 2014 à 11:35
Bonjour Lepingou,

J'avoue que je suis perdu. Hier j'ai passé presque toute la soirée pour résoudre le problème, en vain.

Au fait, j'aimerais exporter en CSV en prenant ma méthode de codage que je connais relativement.

J'ai presque réussi à définir ma plage totale à exporter. Mais j'ai du mal à parvenir pour l'extraction de ma plage en CSV. Ma macro beugue sur une ligne.

Maurice m'a donné une autre méthode mais je souhaiterais m'appuyer sur la méthode se trouvant dans mon fichier (voir code).

Je vous joins la nouvelle version de mon fichier: https://www.cjoint.com/c/DLdlLaMQiD3

Merci d'avance pour votre aide.
0
Le Pingou Messages postés 12182 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 7 novembre 2024 1 448
3 déc. 2014 à 14:12
Bonjour,
C'est étonnant de votre part, vous ne répondez pas à la petite remarque.....
De plus j'ai testé la procédure et elle fonctionne à merveille, il faut juste préciser le répertoire que vous voulez utiliser....... ?
Soit ; je veux bien voir ce qu'il est possible de faire avec ce nouveau code, mais vous indiquer la quelle est la macro de base ( il y en a 2 ...)... ?

0
senecartour Messages postés 324 Date d'inscription dimanche 12 mai 2013 Statut Membre Dernière intervention 29 octobre 2020 3
3 déc. 2014 à 14:29
Bonjour,

Au fait votre remarque concernait la première version de la macro que m'avez proposé Maurice.
Au fait, j'ai codé à ma méthode et je souhaite extraire mes CSV avec cette méthode.

En réponse à votre question, je vous confirme qu'il y a deux codes:
-Le code princiapal est le premier code
-le deuxième code permet d'enregistrer le fichier csv et il est utilisé en fin du code principal via le nom "EnregistrementFichierCSV".

Merci d'avance pour votre aide.
0
Le Pingou Messages postés 12182 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 7 novembre 2024 1 448
3 déc. 2014 à 15:34
Bonjour,
Merci pour l'information.
Mise au point pour ceci : Au fait votre remarque concernait la première version de la macro que m'avez proposé Maurice.

C'est non il s'agit du code que vous avez mis dans votre message 2.12.2014 à 15:58
Et là je n'ai pas votre réponse pourquoi vous changez le chemin ..... ?
Si vous mélangez tout on ne va pas sans sortir... !

0
senecartour Messages postés 324 Date d'inscription dimanche 12 mai 2013 Statut Membre Dernière intervention 29 octobre 2020 3
3 déc. 2014 à 15:42
Le PINGOU?

Au fait ne vous fiez pas des précédents codes. Comme évoqué dans mon précédent message, merci de tenir en compte que cette nouvelle version de mon fichier. Et je souhaiterais exporter mes CSV avec la méthode déjà commencée dans le fichier.

je vous rejoins une nouvelle fois la version du fichier précédemment postée.
https://www.cjoint.com/c/DLdpXogzYit

Merci d'avance

Partager son savoir est la meilleure façon d'apprendre!
0
Le Pingou Messages postés 12182 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 7 novembre 2024 1 448
Modifié par Le Pingou le 3/12/2014 à 15:56
Bonjour,
Je tiens encore à ceci, eh bien je constate que c'est approximativement la même procédure que je vous avais corrigée en octobre dernier c'est presque un copier/coller... !
Je vous remercie quand même pour la réponse qui manque... ce n'est pas une bonne man......!
Cela dit j'annule tout et je prends en compte votre dernier lien fourni.


Salutations.
Le Pingou
0
senecartour Messages postés 324 Date d'inscription dimanche 12 mai 2013 Statut Membre Dernière intervention 29 octobre 2020 3
3 déc. 2014 à 21:54
Merci Lepingou,
Dans l'attente de votre retour!
0
Bonjour
Voila sans copy
faire les macro le plus simple possible

Sub CreatRepertoire()
Chemin = ActiveWorkbook.Path & "\"
   MonRep = Chemin & "EXP"
      If Dir(MonRep, vbDirectory) = "" Then
         MkDir (MonRep)
      End If
 Call Export(MonRep)
End Sub

Private Sub Export(Chemin)
NonFic = ActiveSheet.Name
Ext = ".csv"
Sep = "^"
Fichier = NonFic & Ext
CheminFiche = Chemin & "\" & Fichier
' --------------
lifin = Cells(Rows.Count, 2).End(xlUp).Row
   Set A = Range(Cells(2, 2), Cells(3, 7))
   Set B = Range(Cells(7, 2), Cells(lifin, 7))
    Set Plage = Union(A, B)
      Open CheminFiche For Output As #1
         For Each Lig In Plage.Rows
            Tmp = ""
               For Each Cel In Lig.Cells
                  Tmp = Tmp & CStr(Cel.Text) & Sep
               Next
            Print #1, Tmp
         Next
      Close
   Set Plage = Nothing
MsgBox "Terminer"
End Sub


A+
Maurice
0
Le Pingou Messages postés 12182 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 7 novembre 2024 1 448
4 déc. 2014 à 11:45
Bonjour,
Ma proposition : https://www.cjoint.com/?3LelZ29VylD

0
senecartour Messages postés 324 Date d'inscription dimanche 12 mai 2013 Statut Membre Dernière intervention 29 octobre 2020 3
4 déc. 2014 à 14:34
Bonjour LePingou,
Super! c'était ce que je voulais. Mais j'ai juste une question.
Dans le fichier CSV généré, je ne souhaite pas obtenir le séparateur à la fin des lignes d'entête et des titres de champs.

Par contre, pour la plage de données, le séparateur doit être exister aussi à la dernière ligne (comme c'est le cas).

Est-il possible de trouver une solution, pour supprimer les séparateur (^) dans les lignes d'entête et de titre du fichier CSV?

Merci d'avance.
0
Le Pingou Messages postés 12182 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 7 novembre 2024 1 448
4 déc. 2014 à 16:11
Bonjour,
Je vous laisse lire cette définition :
Définition : Fichier CSV
CSV est un format informatique permettant de stocker des données tabulaires dans un fichier texte.
Chaque ligne du fichier correspond à une ligne du tableau. Les valeurs de chaque colonne du tableau sont séparées par un caractère de séparation, en général une virgule ou un point-virgule. Chaque ligne est terminée par un caractère de fin de ligne (line break).
Toutes les lignes contiennent obligatoirement le même nombre de valeurs (donc le même nombre de caractères de séparation). Les valeurs vides doivent être exprimées par deux caractères de séparation contigus.
La taille du tableau est le nombre de lignes multiplié par le nombre de valeurs dans une ligne.
La première ligne du fichier peut être utilisée pour exprimer le nom des colonnes

0
senecartour Messages postés 324 Date d'inscription dimanche 12 mai 2013 Statut Membre Dernière intervention 29 octobre 2020 3
4 déc. 2014 à 21:30
Bonsoir Lepingou,
Je vais opter après génération des csv de les ouvrir et de supprimer les (^) à la fin des 1ère et 2ème ligne de mon fichier.

En tout cas merci infiniment d'avoir consacré une partie de votre temps pour résoudre mon problème.

Encore une fois merci beaucou.

0