IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Macro de conversion EXCEL vers CSV et choix destination du fichier CSV [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2016
    Messages : 8
    Par défaut Macro de conversion EXCEL vers CSV et choix destination du fichier CSV
    Bonjour,

    Je suis nouveau sur ce site et j'aimerais quelques informations concernant la programmation en VBA (je suis débutant en VBA).

    Je suis en train de mettre au point une macro qui transformerait mon tableau excel (Excel 2007) en un fichier csv et le placerait dans un dossier que je choisit.

    1. La conversion

    Durant cette étape, je souhaite que ma macro génère un nouveau fichier au format csv contenant les informations du tableau excel (mon fichier excel de base reste intacte : son extension reste du xls, et il garde l'ensemble de ses données).

    2. La sauvegarde dans un fichier choisit

    Une fois le fichier csv généré, je souhaiterais choisir le dossier de destination du fichier (pour ne pas le laisser dans le même répertoire que l'excel ou qu'il apparaisse dans le répertoire par défaut).


    J'ai actuellement mis au point un code qui fait ce que je lui demande mais c'est de la bidouille :
    - ma conversion en csv prend en compte le nombre de lignes et de colonnes de mon doc => une modification de mon excel engendre une modification de la macro;
    - le fichier csv généré file directement dans le répertoire par défaut (Mes Documents) et je dois le déplacer vers le dossier que je souhaite.



    J'aimerais donc un code qui lors de la création du fichier csv le place directement dans le répertoire de mon choix.

    Voici mon code actuellement, j'ai séparé les deux étapes pour que ce soit plus clair :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Sub Extraction()
    Dim Plage As Object, oL As Object, oC As Object, Tmp$, Sep$
    Sep = ";"
    Set Plage = ActiveSheet.Range("A1:W1" & ActiveSheet.Range("A50").End(xlUp).Row)
    Open "Fichier.csv" For Output As #1
    For Each oL In Plage.Rows
    Tmp = ""
    For Each oC In oL.Cells
    Tmp = Tmp & CStr(oC.Text) & Sep
    Next
    Print #1, Tmp
    Next
    Close
     
    Const Source = "C:\Users\Franc\Documents\Fichier.csv"
    Const Destin = "C:\Users\Franc\Desktop\Modèles\CSV\Fichier.csv"
    Dim objOFS As Variant
    Set objOFS = CreateObject("Scripting.FileSystemObject")
    If (objOFS.FileExists(Source)) Then
    objOFS.moveFile Source, Destin
    End If
    Set objOFS = Nothing
     
    End Sub
    Merci d'avance pour la lecture et les réponses à mon poste et si je n'ai pas été assez claire n'hésitez pas à me le dire j'expliquerai la chose avec plus de détails.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Si tu commençais par utiliser l'enregistreur de macro, je pense que ça pourrait te donner une piste.
    Pour la sauvegarde en CSV, clique droit sur l'onglet à copier, sélectionne Déplacer ou Copier..., coche la boîte Créer une copie, sélectionne "Nouveau classeur" en haut et sauvegarde ce nouveau classeur sous... en changeant le format en csv.

  3. #3
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut, à voir : Conversion de fichiers Excel, sans doute à adapter à ton contexte.
    Images attachées Images attachées  

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2016
    Messages : 8
    Par défaut
    Bonsoir Parmi,

    Merci de ta réponse, j'ai fait ce que tu m'as dit mais le problème est le suivant : lorsque j'exécute la macro, que j'ai préalablement enregistrée, X fois il me génère X fichiers différents (Classeur1 à ClasseurX). J'ai donc revu la procédure et fais exprès de choisir le nom du classeur déjà existant comme ça la modification se fait dans le même ficher et supprimer l'ancienne feuille et renommé la nouvelle, mais l'objectif de ma démarche est de générer un nouveau document lors de la première sauvegarde et d'écraser le fichier (remplacer ses valeurs) lors des sauvegardes suivantes, par conséquent ma copie CSV n'aura toujours qu'un seul onglet. Enfin, cette manipe modifie mes boutons associés à des macros et les rend inutilisables (j'ai créé un bouton Remise A Zéro pour réinitialiser le contenu du tableau et un bouton "envoie" pour assurer la fonction que j'essaie de coder avec ton aide).

    Je vais t'expliquer plus en profondeur mon objectif, car je pense ne pas avoir été assez précis : Après avoir remplis mon fichier excel dans un dossier X , je souhaite qu'une copie des infos soit créée dans un dossier Y (via la macro) et que cette copie soit en format csv. Si je suis amené à modifier mon tableau excel dans le dossier X la copie que je génère doit remplacer le fichier existant dans le dossier Y (cette modification ne doit pas engendrer de modification du nom du fichier, elle doit simplement modifier le contenu du fichier).
    La finalité de cette démarche est qu'avec l'aide d'un logiciel de base de données (SAP), chaque jour, les infos du fichier en CSV soient archivées, puis le fichier CSV supprimé (d'où la nécessité de générer le fichier en premier lieu) afin d'éviter les doublons, et cela sans jamais toucher au tableau excel dans le dossier X (le fichier excel est comme une interface en fait, il ne sert qu'à rentrer des infos et la macro les convertis en CSV).

    C'est pour ça que la première partie de mon code me va, dans le sens où il crée une copie csv distincte de mon tableau xls. Par contre, il dépend des lignes et colonnes rentrées, on ne peut pas choisir la destination du fichier et lorsque j'enregistre de nouveau il me dit que le fichier est déjà existant.

    Les ActiveWorkBook.SaveAs ne sont pas de bonnes solutions non plus car le tableau xls est modifié : il devient un fichier csv.

    J'espère avoir été plus clair sur mon problème.

    Merci encore Parmi.

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Je n'ai pas très bien compris tes explications... désolé...

    Pour explication, lorsque tu fais une copie de ton onglet (en cochant la case), la feuille originale demeure dans le fichier Excel telle qu'elle était et "une image de celle-ci" est créée.
    Quand tu sauvegardes cette copie en type CSV, le nouveau fichier n'est plus un fichier Excel mais bel et bien un csv ouvert dans Excel.

    Un fichier csv ne peut contenir plus d'un onglet puisque c'est un fichier texte en réalité...

    Si tu veux remplacer un fichier existant, tu peux supprimer celui-ci avant la sauvegarde
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Dir(MonChemin & MonFichier) <> "" Then 'il existe
    Kill MonChemin & MonFichier  'on supprime l'existant
    Activeworkbook. SaveAs MonChemin & MonFichier .....  'ici Activeworkbook est le fichier créé (ouvert dans Excel) qui va devenir un CSV
    Si c'est le chemin que tu ne connais pas d'avance, tu peux le demander
    Ici Fichier retournera le chemin et le nom demandé.
    Il ne reste qu'à SaveAs ce nom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim fichier
    fichier = Application.GetSaveAsFilename
    MsgBox fichier
    S'il faut que tu ajoutes des données à un fichier existant, alors là, ma méthode ne fera pas l'affaire...
    Il faudra traiter le csv comme un fichier texte un peu comme tu le fais dans le code que tu as montré (Open, Print,...)

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour !

    Citation Envoyé par PeakyFran Voir le message
    Les ActiveWorkBook.SaveAs ne sont pas de bonnes solutions non plus car le tableau xls est modifié : il devient un fichier csv.
    Et la méthode SaveCopyAs comme indiquée depuis l'aide VBA de SaveAs !

    _________________________________________________________________________________________________________
    Je suis Paris, Charlie, Bruxelles, …

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2016
    Messages : 8
    Par défaut
    Merci beaucoup pour vos postes, je sens que je touche au but.

    J'ai repris ce que tu m'avais écris Parmi avec le If sur l’existence du fichier et sa destruction, et ça marche comme le fichier sera toujours à la même place (j'ai fais les 2 cas : avec fichier existant et sans fichier). Le seul problème que j'ai maintenant c'est que le fichier csv est avec des "," et non avec des ";" j'ai pensé à ajouter la fonction "Replace" mais ça ne marche pas (peut être que je ne la met pas au bon endroit : je la mettais après le premier "ActiveWorkbook.Save"[14] et je sauvegardais à nouveau ). Et le dernier petit truc serait de masquer les fenêtres qui s'ouvrent du genre "Voulez vous écraser le fichier ?" et répondre "Oui" automatiquement, je pense avoir trouvé le truc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Application.DisplayAlerts = False
    ActiveWorkBook.Save
    Application.DisplayAlerts = True
    J'ai vu aussi pour SaveCopyAs mais il faut quand même supprimer le fichier s'il existe déjà.

    Mais voici mon code en gros pour le moment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Sub Creer()
        'Supprimer le fichier existant
        If Dir("C:\Users\vpc\Desktop\Modèles\CSV\Act_Ann.csv") <> "" Then
        Kill ("C:\Users\vpc\Desktop\Modèles\CSV\Act_Ann.csv")
        End If
     
        'Générer un fichier au format csv
        Sheets("Modèles").Select
        Sheets("Modèles").Copy
        ChDir "C:\Users\vpc\Desktop\Modèles\CSV"
        ActiveWorkbook.SaveAs Filename:= _
            "C:\Users\vpc\Desktop\Modèles\CSV\Act_Ann.csv", FileFormat:=xlCSV, _
            CreateBackup:=False
        ActiveWorkbook.Save
        ActiveWindow.Close
    End Sub

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2016
    Messages : 8
    Par défaut
    J'ai réglé le problèmes des fenêtres qui s'ouvrent donc ça c'est fait, c'est juste les virgules dans le fichier ... J'ai regardé sur différents sites concernant ce problème lié aux configs de Microsoft (panneau de configuration > Région et Langue) mais ce n'est pas ça car mon séparateur de liste est bien un point virgule ...

    J'ai donc revu mon code et bidouillé qqc pour changer les "," en ";" mais ça ne marche pas

    Voici mon Code remanié. Je pense que les 2 premières étapes sont closes me manque que les ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Sub Envoyer()
     
        'Supprimer le fichier existant
        If Dir("C:\Users\vpc\Desktop\Modèles\CSV\Act_Ann.csv") <> "" Then
        Kill ("C:\Users\vpc\Desktop\Modèles\CSV\Act_Ann.csv")
        End If
     
        'Générer un fichier au format csv
        Sheets("Modèles").Select
        Sheets("Modèles").Copy
        ChDir "C:\Users\vpc\Desktop\Modèles\CSV"
        ActiveWorkbook.SaveAs Filename:= _
            "C:\Users\vpc\Desktop\Modèles\CSV\Act_Ann.csv", FileFormat:=xlCSV, _
            CreateBackup:=False
        Application.DisplayAlerts = False
        ActiveWorkbook.Save
        ActiveWindow.Close
        Application.DisplayAlerts = True
     
        'Remplacer les , en ;
        Workbooks.Open Filename:="C:\Users\vpc\Desktop\Modèles\CSV\Act_Ann.csv"
        Cells.Replace What:=",", Replacement:=";", LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
        Application.DisplayAlerts = False
        ActiveWorkbook.Save
        ActiveWindow.Close
        Application.DisplayAlerts = True
     
    End Sub

  9. #9
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2016
    Messages : 8
    Par défaut
    Pour te répondre Marc-L j'ai fait le SaveCopyAs en précisant l'extension csv mais le fichier généré lors de son ouverture (en cliquant dessus) rebascule sous un format de tableau si je l'ouvre avec excel ou a des hiéroglyphes si je l'ouvre avec bloque note. Donc je pense rester avec ma version du code.
    Mais c'est très étrange car en le faisant à la main : enregistrer le fichier sous , format csv avec point virgule le fichier a des points virgules mais en automatisant le truc il me donne des virgules.

    J'ai aussi essayé la fonction Local := True dans SaveAs mais en vain ce n'est pas ça .

    Merci en tout cas du temps que vous me consacrez.

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2016
    Messages : 8
    Par défaut
    C'est bon j'ai ma solution .... C'était vraiment pas grand chose .... Merci à tous pour votre aide.

    Voici mon code final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Sub Envoyer()
     
        If Dir("C:\Users\vpc\Desktop\Modèles\CSV\Act_Ann.csv") <> "" Then
        Kill ("C:\Users\vpc\Desktop\Modèles\CSV\Act_Ann.csv")
        End If
     
        Dim Plage As Object, oL As Object, oC As Object, Tmp$, Sep$
        Sep = ";"
        Set Plage = ActiveSheet.UsedRange
        Open "C:\Users\vpc\Desktop\Modèles\CSV\Act_Ann.csv" For Output As #1
        For Each oL In Plage.Rows
        Tmp = ""
        For Each oC In oL.Cells
        Tmp = Tmp & CStr(oC.Text) & Sep
        Next
        Print #1, Tmp
        Next
        Close
     
    End Sub
    Merci Parmi, Marc-L et Kiki29

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Conversion Excel vers pdf en Delphi
    Par toutou2000 dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 14/11/2008, 18h31
  2. [VBA-E] macro conversion excel vers csv
    Par abdelhamidem dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/10/2008, 17h48
  3. conversion excel vers access
    Par k_boy dans le forum Access
    Réponses: 4
    Dernier message: 01/10/2007, 16h23
  4. conversion excel vers open office
    Par djedje37et28 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/05/2007, 15h29
  5. [VBA-E] macro conversion excel vers csv
    Par baboune dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 15/07/2004, 10h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo