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 :

Extraction de données de plusieurs fichiers csv et compilation dans un fichier xlsm


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Extraction de données de plusieurs fichiers csv et compilation dans un fichier xlsm
    Pour accélérer des recherches généalogiques, je cherche à extraire de plusieurs « fichiers.CSV » (« Deces-1970.csv », « Deces-1971.csv », « Deces-xxx.csv », etc… des données contenant une chaine de caractères particulière (un nom) qui sera saisie sur le fichier « Recherche données Insee.xlsm » onglet formulaire en D5, afin d’éviter de le modifier à chaque utilisation dans la procédure VBA.
    J’ai déjà adapté le contenu ci-dessous pour sélectionner l’onglet « Extraits » pour y copier les données extraites. Celui-ci fonctionne parfaitement, avec un seul fichier.csv, mais avec l’ensemble des données.
    Afin de n’effectuer qu’une manipulation et ne rapatrier que les lignes qui m’intéressent, sur les 600000 lignes et 9 colonnes de la cinquantaine de fichiers existants, j’aimerai pouvoir travailler soit sur un fichier unique qui concerne une année, avec le VBA ci-dessous, et sur un ensemble de plusieurs fichiers.csv, afin qu’il cumule les données (en fonction du critère de sélection), dans l’onglet « Extraits » en améliorant le contenu VBA ci-dessous.
    J’ai essayé plusieurs choses, mais mes connaissances en VBA étant limitées, et ne pratiquant qu’occasionnellement en adaptant des macros à mes besoins, je n’arrive pas à faire une sélection multiple, ni ajouter à l’existant des données des autres fichiers.

    Si quelqu’un a une idée, une suggestion, elle sera bienvenue.

    Je joins deux fichiers réduits des données.csv et le fichier de recherche qui contient la procédure Vba.

    Je n'ai pas pu transmettre les fichiers déces-xxx.csv. Je les ai transformé en xlsx. CSV n'est pas une extension valide de pièce jointe, qu'il serait pourtant intéressant d'activer.

    Merci d’avance.
    Cordialement,
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 239
    Points : 5 610
    Points
    5 610
    Par défaut
    Bonjour,

    Une façon de faire:
    - rassembler dans un seul fichier tous les fichiers deces-*.csv dans un seul ficher nommé tout.csv (pour cela je passe un fichier bat)
    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
    Option Explicit
     
    Sub AjoutFichier(sText As String, sNomFichier As String)
        Dim sFich As String
        sFich = ThisWorkbook.Path & "\" & sNomFichier
        On Error Resume Next        '--- erreur si fichier n'existe pas
        Kill sFich
        On Error GoTo 0
        Open sFich For Output As #1
        Print #1, sText
        Close #1
    End Sub
     
    Sub ToutEnsemble()
        '--- rassemble tous les fichiers dont le nom est de la forme "deces-*.csv"
        '--- dans un seul fichier nommé "tout.csv"
        '--- note: la ligne de titre est récupérée autant de fois qu'il y a de fichiers
        Dim sText As String
        '--- crée le fichier bat
        sText = "Set loc=" & ThisWorkbook.Path & vbCrLf & _
                "Copy deces-*.csv tout.csv"
        AjoutFichier sText, "tout.bat"
        DoEvents
        '--- crée le fichier schema.ini (indispensable pour une bonne connexion)
        sText = "[tout.csv]" & vbCrLf & _
                "ColNameHeader = True" & vbCrLf & _
                "Format=Delimited(;)"
        AjoutFichier sText, "schema.ini"
        DoEvents
        '--- exécute le fichier bat
        sText = ThisWorkbook.Path & "\tout.bat"
        ChDir ThisWorkbook.Path '--- indispensable pour que le bat fonctionne
        Call Shell(sText)
    End Sub
    - faire une connexion sur ce fichier et extraire les noms (à noter qu'il faut pour cela utiliser un fichier schema.ini).
    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
    45
    46
    Option Explicit
     
    '--- activer les références:
    '--- Microsoft ActiveX Data Objects
    '--- Microsoft ActiveX Data Objects Recordset
     
    Sub ListerNoms()
        Dim xlcon As ADODB.Connection
        Dim xlrs As ADODB.Recordset
        Dim nextRow As Integer
        Dim sLeNom As String
        '---
        Set xlcon = New ADODB.Connection
        Set xlrs = New ADODB.Recordset
        sLeNom = Range("D5").Value
        Range("D5").Value = UCase(sLeNom)   '--- force la mise en majuscules
        sLeNom = Range("D5").Value
        '---
        xlcon.Provider = "Microsoft.ACE.OLEDB.12.0"
        xlcon.ConnectionString = "Data Source=" & ThisWorkbook.Path & ";Extended Properties=""text;HDR=Yes;FMT=Delimited"""
        xlcon.Open
        xlrs.Source = "SELECT * FROM [tout.csv] WHERE nomprenom LIKE '" & sLeNom & "%'"
        xlrs.Open xlrs.Source, xlcon, adOpenStatic, adLockReadOnly
        '---
        If xlrs.PageCount = 0 Then
            MsgBox "Aucun résultat", , "Pour info"
        Else
            xlrs.MoveFirst
            Worksheets("Extraits").Select
            nextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
            Worksheets("Extraits").Cells(nextRow, 1).CopyFromRecordset xlrs
        End If
        xlrs.Close
        xlcon.Close
        Set xlrs = Nothing
        Set xlcon = Nothing
        DeleteConnections
    End Sub
     
    Sub DeleteConnections()
        Dim Conn As Object
        For Each Conn In ThisWorkbook.Connections
            Debug.Print Conn.Name
            Conn.Delete
        Next Conn
    End Sub
    Il est supposé que tous les fichiers se trouvent dans le même dossier.
    Bonne continuation.
    Fichiers attachés Fichiers attachés

  3. #3
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 925
    Points
    55 925
    Billets dans le blog
    131
    Par défaut
    Salut.

    C'est pile poil le boulot de Power Query , réalisé en 3 clics de souris pour ce qui est de combiner les fichiers.


    Nom : 2021-05-09_104154.png
Affichages : 151
Taille : 162,1 Ko


    Sur base de fichiers formés comme celui qui suit et stockés dans un même dossier, on récupère les données avec en prime l'info de la source

    Nom : 2021-05-09_104305.png
Affichages : 134
Taille : 4,1 Ko

    Nom : 2021-05-09_104355.png
Affichages : 138
Taille : 8,8 Ko


    Attention au codages des infos. Il y a de fortes chances que le format soit UTF-8, à adapter à l'ouverture de la requête

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Merci beaucoup,
    Citation Envoyé par EricDgn Voir le message
    [...]
    Bonjour,

    Votre proposition fonctionne parfaitement.

    A ce jour le nombre de "fichiers.csv" dont je dispose est de 58, ce nombre augmente de 1 tous les ans. Chaque fichier a une taille de 35 000 à 66 000 Ko, soit de 32 000 à 70000 lignes.

    Pour ma part j'avais plutôt imaginé extraire successivement les données recherchées dans chaque fichier.csv et les coller dans l'onglet extrait, plutôt que de cumuler tous les csv complets dans un seul fichier avant d'extraire les données recherchées.

    De plus, chose que j'avais omise dans ma demande initiale, il serait intéressant que le nom des fichiers desquels sont extrait les données, apparaissent en colonne A de l'onglet "Extrait.

    Une suggestion, une idée??

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 940
    Points : 28 938
    Points
    28 938
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    De plus, chose que j'avais omise dans ma demande initiale, il serait intéressant que le nom des fichiers desquels sont extrait les données, apparaissent en colonne A de l'onglet "Extrait.
    D'où l'intérêt d'utiliser PowerQuery comme proposé par Pierre, que je salue au passage.
    C'est nativement proposé par Excel, pas besoin de VBA et on peut l'utiliser dans des classeurs suffixés xlsx

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,

    D'où l'intérêt d'utiliser PowerQuery comme proposé par Pierre, que je salue au passage.
    C'est nativement proposé par Excel, pas besoin de VBA et on peut l'utiliser dans des classeurs suffixés xlsx
    Surement une solution, mais c'est un domaine que je ne maitrise absolument pas. Merci quand même pour la suggestion. Cordialement,

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/07/2020, 09h49
  2. [2005] Extraction de données depuis un fichier CSV
    Par alaabed dans le forum SSIS
    Réponses: 3
    Dernier message: 22/04/2011, 14h07
  3. Extraction de données d'un fichier csv
    Par freyr dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 24/11/2010, 09h08
  4. [VB]extraction de données d'un fichier
    Par latevi dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/01/2006, 12h03
  5. Extraction de données sur des fichiers excel
    Par iupgeii dans le forum MFC
    Réponses: 3
    Dernier message: 23/01/2004, 13h53

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