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 :

creation de nouvelles feuilles a partir d'un tableau


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2007
    Messages : 103
    Points : 66
    Points
    66
    Par défaut creation de nouvelles feuilles a partir d'un tableau
    Bonjour,

    j'ai un tableau excel initial avec plusieurs colonnes. L'une de ces colonne sert à donner une référence à chaque ligne.
    Mon tableau fait environ 500 lignes

    Il faut que je créé un nouveau classeur excel. Que je fasse un filtre sur les données de mon premier tableau pour sélectionner quelques lignes (400 à peu près). et que pour chaque ligne, je crée une nouvelle feuille dans ce classeur. Sachant que pour chaque feuille:
    la feuille devra être renommée sous le nom du champ "reftps" de la ligne etudiée
    la ligne de titre ainsi que la ligne concernée du tableau de base devront être recopiés en supprimant certaines colonnes
    un nouveau petit tableau devra être créé dans chaque feuille.

    Pour que ce soit plus compréhensible, je joint la copie d'écran de mon tableau de départ et d'une feuille d'arrivée.

    comme je dois le faire plus de 400 fois je pense qu'il doit exister un moyen avec vba pour automatiser ça. Mais le soucis c'est que je ne vois pas comment procéder et mes connaissances sont limitées. Est-ce que quelqu'un pourrait me dire d'une part si c'est faisable facilement et di c'est le cas, comment?

    J'ai cherché dans les anciens posts et je n'ai pas trouvé comment faire. Si un problème du même type a déjà été traité je m'en excuse par avance.

    Merci par avance pour votre aide
    Images attachées Images attachées   

  2. #2
    Membre éprouvé
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Points : 1 191
    Points
    1 191
    Par défaut
    Bonsoir, firaponte

    je te propose une solution, un peu évolutive....

    le principe..

    Tout d'abords tu réserve une cellule dans ta feuille liste par exemple pour stocker un numéro, le numéro de ligne active, pour simplifier le code ensuite nomme cette cellule (en te positionnant dessus puis en tapant son nom dans la case en haut à gauche où apparait l'adresse courante) , donc tu la nomme LgnActive

    ensuite contruit une feuille modéle ( à nommer modele) dans la quelle tu construit le format de destination souhaité pour chacune de tes lignes.
    tu rempli ce format avec des formule te permettant d'extraire de ta liste la ligne dont le numéro et définit dans la cellule nommé LgnActive, cela donne des formules du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =INDEX(Liste!C:C;LgActive)
    j'ai nommé la feuille contenant la liste, LISTE , cette formule INDEX permet dont de récupérer la valeur contenue dans la colonne C, ligne définit par la cellule LgActive.


    Ensuite il ne te reste plus qu'as faire un peu de code VBA, qui se charge de faire évoluer la valeur contenue dans la cellule LgActive, et qui pour chaque ligne effectue une copie de la feuille Modéle, (en supprimant toutes les formules dans la feuille de destination) et renomme la nouvelle feuille en fonction du numéro de ligne contenu dans LgActive..

    bon dis quoi ...
    JacqueS.

    Ps: je ne télécharge les piéces jointes qu'en dernier recours .(et encore...)

    Pour devenir mon ami laissez moi un message

  3. #3
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2007
    Messages : 103
    Points : 66
    Points
    66
    Par défaut
    Merci pour cette aide.
    Pour la cellule à reserver, j'ai juste à renommer le champ LgActive là où tu me là indiqué ou il y autre chose à faire?
    Et ensuite le code VBA, je le rentre où? dans la feuille liste ?

    mercii

  4. #4
    Membre éprouvé
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Points : 1 191
    Points
    1 191
    Par défaut
    Bonjour firaponte

    Le code il va falloir que tu le mette dans un module.. mais bon avant cela il faut l'écrire, est-ce que tu as compris le principe exposé.. et à tu commencé à l'écrire ce code ..
    JacqueS.

    Ps: je ne télécharge les piéces jointes qu'en dernier recours .(et encore...)

    Pour devenir mon ami laissez moi un message

  5. #5
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2007
    Messages : 103
    Points : 66
    Points
    66
    Par défaut
    Bonjour,

    j'ai mis du temps à répondre, désolée, le week end en est la cause

    Oui, il me semble avoir compris le principe.

    alors j'ai créé mon fichier modèle. Il a la mise en page choisie, des formules dans certaines cellules et la mise en forme choisie.

    J'ai renommé le champ d'une cellule "LgActive" dans ma feuille LISTE.

    Et j'ai écrit l'algorithme pour le code. Peux tu me dire ce que tu en penses?

    dans la feuille LISTE, pour la cellule renommée LgActive:
    en fait je vois pas l'intérêt de faire ça . Peux tu m'expliquer s'il te plait?


    Pour la feuille index
    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
    >i, entier
    >pour i=1..500,
    >>{
    >>LgActive = i
    >>Si =INDEX(Liste!A:A;LgActive) = "INJ"  
    >>>{
    >>>Creer, dans le classeur "classeur1", une nouvelle feuille, identique à la feuille MODELE
    >>>renommer la nouvelle feuille; son nom est: =INDEX(Liste!H:H;LgActive) 
    >>>dans la nouvelle feuille, faire
    >>>>{
    >>>>A4 = INDEX(Liste!B:B;LgActive) 
    >>>>B4 = INDEX(Liste!D:D;LgActive) 
    >>>>C4 = INDEX(Liste!F:F;LgActive) 
    >>>>D4 = INDEX(Liste!G:G;LgActive) 
    >>>>E4 = INDEX(Liste!J:J;LgActive) 
    >>>>F4 = INDEX(Liste!K:K;LgActive) 
    >>>>G4 = INDEX(Liste!H:H;LgActive) 
    >>>>H4 = INDEX(Liste!L:L;LgActive) 
    >>>>I4 = INDEX(Liste!M:M;LgActive) 
    >>>>J4 = INDEX(Liste!N:N;LgActive) 
    >>>>}
    >>>}
    >>}
    >i++
    voilà mon petit algorithme. Peux tu me dire ce que tu en penses?

    Et surtout merci beaucoup!

  6. #6
    Membre éprouvé
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Points : 1 191
    Points
    1 191
    Par défaut
    Bonsoir,

    Citation Envoyé par firaponte Voir le message
    ...
    dans la feuille LISTE, pour la cellule renommée LgActive:
    en fait je vois pas l'intérêt de faire ça . Peux tu m'expliquer s'il te plait?
    ...
    c'était pour y stocker l'index de la ligne en cours de traitement.

    pour ce qui est de formule, ce que je te proposai c'est de les mettre directement dans ta feuille modéle, ensuite tu peu faire varier la valeur de LgActive pour voir si tu as bien le résultat obtenu dans ta feuille modéle.. L'avantage c'est qu'ainsi s'il y as modifications tu ne modifie que le modéle et ses formules pas ton code ...

    pour ton algo (j'ai pas l'habitude de lire/écrire cela..) en fait tu peu le simplifier puisque tu n'as pas à re-écrire tes formules, cellules A4....

    En gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
              - Faire varier LgActive de 1 à NbreDelignes
                        - Si ligne courante doit être traité ( ? Colonne A = Inf)
                                  Copier la feuille modéle dans nouvelle feuille
                                   Supprimer les formules dans cette nouvelle feuille
                                    renommer la nouvelle feuille
                         - Fin Si  
     
              - Fin de Variation LgActive 1 à NbLignes
    JacqueS.

    Ps: je ne télécharge les piéces jointes qu'en dernier recours .(et encore...)

    Pour devenir mon ami laissez moi un message

  7. #7
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2007
    Messages : 103
    Points : 66
    Points
    66
    Par défaut
    Bonjour,

    en fait si,je pense que j'ai besoin de mes formules puisque de la feuille liste, je ne garde pas tous les champs. du coup, je ne peux pas juste insérer la ligne. a moins que tu ne vois un autre moyen?

    Pour taper mon code, je dois le taper dans la feuille modèle. J'ouvre donc VBA, et ensuite je le tape directement dans le module de la feuille modèle?

  8. #8
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2007
    Messages : 103
    Points : 66
    Points
    66
    Par défaut
    Bonjour,

    alors, j'ai créé le code pour une itération.
    Mais j'ai vraiment du mal avec le fonctionnement de LgActive. Je suis désolée, je vois vraiment pas comment c'est pris en compte dans ma feuille liste. Peux tu me détailler ce point? après je pense que je devrais y arriver mais alors là, je suis paumée .

    merci

  9. #9
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2007
    Messages : 103
    Points : 66
    Points
    66
    Par défaut
    Bonjour,

    alors la formule index ne marche apparement pas dans le code VBA. Si j'ai bien compris, il faut que je mette "range" dans le code vba. Or, est-ce que avec cette fonction, je peux dissocier colonne et ligne? Ce que je veux dire, est ce que je peux dire
    =range(ligne!HLgActive)
    pour l'instant ça fonctionne pas dans mon code.

    Autre possibilité, je pense que c'est ce à quoi tu pensais et que je viens juste de le comprendre, c'est mettre dans les cellules de ma feuille modèle, la formule avec index en ppilotant la valeur de lgactive dans le code VBA. mais je me retrouve toujours avec un problème de compréhension du LgActive.



    EDIT: j'avance... c'était basic, mais quand on débute, c'est pas évident. Donc du coup j'ai fait
    Range("liste!H" & i).Value

    et ca fonctionne.

    je continue et je mettrai la solution ici plus tard!

  10. #10
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2007
    Messages : 103
    Points : 66
    Points
    66
    Par défaut
    Voilà, j'ai le code qui fonctionne :

    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
    Dim i As Integer
     
        For i = 9 To 426  'i correspond au numero de ligne active
            Sheets("modele").Select
            Sheets("modele").Copy Before:=Sheets("lastsheet")
            Sheets("modele (2)").Name = Range("liste!H" & i).Value
            Range("A4").Value = Range("liste!B" & i).Value
            Range("B4").Value = Range("liste!D" & i).Value
            Range("C4").Value = Range("liste!F" & i).Value
            Range("D4").Value = Range("liste!G" & i).Value
            Range("E4").Value = Range("liste!J" & i).Value
            Range("F4").Value = Range("liste!K" & i).Value
            Range("G4").Value = Range("liste!H" & i).Value
            Range("H4").Value = Range("liste!L" & i).Value
            Range("I4").Value = Range("liste!M" & i).Value
            Range("J4").Value = Range("liste!N" & i).Value
       Next i
            ActiveWorkbook.Save
    End Sub
    En fait, après coup, ca parait tout simple maintenant!

    Merci beaucoup

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

Discussions similaires

  1. creation de nouvelles feuilles et les trier par ordre croissant
    Par lps02 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 18/09/2012, 23h53
  2. Réponses: 24
    Dernier message: 15/10/2007, 14h41
  3. feuille excel à partir d'un tableau
    Par maumau68 dans le forum Excel
    Réponses: 3
    Dernier message: 04/10/2007, 16h58
  4. Creation d'une table à partir d'un tableau
    Par fafabzh6 dans le forum Access
    Réponses: 10
    Dernier message: 20/09/2006, 17h10
  5. insérer une nouvelle feuille Excel à partir d' Access
    Par Sebastien_INR59 dans le forum Access
    Réponses: 2
    Dernier message: 06/08/2006, 18h47

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