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 :

Split d'une worksheet en plusieurs classeurs [XL-2013]


Sujet :

Macros et VBA Excel

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

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

    Informations forums :
    Inscription : Janvier 2017
    Messages : 40
    Points : 20
    Points
    20
    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
    5 073
    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 : 5 073
    Points : 9 853
    Points
    9 853
    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
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 661
    Points : 5 785
    Points
    5 785
    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
    Invité
    Invité(e)
    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.

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

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

    Informations forums :
    Inscription : Janvier 2017
    Messages : 40
    Points : 20
    Points
    20
    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
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    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 : : ç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
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : Janvier 2017
    Messages : 40
    Points : 20
    Points
    20
    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
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    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 : : ç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
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : Janvier 2017
    Messages : 40
    Points : 20
    Points
    20
    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
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    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 : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 661
    Points : 5 785
    Points
    5 785
    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
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : Janvier 2017
    Messages : 40
    Points : 20
    Points
    20
    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