Exporter en CSV

Résolu
senecartour Messages postés 391 Statut Membre -  
Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  • 1
  • 2
  1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Bonjour,

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

    0
  2. senecartour Messages postés 391 Statut Membre 3
     
    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
  3. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    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
  4. Maurice
     
    Bonjour

    Voila encore une macro
    regarde bien deja la macro copy

    http://cjoint.com/?0Lco1X50Eqt

    A+
    Maurice
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. senecartour Messages postés 391 Statut Membre 3
     
    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. Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention   1 476
       
      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. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      vous avez testé mon code corrigé ??
      0
  7. Maurice
     
    Re
    Voila

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

    A+
    Maurice
    0
    1. senecartour Messages postés 391 Statut Membre 3
       
      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
  8. senecartour Messages postés 391 Statut Membre 3
     
    Ok! Merci Maurice,
    Je teste et je vous tiens au courant!

    0
  9. Maurice
     
    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
  10. Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention   1 476
     
    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
  11. senecartour Messages postés 391 Statut Membre 3
     
    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
  12. Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention   1 476
     
    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
  13. senecartour Messages postés 391 Statut Membre 3
     
    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
  14. Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention   1 476
     
    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
  15. senecartour Messages postés 391 Statut Membre 3
     
    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
  16. Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention   1 476
     
    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. senecartour Messages postés 391 Statut Membre 3
       
      Merci Lepingou,
      Dans l'attente de votre retour!
      0
  17. Maurice
     
    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
  18. senecartour Messages postés 391 Statut Membre 3
     
    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
  19. Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention   1 476
     
    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
  20. senecartour Messages postés 391 Statut Membre 3
     
    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
  • 2