Macro création de nouvelles feuilles et MAJ de formules
Dernière réponse : dans Programmation
Bonjour à tous,
Cette question à déjà été posée dans d’autres posts, mais je ne m’y connais pas assez en VBA pour réussir à extraire les morceaux de code qui me seraient utiles….
Je souhaiterais donc pouvoir créer un code qui fasse automatiquement :
- Copier deux feuilles existantes à l’identique et les coller derrière une feuille donnée (jusque la j’ai réussi)
Simple je sais... mias beaucoup plus je sais pas faire
- Renommer ces feuilles en incrémentant leurs numéro de un en un (ou proposer une Msg box pour entrer ce qu’on veut…)
Je pense que c'est ce qui se situerait là-dedans, mais je n'arrive pas à l'adapter à mon cas...
- Mettre à jour les formules dans mes deux feuilles créées, à savoir, dans ‘Variante PAC (X)’ dans les cellules B83
dans ‘Tx Couv Pac(X)’ les cellules A3 à 36
- Et finalement ajouter les résultats dans un tableau sur la feuille ‘Données Graphique’ en faisant en sorte qu’à chaque création de série des deux feuilles les résultats s’ajoutent une ligne en dessous…
Voilà je ne sais pas à quel point c’est compliqué à réaliser pour quelqu’un qui maitrise l’outil, mais personnellement je suis bloqué….
Ficher joint: Désolé pour le fichier joint...
Ancien post traitant du sujet: http://www.presence-pc.com/forum/ppc/Programmation/dupl...
Merci d'avance a tous...
Cette question à déjà été posée dans d’autres posts, mais je ne m’y connais pas assez en VBA pour réussir à extraire les morceaux de code qui me seraient utiles….
Je souhaiterais donc pouvoir créer un code qui fasse automatiquement :
- Copier deux feuilles existantes à l’identique et les coller derrière une feuille donnée (jusque la j’ai réussi)
Sheets("Variante PAC (1)").Select Sheets("Variante PAC (1)").Copy before:=Sheets("Données graphique") Sheets("Tx couv Pac (1)").Select Sheets("Tx couv Pac (1)").Copy before:=Sheets("Données graphique")
Simple je sais... mias beaucoup plus je sais pas faire
- Renommer ces feuilles en incrémentant leurs numéro de un en un (ou proposer une Msg box pour entrer ce qu’on veut…)
'Création de ta feuille PR.Copy After:=Worksheets(3) Set sh_revue = Worksheets(4) sh_revue.Name = "Revue 0" ' Trouver l'indice existant max Dim b As Boolean Dim x As Integer Dim ws As Worksheet x = 0 Do b = False For Each ws In Worksheets If ws.Name = "Revue " & x Then x = x + 1 b = True End If Next Loop While Not b MsgBox "Création de la revue N°" & x 'nommage sh_revue.Name = "Revue " & x sh_revue.Range("D14" ).Value = Date sh_revue.Range("B14" ).Value = x
Je pense que c'est ce qui se situerait là-dedans, mais je n'arrive pas à l'adapter à mon cas...
- Mettre à jour les formules dans mes deux feuilles créées, à savoir, dans ‘Variante PAC (X)’ dans les cellules B83
,
'Tx couv Pac (1)'!$C$37/Informations!$C$46
dans ‘Tx Couv Pac(X)’ les cellules A3 à 36
SI(Informations!A12<'Variante PAC (1)'!$C$6;0;Informations!A12)
- Et finalement ajouter les résultats dans un tableau sur la feuille ‘Données Graphique’ en faisant en sorte qu’à chaque création de série des deux feuilles les résultats s’ajoutent une ligne en dessous…
Voilà je ne sais pas à quel point c’est compliqué à réaliser pour quelqu’un qui maitrise l’outil, mais personnellement je suis bloqué….
Ficher joint: Désolé pour le fichier joint...
Ancien post traitant du sujet: http://www.presence-pc.com/forum/ppc/Programmation/dupl...
Merci d'avance a tous...
Autres pages sur : macro creation nouvelles feuilles maj formules
Lassé par la pub ? Créez un compte
Sheets("Variante PAC (1)" ).Select Sheets("Variante PAC (1)" ).Copy before:=Sheets("Données graphique" ) Sheets("Tx couv Pac (1)" ).Select Sheets("Tx couv Pac (1)" ).Copy before:=Sheets("Données graphique" )
Et si au lieu de te dire je ne m’y connais pas assez, tu essayais de comprendre ce que tu fais.Spoiler
Hein, quoi je ne suis pas gentil !? Mais si, tu finiras par le croire
Pourquoi tu fais deux select ?
Sheets("Variante PAC (1)" ).Copy before:=Sheets("Données graphique" ) Sheets("Tx couv Pac (1)" ).Copy before:=Sheets("Données graphique" )
Spa mieux, plus simple et plus compréhensible ?
Il existe deux types de feuilles (sheets) sous Excel. Les feuilles de calcul (worksheets) et les feuilles de graphique (charts).
La collection Sheets reprend le contenu des deux collections worksheets et charts.
Il est parfois avantageux de de pas préciser si l'on travaille avec l'une ou l'autre, mais ces cas sont rares.
Je t'invite à utiliser la collection la plus précise :
Worksheets("Variante PAC (1)" ).Copy before:=Worksheets("Données graphique" ) Worksheets("Tx couv Pac (1)" ).Copy before:=Worksheets("Données graphique" )
Bon, quand on créé une feuille, il est intelligent d'avoir une variable qui pointe dessus.
Comme VB est un langage orienté objet mal-fini, certaines méthodes oublient de renvoyer l'objet créé, c'est le cas de la méthode Copy
Ce n'est pas grave. On ruse :
Dim ws_data As Worksheet Dim ws_variante As Worksheet Dim ws_txcouv As Worksheet Set ws_data = Worksheets("Données graphique" ) Worksheets("Variante PAC (1)" ).Copy before:=ws_data Set ws_variante = Worksheets(ws_data.Index - 1) Worksheets("Tx couv Pac (1)" ).Copy before:=ws_data Set ws_txcouv = Worksheets(ws_data.Index - 1)
(Le -1, c'est parce qu'on copie avant
Refaire l'exemple, avec Copy After
)Bon, maintenant qu'on a une variable sur chacune nos feuilles, on voudrait lui donner un nom avec un numéro, c'est ça ?
Pour ce qui est de proposer une MsgBox, je te laisse faire avec la commande InputBox. Mais ce n'est pas une zolie solution.
En effet, la programation objet se doit d'être classe.
Bon, qu'est-ce que tu ne comprends pas dans le code que tu mets en copie ? Et qu'est-ce qui te semble si difficile à adapter ?
Tiens, du boulot. Etudie-moi la fonction suivante :
Function GreatestNumber(beginning As String, ending As String) Dim ws As Worksheet Dim n As Integer Dim m As Integer Dim beg_len As Integer Dim end_len As Integer Dim middle As String beg_len = Len(beginning) end_len = Len(ending) n = 0 ' // Parcours de toutes les feuilles de calcul For Each ws In Worksheets ' // On cherche un nom de feuille qui commence par beginning et qui finisse par ending If Left(ws.Name, beg_len) = beginning And Right(ws.Name, end_len) = ending Then ' // Qu'a-t-on entre les deux ? middle = Mid(ws.Name, beg_len + 1, Len(ws.Name) - beg_len - end_len) ' Est-ce un nombre ? If IsNumeric(middle) Then ' // On prend le soin de ne prendre que la partie entière ! m = Int(middle) ' // On cherche le plus grand If n < m Then n = m End If End If Next GreatestNumber = n End Function
---------------------------------------------------
Pour ce qui est des formules, sache qu'Excel est bilingue. Il affiche du français dans la feuille Excel et de l'anglais dans VBA.
Msgbox Worksheets("Tx Couv Pac(1)").Range("A3").Formula
Tu vois ce qu'il te reste à faire !
Spoiler
Parcours les cellules avec un For Each et soit tu réécris tes formules, soit tu les modifies. Dans le cas de la modification, Left, Mid et Right devraient être tes amis.
---------------------------------------------------
Citation :
- Et finalement ajouter les résultats dans un tableau sur la feuille ‘Données Graphique’ en faisant en sorte qu’à chaque création de série des deux feuilles les résultats s’ajoutent une ligne en dessous… Je te laisse consulter cet article pour Ajouter une ligne en dessous.
J'attends ton code avec impatience. Tu vas y mettre plein de bonne volonté, de sueur et de courage.
Et je le critiquerai et dirai des "Mais non", "Regarde plutôt" et "N'est-ce pas mieux comme ça".
Mais au final, t'auras un super programme, efficace et c'est toi qui l'auras écrit.
C'est promis
Qui aurait cru qu'un soir je serais en train de me retourner les neurones sur ce genre de choses.... Et qui aurait cru que ça me plairait
Pour ce qui est de ta gentillesse Zeb, je n'en doute pas une seule seconde; de ce que j'ai vu sur le forum tu semble être un excellent professeur
Alors pour en revenir au code, effectivement il est beaucoup plus "propre" de faire comme cela:
Pour ce qui est de la copie APRES "Données graphiques" je pensais partir comme sa:
Le problème c'est que la feuille txcouv se retrouve avant la variante, il faudrait donc inverser l'ordre, soit:
Pour ce qui est du code que j'avais copié dans mon premier post, ce que je ne comprend pas c'est quand on parle de "If ws.Name = "Revue " & x Then" ça se traduirait comment dans le nom de l'onglet.... En fait dans cet exemple la feuille est appelée "Revue 0" et c'est le zéro qui est assimilé à X c'est sa ??? donc le zéro devient une variable qu'on peut faire varier à sa guise....
Pour ce qui est de l'histoire des left midle et right il faudrait faire quelque chose comme sa:
J'avoue que l'idée de modifié les formules et cette histoire de left midle et right n'est pas 100% clair pour moi, cela ne s'applique-t-il pas seulement aux formules de plus de 255 caractères ( ce qui n'est pas le cas pour cette formule qui fait environ 100 caractères....)
Et finalement pour ce qui est de l'ajout sur une ligne vide il faudrait que j'utilise:
suite à quoi j'insèrerais le résultat d'une cellule dans la case correspondante....
Je reste en attente de tes "Mais non", "Regarde plutôt" et "N'est-ce pas mieux comme ça".
Je pense que j'aurais plus le temps de regarder sa demain dans la journée (enfin aujourd'hui à l'heure ou j'écris) après tout un stagiaire il a bien le droit de travailler un peu sur son rapport, déjà qu'on est si bien payé
Encore merci
Pour ce qui est de ta gentillesse Zeb, je n'en doute pas une seule seconde; de ce que j'ai vu sur le forum tu semble être un excellent professeur
Alors pour en revenir au code, effectivement il est beaucoup plus "propre" de faire comme cela:
Dim ws_data As Worksheet Dim ws_variante As Worksheet Dim ws_txcouv As Worksheet Set ws_data = Worksheets("Données graphique") Worksheets("Variante PAC (1)").Copy before:=ws_data Set ws_variante = Worksheets(ws_data.Index - 1) Worksheets("Tx couv Pac (1)").Copy before:=ws_data Set ws_txcouv = Worksheets(ws_data.Index - 1) ' // J'ai simplement rajouter le passage en mode invisible de la feuille "Tx Couv" créée.. à voir si c'est "classe" ws_txcouv.Visible = False
Pour ce qui est de la copie APRES "Données graphiques" je pensais partir comme sa:
Worksheets("Variante PAC (1)").Copy After:=ws_data Set ws_variante = Worksheets(ws_data.Index + 1) Worksheets("Tx couv Pac (1)").Copy After:=ws_data Set ws_txcouv = Worksheets(ws_data.Index + 1)
Le problème c'est que la feuille txcouv se retrouve avant la variante, il faudrait donc inverser l'ordre, soit:
Worksheets("Tx couv Pac (1)").Copy After:=ws_data Set ws_txcouv = Worksheets(ws_data.Index + 1) Worksheets("Variante PAC (1)").Copy After:=ws_data Set ws_variante = Worksheets(ws_data.Index + 1)
Pour ce qui est du code que j'avais copié dans mon premier post, ce que je ne comprend pas c'est quand on parle de "If ws.Name = "Revue " & x Then" ça se traduirait comment dans le nom de l'onglet.... En fait dans cet exemple la feuille est appelée "Revue 0" et c'est le zéro qui est assimilé à X c'est sa ??? donc le zéro devient une variable qu'on peut faire varier à sa guise....
Pour ce qui est de l'histoire des left midle et right il faudrait faire quelque chose comme sa:
Function GreatestNumber(beginning As String, ending As String) Dim ws As Worksheet Dim n As Integer Dim m As Integer Dim beg_len As Integer Dim end_len As Integer Dim middle As String beg_len = Len(Variante PAC) end_len = Len(00 kW) ' // Il faudrait pas rajouter quelque chose pour les caractères du milieu, ceux que je voudrais changer en somme puisque le nom de la feuille serait soit Variante PAC (X) soit Variante PAC X00 kW n = 0 ' // Parcours de toutes les feuilles de calcul For Each ws In Worksheets '' // On cherche un nom de feuille qui commence par "Variante PAC" If Left(ws.Name, beg_len) = Variante PAC And Right(ws.Name, end_len) = 00 kW Then ' // Qu'a-t-on entre les deux ? => c'est la que je bloque, vis-à-vis du "1" qu'il faudrait changer.... middle = Mid(ws.Name, beg_len + 1, Len(ws.Name) - beg_len - end_len) ' Est-ce un nombre ? => OUIIIIII :D If IsNumeric(middle) Then ' // On prend le soin de ne prendre que la partie entière ! m = Int(middle) ' // On cherche le plus grand => Suis un peu largué la :s If n < m Then n = m End If End If Next GreatestNumber = n End Function
J'avoue que l'idée de modifié les formules et cette histoire de left midle et right n'est pas 100% clair pour moi, cela ne s'applique-t-il pas seulement aux formules de plus de 255 caractères ( ce qui n'est pas le cas pour cette formule qui fait environ 100 caractères....)
Et finalement pour ce qui est de l'ajout sur une ligne vide il faudrait que j'utilise:
Range("A1" ).End(xlDown).Row + 1
suite à quoi j'insèrerais le résultat d'une cellule dans la case correspondante....
Je reste en attente de tes "Mais non", "Regarde plutôt" et "N'est-ce pas mieux comme ça".
Je pense que j'aurais plus le temps de regarder sa demain dans la journée (enfin aujourd'hui à l'heure ou j'écris) après tout un stagiaire il a bien le droit de travailler un peu sur son rapport, déjà qu'on est si bien payé
Encore merci
Non ! Mais non. Pas du tout. M'enfin !
Commence par comprendre la différence entre une valeur et une variable.
Une valeur, c'est un élément de tous les cas particuliers possibles !
Une variable, c'est un conteneur, une référence pour cette valeur.
Reprends la fonction GreatestNumber telle que je te la proposais.
Et étudie son fonctionnement.
Pour ce faire, on va la déboguer.
(lecture utile)
Crée une procédure qui appelle GreatestNumber :
Et exécution !
La procédure s'arrête en pause.
Appuie deux fois sur F8. On entre dans la fonction GreatestNumber.
Dans l'éditeur VB, ouvre la fenêtre espion.
Ajoutes-y n, ws, ws.Name, Left(ws.Name, beg_len), Right(ws.Name, end_len) et Mid(ws.Name, beg_len + 1, Len(ws.Name) - beg_len - end_len)
Ca y est ? Alors appuie atant de fois que tu veux sur F8 et observe bien ce qui se passe
Dès que tu as compris ça, on reparle de la transformation de tes formules
Bon rapport en attendant.
Commence par comprendre la différence entre une valeur et une variable.
Une valeur, c'est un élément de tous les cas particuliers possibles !
Une variable, c'est un conteneur, une référence pour cette valeur.
Reprends la fonction GreatestNumber telle que je te la proposais.
Et étudie son fonctionnement.
Pour ce faire, on va la déboguer.
(lecture utile)
Crée une procédure qui appelle GreatestNumber :
Sub ProcTestGreatestNumber MsgBox "La procédure va s'arrêter grâce à la commande Stop" Stop MsgBox GreatestNumber("Variante PAC (", ")") End Sub
Et exécution !
La procédure s'arrête en pause.
Appuie deux fois sur F8. On entre dans la fonction GreatestNumber.
Dans l'éditeur VB, ouvre la fenêtre espion.
Ajoutes-y n, ws, ws.Name, Left(ws.Name, beg_len), Right(ws.Name, end_len) et Mid(ws.Name, beg_len + 1, Len(ws.Name) - beg_len - end_len)
Ca y est ? Alors appuie atant de fois que tu veux sur F8 et observe bien ce qui se passe
Dès que tu as compris ça, on reparle de la transformation de tes formules
Bon rapport en attendant.
Et bien et bien... je suis bien partis moi...
Alors pour la différence entre valeur et variable, je dirais qu'une valeur c'est le résultat de la variable en l'occurrence d'une formule inscrite dans une cellule... J'ai bon ? ( au moins un peu :s )
Par contre pour ce qui est de la ligne 4 GreatestNumber ("Variante PAC ("," )" ) me renvoi une erreur..... je n'arrive donc pas à faire mumuse avec la fonction...
Encore merci pour le rapport, il va bon train pour l'instant
Alors pour la différence entre valeur et variable, je dirais qu'une valeur c'est le résultat de la variable en l'occurrence d'une formule inscrite dans une cellule... J'ai bon ? ( au moins un peu :s )
Par contre pour ce qui est de la ligne 4 GreatestNumber ("Variante PAC ("," )" ) me renvoi une erreur..... je n'arrive donc pas à faire mumuse avec la fonction...
Encore merci pour le rapport, il va bon train pour l'instant
Lassé par la pub ? Créez un compte
- Contenus similaires :