Onglets
Bonjour,
Je viens de découvrir les macros suite à une formation sur le logiciel, et bien que je voyais déjà les possibilités énormes de la programmation, les exemples concrets m'ont permis de mieux comprendre le fonctionnement... Juste pour dire que je suis clairement novice
Mon besoin est relativement simple, en tout cas il semble avoir déjà été expliqué un peu partout sur le net. Je cherche juste à créer des onglets suivant une liste, et ce avec un modèle ( dont le nom de la feuille prend en compte le nom dans la liste et se remplit d'infos prises un peu partout, me remplit dans la foulée un rapport... ). Bref, tout con, ou presque.
J'ai testé plusieurs macro, adapté certaines à mes besoins, et bon, ça marche, hourra ! Enfin, ça marche avec un modèle simple... Mais ça marche pas avec le modèle dont j'ai besoin !
Ça me renvoi le message d'erreur "l'indice n'appartient pas à la sélection". Je teste avec le débogueur, mais j'vois pas forcément d'où ça peut venir... Vu tous les tests réalisés, je me dis que ça ne peut venir que du modèle. Celui-ci est plutôt complexe. Enfin non. Enfin, faut voir ! Je veux dire par là qu'il contient tout pleins de formules, certaines font référence à des listes contenues dans une BDD qui se trouve sur le même classeur, d'autres vont chercher des informations dans d'autres feuilles...
Aussi, plus qu'un code tout fait, ma question serait de savoir d'où pourrait venir ce genre de message d'erreur, qu'est ce qui pourrait provoquer ça dans mon modèle, et comment tenter des corrections ?
La dernière macro tentée est la suivante, choppée sur internet ( site du Grand Chaman Excel ), dans sa version non-adaptée :
Sub Creation_Onglets_Selon_Modele()
Dim c As Range
Application.ScreenUpdating = False
'On crée les onglets qui sont listés à partir de la cellule
'A2 de l'onglet nommé Liste
Set c = Worksheets("Liste").Range("A2") 'cellule de départ
Do Until IsEmpty(c) 'boucle tant que c est vide
'on copie le modèle en dernier
Worksheets("Modèle").Copy After:=Worksheets(ThisWorkbook.Sheets.Count)
With Worksheets(ThisWorkbook.Sheets.Count) 'avec l'onglet créé
.Name = c.Value 'on renomme
'on remplit notre modèle comme on veut...
.Range("C1") = c.Value
.Range("C3") = Date
End With
Set c = c.Offset(1, 0) 'prochaine ligne
Loop
Application.ScreenUpdating = True
End SubMes adaptations restent succinctes, à savoir modification des noms d'onglets, modification de la cellule de départ, remplissage du modèle plus poussé... Rien qui ne semble modifier le code en profondeur...
Voilà, si vous avez des pistes, merci à vous pour votre aide !
Arnaud
Bonjour,
Essaie ceci :
Option Explicit
Sub Creation_Onglets_Selon_Modele()
Dim wsl As Worksheet, wsm As Worksheet
Dim rng As Range, c As Range
Application.ScreenUpdating = False
Set wsl = Worksheets("Liste")
Set wsm = Worksheets("Modèle")
Set rng = wsl.Range("A2:A10")
For Each c In rng
wsm.Copy after:=Worksheets(Worksheets.Count)
With ActiveSheet
.Name = c
.Range("C1") = c
.Range("C3") = Date
End With
Next
Set wsl = Nothing: Set wsm = Nothing
End SubDéjà ça fait avancer, les onglets sont bien créés comme il faut ! Un grand merci !
Mais, car il y en a un, j'ai deux "soucis".
Bon le premier, c'est une question que je vais tester rapidement, à savoir si je peux quand même boucler la création d'onglet avec
Do Until IsEmpty(c)en choisissant non plus une cellule de départ comme c'était le cas, mais une matrice qui sera plus longue que tout besoin que j'aurais ( genre dans mon cas A13:A1000 ).
La seconde, c'est de lui demander, à la création des onglets, de ne pas traiter l'existence des listes... En fait, dans mes onglets, certains cellules sont associées à des listes ( j'imagine que la personne qui a créé ce tableau a préféré les liste qu'un cellule figée avec les $ dans le cas où il devrait rajouter des lignes dans son modèle ) et quand je lance la macro, il me dit que : "Une formule ou une feuille que vous voulez déplacer contient le nom "XXXXX" qui existe déjà sur la feuille de destination. Voulez-vous utiliser cette version du nom ?". J'ai alors le choix de garder la définition existante, ou bien de la remplacer. Évidemment, je veux la garder.
Le problème, c'est qu'il y a une quinzaine de noms différents, et j'aurais parfois une centaine d'onglets à créer... Me suffit, là, pour tester, de laisser appuyé sur enter puisque le choix par défaut c'est oui, mais bon, si je peux faire ça en masqué ça serait pas mal. J'imagine bien un début de piste, genre effacer toutes les listes du modèle, et les refaire créer par la macro, genre :
Dim "NOM1" as Range
.Range("CELLULEA")=NOM1
Ca pourrait fonctionner ou bien il y a une solution plus élégante ?
Merci !
Re,
Pour la suite, merci de joindre un fichier représentatif anonymisé.
Cdlt.
Ci-joint le fichier en question, épuré des informations "confidentielles".
Dans l'onglet "modèle", les totaux sont les cellules nommées qui posent problème.
F21=totgm par exemple.
Je supprimerais bien toutes ces listes, mais elles sont utilisées pour d'autres calculs, donc faudrait aussi les modifier tout ça tout ça... S'il n'y a que cette option, pourquoi pas, mais si c'est possible d'éviter !...
Si possible, ça serait pas mal d'avoir déjà quelques pistes pour la rédaction du code, sans avoir la solution qui marche direct ( ou alors avec son explication
Arnaud.
Re,
Si tu vas dans le gestionnaire de noms, tu vas t'apercevoir que la grande majorité des noms ne sont pas valides (#REF!).
Peux-tu faire le ménage, et me renvoyer un fichier sain?
Cdlt.
J'avais nettoyé ces références dans une ancienne version, mais comme ça n'avait pas changé le problème, j'étais reparti d'une autre version... Donc effectivement, une fois tout nettoyé, ça marche mieux !
Bon, ça me fait une erreur "400" et ça rajoute un onglet "modèle(2)", mais bon, sur le principe ça ira !
Merci dans tous les cas...
Bonsoir,
Je ne pourrai voir ce sujet que ce weekend.
Mais je comprends le problème.
Cdlt.