1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant en finance de marché
    Inscrit en
    janvier 2017
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant en finance de marché

    Informations forums :
    Inscription : janvier 2017
    Messages : 36
    Points : 18
    Points
    18

    Par défaut Split d'une worksheet en plusieurs classeurs

    Bonjour,

    j'ai un fichier de plusieurs milliers de lignes, je souhaiterais spliter ce fichier qui est sur une seule sheet en X classeurs distincts de X lignes avec la première ligne qui reste toujours étant l'intitulé des colonnes.

    J'ai quelques bases en macro et VBA et j'ai pas mal chercher sur le forum mais je n'ai pas trouvé de discussion qui se rapproche de ça et je ne sais par ou commencer ma macro pour atteindre le résultat.

    Si qq'un est susceptible de m'aider ou de me fournir des pistes, je suis preneur.

    Si besoin de précision n'hésitez pas.

    En vous remerciant par avance.

  2. #2
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    juillet 2012
    Messages
    4 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : juillet 2012
    Messages : 4 394
    Points : 8 400
    Points
    8 400
    Billets dans le blog
    5

    Par défaut

    Bonjour,

    sur quel critère tu te bases pour identifier les lots de lignes à grouper ? Une quantité de X lignes ou des critères de valeurs dans certaines de tes colonnes ?

  3. #3
    Membre chevronné
    Homme Profil pro
    Responsable des études
    Inscrit en
    juillet 2014
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2014
    Messages : 1 173
    Points : 2 208
    Points
    2 208

    Par défaut

    edit: mal compris la demande
    edit2:@Oudouner non mon code n'est pas bon dans ce cas il sépare suivant les valeurs et non suivant un certain nombres de lignes

    edit3: code fonctionel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub aa()
    nbl = 3 'nombre de ligne par classeur
    nbc = 4 'nombre de classeur
    For i = 0 To nbc - 1
        Workbooks.Add 'crée un classeur
        ThisWorkbook.Sheets(1).Rows(1).Copy ActiveWorkbook.Sheets(1).Rows(1) 'copie l'entete
        ThisWorkbook.Sheets(1).Rows(i * nbl + 2 & ":" & (i + 1) * nbl + 1).Copy ActiveWorkbook.Sheets(1).Rows(2) 'copie les les lignes
        ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & Split(ThisWorkbook.Name, ".")(0) & "_" & i & ".xlsx" 'sauve le classeur
    Next i
    End Sub
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2017
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Allier (Auvergne)

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

    Informations forums :
    Inscription : mai 2017
    Messages : 258
    Points : 454
    Points
    454

    Par défaut

    Bonjour,

    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
     
    Dim i As Integer
    Dim ligneDepart As Integer
    Dim NewBook As Workbook
     
    ligneDepart = 2 
     
    For i = 1 to  'nombre de classeur à créer
     
    Set NewBook = Workbooks.Add 'création du classeur
    NewBook.SaveAs "C:\Chemin\NomDuClasseur"
     
    'copie des entêtes sur la première ligne de ton classeur
    'copie les lignes à partir de ligneDepart jusqu'à ton nombre de ligne par classeur
    ligneDepart = ligneDepart + X 'incrémente la ligne de départ pour le prochain classeur
     
    Next i
    Voilà un début qui pourrait t'aider. Je ne sais pas si tu souhaites écrire le nombre de classeur et de lignes en dur ou les demander à l'utilisateur.
    Jeune développeur toujours prêt à apprendre et à aider.

    N'oubliez pas de mettre un si vous avez été aidé , pensez aussi à mettre si vous n'avez plus de problème.

    On ne fait pas les devoirs des gens, parce que les devoirs c'est fait pour apprendre, si on ne les fait pas on apprend pas. Si on apprend pas on est pas compétent. Et si on est pas compétent mais qu'on se fait embaucher comme quelqu'un qui l'est, ça pose problème aux gens comme nous.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Consultant en finance de marché
    Inscrit en
    janvier 2017
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant en finance de marché

    Informations forums :
    Inscription : janvier 2017
    Messages : 36
    Points : 18
    Points
    18

    Par défaut Details

    Bonjour,

    je vais me pencher sur le début de solution que me propose Oudouner.

    Pour affiner ma demande, je n'ai pas de critères particuliers de tri sur les lignes.

    Dans les faits j'ai un fichier de 10,000 lignes que je dois implanter dans un système propre à mon entreprise mais qui ne supporte pas une telle charge, avec une capacité max de 800 lignes par fichier.

    Je voudrais donc que la macro prenne les lignes par paquet de 800 et les nomme à la suite, du genre Doc1, Doc2, Doc3, Doc1, etc ... En gardant juste la première ligne qui est l'en tête des colonnes.

    En fait les 799 lignes copiées peuvent être supprimées du fichier principal, puisqu'elles seront copiées dans un nouveau classeur. Et que cette macro soit répétée X fois jusqu'à ce que le fichier soit vide.

    J'espère avoir été plus clair, si besoin d'autres précisions, je reste à votre disposition et merci pour votre aide.

    Regards

  6. #6
    Expert éminent sénior
    Avatar de patricktoulon
    Profil pro
    Inscrit en
    avril 2009
    Messages
    10 303
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 10 303
    Points : 16 367
    Points
    16 367
    Billets dans le blog
    1

    Par défaut re

    les fichiers de destination ont il un extension xl ou peuvent ils êtres des csv
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : résolu: ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Membre à l'essai
    Homme Profil pro
    Consultant en finance de marché
    Inscrit en
    janvier 2017
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant en finance de marché

    Informations forums :
    Inscription : janvier 2017
    Messages : 36
    Points : 18
    Points
    18

    Par défaut Details

    Les classeurs finaux doivent être sous format .xls pour pouvoir fonctionner.

    Si cela aide par contre, je peux retransformer mon fichier initial en .csv, même si je ne vois pas la finalité.

  8. #8
    Expert éminent sénior
    Avatar de patricktoulon
    Profil pro
    Inscrit en
    avril 2009
    Messages
    10 303
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 10 303
    Points : 16 367
    Points
    16 367
    Billets dans le blog
    1

    Par défaut re

    en csv le travail ne durerait pas plus de 3 ou 4 secondes
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : résolu: ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Membre à l'essai
    Homme Profil pro
    Consultant en finance de marché
    Inscrit en
    janvier 2017
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant en finance de marché

    Informations forums :
    Inscription : janvier 2017
    Messages : 36
    Points : 18
    Points
    18

    Par défaut Merci

    Effectivement, en CSV, le résultat serait plus rapide, mais la contrainte système fait que je dois passer par du xlsx en finalité.

    La réponse de Halaster08 est parfaite et répond parfaitement à l'ensemble de mes besoins, merci beaucoup .

    Par contre, soit c'est moi soit c'est la fatigue mais j'ai essayé de modifier le path pour sauver les fichiers générés dans un folder précis et sous un autre nom mais ça ne marche pas, peux tu me dire ou est mon erreur ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWorkbook.SaveAs ThisWorkbook.Path & "F:\TEST\" & Split(ThisWorkbook.Name, "STAR")(0) & "_" & i & ".xlsx" 'sauve le classeur

  10. #10
    Expert éminent sénior
    Avatar de patricktoulon
    Profil pro
    Inscrit en
    avril 2009
    Messages
    10 303
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 10 303
    Points : 16 367
    Points
    16 367
    Billets dans le blog
    1

    Par défaut re

    sinon
    voila un exemple avec un fichier de départ avec 40000 lignes sur 7 colonnes
    qui te sauve donc 51 fichiers csv de 800 lignes dont la première et toujours la même (ligne 1 originale)

    le tout roulement de tambours ......
    moins de 2 seconde chez moi
    de plus il y a création de dossier pour la destination si il existe pas
    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
    Sub testaaaaaa()
        Dim chemin As String, memo As Object, plage As Range, ligne As String, derlig As Long, dercol As Long, T As String, X, fichier As String
        chemin = ThisWorkbook.Path & "\fichiersdecoupés"
        If Dir(chemin, vbDirectory) = "" Then MkDir (chemin)
        Set memo = CreateObject("htmlfile")
        With ActiveSheet
            Set plage = ActiveSheet.UsedRange
            ligne = Join(WorksheetFunction.Index(plage.Value, 1, 0), ";")
            derlig = ActiveSheet.Cells.Find(What:="*", After:=[A1], SearchDirection:=xlPrevious).Row
            dercol = plage.Column + plage.Columns.Count - 1
            For i = 2 To derlig Step 798
                a = a + 1
                clearall = memo.parentwindow.clipboardData.setData("Text", "")    'on vide le clipboard au cas ou il y aurait quelque chose
                ind2 = IIf(i + 798 < derlig, i + 798, derlig)
                .Range("A" & i, .Cells(ind2, dercol)).Copy
                T = Replace(Replace(memo.parentwindow.clipboardData.GetData("TEXT"), vbTab, ";"), vbCrLf, ";" & vbCrLf)
                fichier = chemin & "\fichier " & a & ".csv"
                X = FreeFile
                Open fichier For Output As #X
                Print #X, ligne & vbCrLf & T
                Close #X
            Next
        End With
    Application.CutCopyMode = False
    End Sub
    ca donne a réfléchir a la conception de ton organisation n'est ce pas ???
    encore une qui devrait plaire a Robert

    edit:

    j'ajouterais que sur cet base dans la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("A" & i, .Cells(ind2, dercol)).Copy
    il te serait possible de le faire en xlsx
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : résolu: ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Membre chevronné
    Homme Profil pro
    Responsable des études
    Inscrit en
    juillet 2014
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2014
    Messages : 1 173
    Points : 2 208
    Points
    2 208

    Par défaut

    Citation Envoyé par Aiyolia Voir le message
    Par contre, soit c'est moi soit c'est la fatigue mais j'ai essayé de modifier le path pour sauver les fichiers générés dans un folder précis et sous un autre nom mais ça ne marche pas, peux tu me dire ou est mon erreur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWorkbook.SaveAs "F:\TEST\" & Split(ThisWorkbook.Name, "STAR")(0) & "_" & i & ".xlsx" 'sauve le classeur
    Si tu fixe un chemin plus besoin de thisworkbook.path qui était la pour envoyer le résultat dans le même répertoire que le xlsm qui les construit.
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Consultant en finance de marché
    Inscrit en
    janvier 2017
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant en finance de marché

    Informations forums :
    Inscription : janvier 2017
    Messages : 36
    Points : 18
    Points
    18

    Par défaut Thanks all

    Effectivement Patrick, ta solution marche tout aussi bien et je vais pouvoir l'utiliser pour une autre application, merci beaucoup.

    Et oui merci Halaster, effectivement ta remarque est évidente :/.

    Merci beaucoup à vous pour votre aide, je passe le sujet en résolu.

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

Discussions similaires

  1. Excel comme une horloge et plusieurs classeurs ouverts
    Par Kestion100 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/11/2015, 11h12
  2. [XL-2003] récupérer la valeur d'une cellule dans plusieurs classeurs identiques
    Par greenfire15 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/08/2012, 09h20
  3. [SSIS] [2K5] Split d'une colonne en plusieurs
    Par plouffy dans le forum SSIS
    Réponses: 2
    Dernier message: 23/04/2009, 14h41
  4. Réponses: 19
    Dernier message: 12/10/2007, 13h49
  5. VBA-Recherche d'une feuille dans plusieurs classeurs
    Par derf3183 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 13/07/2006, 14h50

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