Exporter en CSV

Résolu
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.



--
Partager son savoir est la meilleure façon d'apprendre!

21 réponses

Résumé de la discussion

Plusieurs utilisateurs souhaitent exporter vers CSV, via VBA, uniquement les plages de données qu'ils ont sélectionnées après les avoir définies, mais ils rencontrent des erreurs lors de l'exécution du code d'export. Les solutions proposées préconisent de créer un répertoire d'export, de combiner les plages via Union et d'écrire chaque ligne à l'aide d'un séparateur dédié, tout en exportant directement depuis la feuille active. Des ajustements évoqués portent sur le respect du chemin d'enregistrement et l'organisation des fichiers dans des sous-répertoires nommés d'après l'onglet afin que le CSV soit stocké au bon endroit sans duplication.

Bobot (l’IA à votre service)
  1. Bonjour,
    Si vous procédez de la sorte votre fichier serra corrompu pour l'utilisateur qui devra s'en servir, car ce n'est plus le format d'un tel fichier CSV.
    Conclusion, faire un tel remue-ménage pour en arriver là c'est vexant... !
    Libre à vous de le faire et je ne veux même pas en savoir la raison... !

    0
    1. 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
      1. 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
        1. 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
          1. 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
            1. 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
              1. Merci Lepingou,
                Dans l'attente de votre retour!
                0
            2. 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
              1. 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
                1. 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
                  1. 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
                    1. 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
                      1. 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
                        1. 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
                          1. Ok! Merci Maurice,
                            Je teste et je vous tiens au courant!

                            0
                            1. Re
                              Voila

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

                              A+
                              Maurice
                              0
                              1. 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
                            2. 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
                              1. Bonjour,
                                Eh bien il fonctionne très bien, il faut juste le copier et la coller dans votre navigateur internet....!
                                Salutations
                                Le Pingou
                                0
                              2. Modérateur
                                vous avez testé mon code corrigé ??
                                0
                            3. Bonjour

                              Voila encore une macro
                              regarde bien deja la macro copy

                              http://cjoint.com/?0Lco1X50Eqt

                              A+
                              Maurice
                              0
                              1. Modérateur
                                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
                                1. 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
                                  • 1
                                  • 2