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

  1. #1
    Futur Membre du Club
    Extraire des données d'un fichier en plusieurs fichiers excel
    Bonjour à tous,
    Désolé si le sujet à déjà été abordé, j'ai un peu fouillé mais je n'ai pas trouvé sur le forum.
    J'ai un gros fichier excel qui contient plus de 20 000 données réparti entre 511 entreprises.
    Donc en gros sur ma première ligne ma colonne A contient le nom de l'entreprise, la B le siren la C le nom d'un employé etc...
    Si l'entreprise à plus d'un salarié j'aurais le nombre de ligne correspondant au nombre de salarié avec toujours en colonne A le nom de l'entreprise.
    Je dois importer les salariés de chaque entreprise dans un outil, et j'ai donc besoin d'un fichier par entreprise.
    Je ne suis pas très calé en Excel, j'ai les base, mais je pense qu'il y a moyen d'extraire grâce à un code toutes les données d'une entreprise dans un autre fichier.

    Je sais pas si j'ai été très clair, je peux préciser si jamais.

    Merci d'avance pour votre aide !
    Tim

  2. #2
    Membre confirmé
    Bonjour timot,

    De quelle nature est le le fichier que tu dois importer ? Quel est l'outil (si ce n'est pas confidentiel) en question ? Si l'outil peut directement récupérer une plage de cellules, cela serait plus pratique que de devoir créer 511 classeurs (ou feuilles).

  3. #3
    Membre éclairé
    Bonjour

    Vite fait sur le gaz, une solution, sans VBA, permet de générer un onglet par entreprise avec autant de lignes que nécessaire : ce sont les pages de filtres du rapport.

    Pour cela, voici comment procéder :
    - créer un Tableau Croisé Dynamique (TCD) basé sur le tableau de départ
    - dans ce TCD, mettre la totalité des champs dans la partie "Lignes" (SAUF le SIRET de l'entreprise). Ou, au moins mettre les champs que l'on veut ensuite consulter (s'ils n'y sont pas tous)
    - dans ce TCD, mettre le SIRET dans la partie "Filtres"
    - pour une meilleure présentation par la suite, en ayant toujours une cellule sélectionné sur le TCD, aller dans l'onglet "Création", puis :
    a) "Disposition du rapport" / "Afficher sous forme tabulaire"
    b) "Totaux généraux" / "Désactivé pour les lignes et les colonnes"
    c) "Sous-totaux" / "Ne pas afficher les sous-totaux"
    - revenir sur l'onglet "Analyse" / "Options du TCD" / "Options" (prendre bien la petite fléche et ne pas cliquer sur le bouton) / "Afficher les pages du filtre de filtres de rapport" / sélectionner le SIRET / OK

    Excel va créer autant de feuilles dans le classeur qu'il trouve de SIRET différents en affichant toutes les colonnes comme dans le TCD.

    Cela ne va pas créer autant de classeurs qu'il y a de SIRET.

    En espérant que cela réponde à votre besoin.

    Bonne journée

    Pierre Dumas
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  4. #4
    Expert éminent sénior
    Le plus simple est de poser un filtre sur les données.
    Tu sélectionnes toutes tes colonnes > Ruban Données > Filtrer.
    Des boutons apparaissent dans tes entêtes. Tu cliques sur celui de ta colonne entreprise > Décoche "Sélectionner tout" > Coche l'entreprise souhaitée.
    Toutes les autres lignes seront masquées (elles ne sont pas supprimées), ce qui permet de les copier facilement.

    Un cran au-dessus, tu peux passer par un filtre avancé.
    Lire ça : https://philippetulliez.developpez.c...dvancedfilter/
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  5. #5
    Membre éclairé
    Citation Envoyé par Menhir Voir le message
    Le plus simple est de poser un filtre sur les données.
    Bonsoir Menhir

    Je suis d'accord que c'est la méthode la plus simple. Mais j'ai proposé l'autre solution car il avait 511 entreprises différentes. Ce qui signifie qu'il devra faire quelques milliers de clics (cocher et décocher les cases du filtre automatique). La méthode que j'ai proposé, qui est certes imparfaite économise quelque peu la souris et le temps de réalisation

    Bonne fin de journée

    Pierre Dumas
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  6. #6
    Expert éminent sénior
    J'avoue, bien humblement, que les TCD sont un de mes talons d'Achile sur Excel.
    J'en ai déjà fait et j'ai une idée assez claire des possibilités qu'ils offrent mais je suis très loin d'en avoir exploré toutes les possibilités, à mon grand tord.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  7. #7
    Expert éminent
    Bonsoir,

    Si un développement par VBA peut être envisagé, alors
    Tu peux consulter cette modeste contribution.

    Je pense toujours à son adaptation à un tableau structuré
    Ajout à 19 H
    Bonsoir Pierre. Justement, en évoquant cette dernière remarque, je pensais à toi.

    Bien Cordialement.

    Marcel

    Envoi d'un bloc de messageries Outlook utilisant des paramètres variables


    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.



  8. #8
    Responsable
    Office & Excel

    Salut.

    Il faut noter que la solution de Pierre, pour rapide qu'elle soit, crée des TCD (511 dans le cas présent) dont le filtre de rapport (ou de page, selon les versions) est pré-rempli. Ca veut dire qu'il faudra encore réaliser un copier-coller spécial valeurs de chaque zone de données du TCD dans un nouveau classeur. Il faut noter également que la copie d'une feuille contenant un TCD dans un nouveau classeur crée une liaison entre ce nouveau classeur et le classeur qui contient les données, et que toutes les données alimentant le TCD (pas seulement celles correspondant au(x) filtre(s), donc) seront disponibles dans chaque nouveau classeur.

    Je pense que dans le cas présent, qui plus est s'il s'agit de créer des classeurs servant à une importation dans un logiciel, le VBA va être de mise.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Responsable
    Office & Excel

    Perso, je ferais de l'Excel en VBA (pour être en accord avec ma signature , mais aussi pour éviter les notions purement informatiques comme le dico)...


    Version 2016 oblige, je travaille bien entendu avec des tableaux structurés. Il faut remarquer que cette solution sur base de tableaux structurés minimise les obligations de position des données dans le classeur. En vue de leur importation dans un logiciel tiers, les données résultantes seront calées en A1, mais la source et le tableau de filtrage peuvent être positionnés n'importe où dans le tableau source. Le nombre de colonnes importe peu car il est variabilisé. Ici, je suis parti sur des pays positionnés en colonne 1 du tableau. On pourrait (devrait) rendre cela plus générique, au prix d'une légère complexification du code et donc de sa compréhension, mais avec comme gain une plus grande adaptabilité du code à une nouvelle situation. Ce sera à toi d'adapter à ta situtation.

    En Excel:
    • j'extrairais les données qui vont donner naissance aux x fichiers dans un tableau structuré spécialement conçu pour;
    • pour chaque ligne de ce fichier, je créerais un nouveau fichier;
    • j'y copierais l'entièreté du tableau;
    • je trierais ce tableau;
    • je supprimerais les lignes superflues par bloc (l'éventuel bloc avant celles à garder puis l'éventuel bloc après celles à garder);
    • j'enregistrerais le nouveau fichier et je le fermerais.


    En VBA...
    Pour cela, fidèle à l'idée d'une architecture qui permet les tests à tous les stades du développement, je créerais des procédures pour chaque traitement traité plus haut. La procédure ExtractDatas est celle qui pilote le processus.

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    Option Explicit
     
    Sub ExtractDatas()
      Dim r As Range
      Dim Source As Range
      Dim Target As Range
      Dim Pos1 As Long
      Dim CountOf As Long
     
      Application.ScreenUpdating = False
      CreateFilterTable
      Set Source = Range("t_données[#all]")
      For Each r In Range("t_pays")
        Set Target = CopyAndGetTarget(Source)
        Pos1 = Application.Match(r.Value, Target.ListObject.ListColumns(1).DataBodyRange, 0)
        CountOf = Application.CountIfs(Target.ListObject.ListColumns(1).DataBodyRange, r.Value)
        If Pos1 = 1 Then
          DeleteLastBlock Target, CountOf
        Else
          DeleteFirstBlock Target, Pos1
          If CountOf < Target.ListObject.ListRows.Count Then
            DeleteLastBlock Target, CountOf
          End If
        End If
        SaveAndClose Target, r.Value, ThisWorkbook.Path
      Next
      Application.ScreenUpdating = True
    End Sub
     
    Sub DeleteLastBlock(Target As Range, CountOf As Long)
      Target(CountOf + 2, 1).Resize(Target.ListObject.ListRows.Count - CountOf, Target.Columns.Count).Delete
    End Sub
     
    Sub DeleteFirstBlock(Target As Range, Pos1 As Long)
      Target(2, 1).Resize(Pos1 - 1, Target.Columns.Count).Delete
    End Sub
     
    Sub CreateFilterTable()
      If Not Range("t_pays").ListObject.DataBodyRange Is Nothing Then Range("t_Pays").ListObject.DataBodyRange.Delete
      Range("t_Données[Pays]").Copy Destination:=Range("t_Pays")
      Range("t_pays").RemoveDuplicates 1, xlGuess
    End Sub
     
    Function CopyAndGetTarget(Source As Range) As Range
      Dim wb As Workbook
     
      Set wb = Workbooks.Add()
      Set CopyAndGetTarget = wb.Worksheets(1).Range("a1")
      Source.Copy Destination:=CopyAndGetTarget
      With CopyAndGetTarget.ListObject.Sort
        .SortFields.Clear
        .SortFields.Add CopyAndGetTarget, xlSortOnValues, xlAscending
        .Apply
      End With
      Set CopyAndGetTarget = CopyAndGetTarget.Resize(, CopyAndGetTarget.ListObject.ListColumns.Count)
    End Function
     
    Sub SaveAndClose(Target As Range, Name As String, Path As String)
      Dim Filename As String
     
      Filename = Path & "\" & Name & ".xlsx"
      If Dir(Filename) <> "" Then Kill Filename
      Target.Parent.Parent.Close True, Filename
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Futur Membre du Club
    Bonjour à tous, et merci pour tous les retours !
    Effectivement la il faut que j'importe un certain nombre de données propre à une entreprise, et cela pour les 511 entreprises, dans le logiciel, donc le VBA me semble plus adapté que les TCD.
    Je vais essayer le code envoyé Pierre et voir si j'arrive à m'en sortir !
    encore merci,
    Tim