Procédure trop grande

Bonjour,

Sous une "SelectionChange" j'ai plus de 800 cellules gérées. Chacune étant un cas différent. Donc beaucoup de code, quoique il n'y a que 2 lignes de code pour chaque cas, le reste se faisant dans d'autres subs.

Je souhaiterais ajouter près de 100 autres cas mais "Procédure trop grande".

Comment éviter?

Merci,

DL

Bonjour,

Tu as toujours la possibilté de demander à ta macro évènementielle d'éxécuter ta macro placée dans un module standard ...

Bon exemple de simplification, car je ne doute pas qu'on trouve dans ces 100 cas un dénominateur commun qui réduirait fortement le programme.

@Loski : il nous faudrait un peu plus de données, notamment un extrait de ton fichier excel et des cas que tu traites ou souhaites traiter.

Soyons fous ... et poussons le bouchon vraiment loin :

Si... tu postais cette procédure trop longue ...

Qui sait ... peut-être aurais-tu des commentaires utiles ... qui dépasseraient le cadre des recommendations de principe ...

En voila une petite partie. IL y en a presque 800. Toutes avec uniquement 2 lignes de code pour chaque cas. Donc je ne peux pas faire mieux.

If Not Intersect(Target, Range("$Y$1:$AA$3")) Is Nothing Then GoTo MergeC3

If Not Intersect(Target, Range("$Y$4:$AA$6")) Is Nothing Then GoTo MergeC6

If Not Intersect(Target, Range("$Y$7:$AA$9")) Is Nothing Then GoTo MergeC9

If Not Intersect(Target, Range("$Y$10:$AA$12")) Is Nothing Then GoTo MergeF3

If Not Intersect(Target, Range("$Y$13:$AA$15")) Is Nothing Then GoTo MergeF6

If Not Intersect(Target, Range("$Y$16:$AA$18")) Is Nothing Then GoTo MergeF9

If Not Intersect(Target, Range("$Y$19:$AA$21")) Is Nothing Then GoTo MergeI3

If Not Intersect(Target, Range("$Y$22:$AA$24")) Is Nothing Then GoTo MergeI6

If Not Intersect(Target, Range("$Y$25:$AA$27")) Is Nothing Then GoTo MergeI9

'If Selection.Value = " " Or Selection.Value = 0 Then GoTo Cantdo

GoTo ReStart ' Waiting for user to click on the next Selection

' ---------------------------------------------------------------------Merge A--------------

MergeA1:

MergeA1sub Rng, x, y, Target, A1, CA1, ModifOne, ModifOneToNine, MainA, MGroup1, VertiAtoC, Horiz1to3, ModifVerti1, ModifHoriz1, SavedValue, A_1

GoTo ReStart

' ------------------------------------------------------

MergeA2:

MergeA2sub Rng, x, y, Target, A2, CA2, ModifOne, ModifOneToNine, MainA, MGroup1, VertiDtoF, Horiz1to3, ModifVerti2, ModifHoriz1, SavedValue, A_2

GoTo ReStart

' ------------------------------------------------------

On peut déjà simplifier tout ceci

If Not Intersect(Target, Range("$Y$1:$AA$3")) Is Nothing Then GoTo MergeC3
If Not Intersect(Target, Range("$Y$4:$AA$6")) Is Nothing Then GoTo MergeC6
If Not Intersect(Target, Range("$Y$7:$AA$9")) Is Nothing Then GoTo MergeC9
If Not Intersect(Target, Range("$Y$10:$AA$12")) Is Nothing Then GoTo MergeF3
If Not Intersect(Target, Range("$Y$13:$AA$15")) Is Nothing Then GoTo MergeF6
If Not Intersect(Target, Range("$Y$16:$AA$18")) Is Nothing Then GoTo MergeF9
If Not Intersect(Target, Range("$Y$19:$AA$21")) Is Nothing Then GoTo MergeI3
If Not Intersect(Target, Range("$Y$22:$AA$24")) Is Nothing Then GoTo MergeI6
If Not Intersect(Target, Range("$Y$25:$AA$27")) Is Nothing Then GoTo MergeI9

par ceci

If Not Intersect(Target, Range("$Y:$AA")) Is Nothing Then fusion target.row

en créant une fonction appelée fusion et qui s'appuie comme paramètre sur la ligne

reste à comprendre le reste du code car c'est trop parcellaire encore !

OK Merci pour la suggestion de Fusion, je vais l'essayer pour une centaine de cas. J'écris un jeu. L'utilisateur peut cliquer sur un group de cells à fusionner ou a défusionner et si le contenu est zéro, il peut modifier le contenu, de plus dépendant de la location des cells, il peut décider autre chose. C'est pourquoi aller dans une subroutine est nécéssaire.

Au début c'était facile, maintenant mon code devient un peu plus compliqué!!

Mais cette erreur "Procédure trop grande" m'a un peu découragé.

Je ne comprends pas la suggestion qui me demande d'écrire tout cet événementiel dans un module. Ne vais je pas rencontrér "Procédure trop grande" dans un module aussi?

Question: dans cette procédure, il y a beaucoup de "Dim" et de "Set". Ces "Dim" et "Set" prennent de la place et agissent vers "Procédure trop grande". Pourrais je les définir ailleurs? Mais comment passer tout ça à la SélectionChange?

Merci les experts,

Daniel

Loski a écrit :

Ne vais je pas rencontrér "Procédure trop grande" dans un module aussi?

je suis prêt à parier que cela ne devrait pas dépasser 20 lignes ! car ton code est répétitif et il faut y mettre des variables ...

héhé parier combien?

Combien de variables peut on définir par sub?

J'ai déjà des dizaines de subs qui sont absolument identiques du fait que le nombre de variables est limité. En fait je ne sais pas à combien est la limite.

Cordialement

Daniel

Une variable peut se construire ... on peut utiliser DECALER pour en construire à l'infini ! mais on peut aussi ajuster les plages en utilisant justement le "target.row" proposé.

Si tu souhaites aller plus loin ...

Bon, je pense qu'on va pouvoir fermer ce topic, j'aurais bien relevé le challenge !

Difficile de tenir le compte des abandons en rase campagne ...!!!

Rechercher des sujets similaires à "procedure trop grande"