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 :

[EXCEL & CSV] Import multiple CSV en plusieurs feuilles Excel d'un fichier Excel unique


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2015
    Messages : 8
    Par défaut [EXCEL & CSV] Import multiple CSV en plusieurs feuilles Excel d'un fichier Excel unique
    Bonjour,

    Malgrès mes recherches je n'ai pas trouvé donc si l'information me serait passé sous le nez, veuillez m'en excuser.

    Je cherche à:
    -importer tout les fichiers du format CSV (*.csv) d'un dossier donné vers un unique fichier Excel mais que CHAQUE fichier CSV forme une feuille Excel d'un même document commun Excel.

    Les specifications:
    -automatiser l'action (le coder: VBA dans Excel peut être) ou action manuelle rapide, pas d'import de x fichiers par x actions.
    -faire cet import avec Excel uniquement (j'ai réussi à faire l'import de tout les fichiers CSV dans UNE SEULE FEUILLE EXCEL mais je l'ai fait en language DOS avec un *.CMD) mais moi je cherche par à meller plusieurs language et plusieurs outils.
    -Le nom des fichiers CSV seront fixe et ne changeront pas au cours des mois.
    -1 fichier CSV = 1 feuille Excel d'un Excel commun à tout les fichiers *CSV

    Option:
    -il faudra qu'une fois cet import initial réalisé, je puisse par la suite faire la même opération en concaténant de nouveau fichier CSV donc garder toutes les feuilles de mon Excel et incrémenter chaque feuille par la MàJ de son fichier CSV correspondant.

    Merci de votre aide sur le sujet, je séche un peu.

    pour l'instant j'ai réussi à =
    -importer un par un les fichiers CSV mais a chaque fois ca ouvre un nouveau fichier Excel et non une nouvelle feuille.
    -concaténer tout les fichiers CSV en un seul fichier CSV via un "type dossier1\*.csv >> dossier1\toto.csv" dans DOS mais tout les fichiers se concaténent en une seule ligne et non une ligne par ligne (il n'y a pas de saut de ligne)

  2. #2
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Bonjour,


    tu peut utiliser une QueryTable qui te permet de définir l'endroit ou importer ton csv ... regarde ce code légèrement adapté de ce que donne l'enregistreur de macros :


    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Sub LanceImportation()
        ImporteCsv "C:\Users\OneDrive\IMPORT\_VarSimulAnalogique.csv", ThisWorkbook.Sheets("Feuil4")
     
    End Sub
     
    Sub ImporteCsv(stFichier As String, sh As Worksheet)
     
        Dim c As Range 'Cellule destination
     
        Set c = sh.Cells(sh.Rows.Count, 1).End(xlUp)
        If c <> "" Then Set c = c.Offset(1, 0) 'décale d'une ligne si la ligne n'est pas vide...
     
        With sh.QueryTables.Add(Connection:= _
            "TEXT;" & stFichier _
            , Destination:=c) 'cellule destination
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 1252
            .TextFileStartRow = IIf(c.Row = 1, 1, 2)  '  ==> prends la 1° ligne du fichier CSV seulement si feuille destination est vide... sinon saute l'entête...
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = False
            .TextFileSemicolonDelimiter = True ' Point virgule démiliteur
            .TextFileCommaDelimiter = False
            .TextFileSpaceDelimiter = False
            ' .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1) ' ==> à adapter ..si type particulier style date ....
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
            .Delete ' ==> SUPPRIME LIAISON à TABLE DE DONNEE
     
     
        End With
     
    End Sub

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2015
    Messages : 8
    Par défaut
    Merci.

    1- Et donc il faudrait que je crée autant de ligne' "importecvs" dans la fonction lanceimportation que j'ai_ de fichier CSV dans mon dossier.
    il faudrait que je les énumére tous si je comprends bien?

    2- je n'ai pas compris la différence entre les deux lignes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        If c <> "" Then Set c = c.Offset(1, 0) 'décale d'une ligne si la ligne n'est pas vide...
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        .TextFileStartRow = IIf(c.Row = 1, 1, 2)  '  ==> prends la 1° ligne du fichier CSV seulement si feuille destination est vide... sinon saute l'entête...
    Ton bout de code écrit à la fin d'une feuille en dernière ligne ou cherche à écrire uniquement si la feuille est vide?
    Je ne comprends pas bien la deuxième ligne de code.
    Pour info mes fichiers CSV n'auront pas d'entête, ce sera de la data uniquement du style:
    ID	Date	Label	Value
    1	AAAAMM	Lab1	Val1
    2	AAAAMM	Lab2	Val2
    3	AAAAMM	LabX	ValX

    3- Ta table de donnée c'est ton fichier CSV en gros?
    Donc quand tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With sh.QueryTables.Add(Connection:= _
            "TEXT;" & stFichier _
            , Destination:=c)
    et ensuite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Delete ' ==> SUPPRIME LIAISON à TABLE DE DONNEE

    ta connection se fait sur le "stFichier"
    pourquoi il faut .delete?
    C'est l'utilisation basique du QueryTables? ou plus communément du "c'est comme ca!" ?

  4. #4
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    1/ Non tu utilise la fonction Dir (il y as plein d'exemple sur le forum) et tu boucle sur tous les fichiers *.csv de ton dossier..

    2/ Ce code est pour gérer l'entête...

    déjà si la feuille est vide le End(xlup) renvoi la ligne 1 .. donc on peu commencer à écrire sur cette ligne (vu qu'elle est vide..)

    mais si la feuille n'est pas vide le End(Xlup) renvoi la dernière ligne non-vide , on écrit donc dans la ligne suivante .. d'ou l'offset de 1 si la ligne n'est pas vide..

    avec .TextFileStartRow , tu défini à partir de qu'elle de ton fichier texte tu effectue l'importation ... si tu n'as pas de ligne d'entête tu met 1 , sinon tu met 2 ..pour sauter la ligne d'entête..

    tu dis ne pas avoir de ligne d'entête , mais alors pourquoi nous montre tu un exemple avec une ligne d'entête ..?


    3/ oui la table de donnée c'est l'import du fichier CSV ... la destruction c'est pour supprimer la liaison et conserver seulement les données du fichiers ... ( si tu ne détruit pas toute modification de ton Csv est reportée dans ton fichier excel..)



    ...

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2015
    Messages : 8
    Par défaut
    1- ok, je vais chercher.

    2-Ok.
    Ps:L'entête sera créé une première fois dans les feuilles du fichier Excel à la création de celui ci.
    J'ai donnée en exemple car j'ai été un peu fainéant et j'ai fait un Ctrl+C&V mais j'ai juste à titre indicatif
    Les fichiers ne seront bien que datas.
    AAAAMM Lab1 Val1
    AAAAMM Lab2 Val2
    AAAAMM LabX ValX

    3-Ok.

    Merci de ton aide, je vais tâcher de me débrouiller avec cela.

  6. #6
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2015
    Messages : 8
    Par défaut
    Rebonjour et Meilleurs Voeux au passage,

    Je viens donners des news:
    Alors j'ai essayé de changer les attributs dans tout les sens des 2 lignes suivantes car l'écriture ne se faisait pas correctement (au mieux j'écrivais en me déplacant en dernière colonne mais sans jamais réussir à changer de ligne)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Set c = sh.Cells(sh.Rows.Count, 1).End(xlUp)
    If c <> "" Then Set c = c.Offset(1, 0)
    J'ai finalement réussi en supprimant la ligne suivante qui rentrais en contradiction avec les commandes précédents:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .TextFileStartRow = IIf(c.Row = 1, 1, 2)
    Maintenant, j'arrive à écrire en fin de tableau.

    Je cherche désormais à réaliser l'opération pour un ensemble de fichiers *.CSV contenu dans un dossier et faire le même travail que si dessus sur un autre fichier Excel mais dans celui-ci les données iraient s'écrirent en venant s'insérer avant les autres données du tableau.

    Mon problème étant que partant du principe que j'ai 5 fichiers CSV:
    Je voudrais un fichier Excel avec 5 feuilles ayant pour nom :le nom du fichier CSV en question.
    Par exemple si le fichier toto3.csv n'était pas présent je voudrais quand même avoir une feuille s'appellant "toto3" même si elle ne contient pas de donnée.

    Deux option (je pense) s'offrent à moi:
    -option1: soit mon fichier Excel est déjà créé ET contient toutes les feuilles avec leur noms respectifs créé: je ne peux donc pas utiliser de fonction DIR
    -option2:soit mon fichier Excel ne contient aucune feuille et je les crée lors de l'import mais si un fichier est manquant je n'ai pas sa feuille.


    Je pourrais très bien compter le nombre de fichier présent dans le dossier et mettre une condition d'avoir le bon nombre avant de lancer l'import mais je ne souhaite pas être bloqué pour la suite de mes actions s'ils manquent des fichiers.

    Je pense déjà opter pour l'option1. (Qu'en pensez vous?)
    Maintenant opter pour cet option m'obligerais à déclarer tout mes fichiers et toutes mes feuilles dans ma fonction d'import. (pas térrible)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub LanceImportation()
    ImporteCsv "D:\toto1.csv", ThisWorkbook.Sheets("toto1")
    ImporteCsv "D:\toto2.csv", ThisWorkbook.Sheets("toto2")
    ImporteCsv "D:\totoX.csv", ThisWorkbook.Sheets("totoX")
    End Sub
    De plus si le fichier "toto1.csv" OU que la feuille "toto1" par exemple n'éxistait pas; j'aurais un joli message d'erreur.

    Pouvez vous m'aider à:
    1: Ne pas avoir d'erreur si un fichier de l'import n'était pas présent.
    2:inserer le nombre de ligne que le fichier CSV contient avant toutes les données d'une feuille en question.(j'ai éssayé avec un c.Offset(rowoffset:=-1, columnoffset:=0) mais ça ne fonctionne pas)


    EDIT: j'ai réussi l'insertion en début:

    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
    Sub InsertLigne(stFichier As String)
     
    Dim NbLigneCsv As Long
    Dim Ligne As Long
    Dim intFic As Integer
    Dim strLigne As String
     
    intFic = FreeFile
    Open stFichier For Input As intFic
    While Not EOF(intFic)
        Line Input #intFic, strLigne
        NbLigneCsv = NbLigneCsv + 1
    Wend
    Close intFic
    Ligne = 0
     
        Do
        Rows("1:1").Select
        Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        Ligne = Ligne + 1
        Loop Until Ligne = NbLigneCsv
    End Sub
    3: me conseiller si j'ai dit des bétises.


    Ps: il me faut absolument automatiser le plus possible et penser aux erreurs probable et avoir toutes les feuilles Excels (même vide) avec le bon nom car je dois travailler des graphes à partir d'un autre fichier Excel qui iront se mettre à jours automatiquement via le nom du fichier qui contient les datas et les noms des feuilles.
    Même si la feuille en question est vide, j'aurais juste un graphique plat ce qui n'est pas grave.
    Je souhaite que les données les plus à jours soient en haut de tableau car dans ce cas je n'aurais pas à gérer le changement des cellules de mes graphiques en fonction des mois.

  7. #7
    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, bonjour !
    Moi pas comprendre !

    Citation Envoyé par Foxsoilleur Voir le message
    pour l'instant j'ai réussi à =

    -importer un par un les fichiers CSV mais a chaque fois ca ouvre un nouveau fichier Excel et non une nouvelle feuille.
    Quoi que c'est-y donc qui empêche de copier la feuille du nouveau fichier Excel ( un classeur temporaire !)
    vers le classeur voulu puis fermer ce nouveau fichier ?

    Sinon voir du côté du menu Données, Import à partir d'un fichier
    C'est l'objet QueryTable en VBA, plein d'exemples dans les discussions de ce forum.
    Rien qu'en activant l'Enregistreur de macros, une base de code est livrée sur un plateau !

    ______________________________________________________________________________________________________
    Je suis Paris, Charlie, …

  8. #8
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2015
    Messages : 8
    Par défaut
    Il y a du vécu, je n'en suis plus la

  9. #9
    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

    QueryTables.Add est la méthode directe pour charger un fichier texte - donc un csv - dans un endroit précis
    d'une feuille de calculs tout en séparant les données en colonnes comme documenté dans l'aide VBA interne !

    Sinon poser une question claire et exhaustive sur une difficulté ou un point technique précis …

Discussions similaires

  1. Importer les données d'une feuille d'un autre fichier excel
    Par palpyroth dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/10/2015, 09h26
  2. lecture ou importation multiple CSV
    Par stomerfull dans le forum Langage
    Réponses: 5
    Dernier message: 02/10/2012, 17h55
  3. Réponses: 4
    Dernier message: 26/11/2009, 12h00
  4. import de données de plusieurs feuilles dans une seule
    Par naevus dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 10/01/2008, 13h32
  5. Import de texte sur plusieurs feuilles
    Par maestro1303 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/04/2007, 01h02

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