Aller d’un Sub sur l’étiquette d’un autre Sub

Fermé
winform Messages postés 66 Date d'inscription mercredi 19 septembre 2012 Statut Membre Dernière intervention 1 juin 2018 - 30 mai 2018 à 20:29
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 - 1 juin 2018 à 15:51
Bonjour,

J’ai une grand feuille de calcul Excel avec beaucoup de procédures de calcul et où j’ai mis (dans VBA) : Private Sub Worksheet_SelectionChange(ByVal Target As Range)

(donc à chaque clic sur ma feuille ce Sub se lance et j’ai le résultat dans les cellules immédiatement).

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Etiq_1:
If Not Intersect(Target, Range("CONTROLE_T")) Is Nothing Then
:
:
Exit sub
Etiq _2:
If Not Intersect(Target, Range("CONTROLE_X")) Is Nothing Then
:
:
Exit sub
Etiq _3:
If Not Intersect(Target, Range("CONTROLE_Y")) Is Nothing Then
:
:
Exit sub
Etiq _4:
If Not Intersect(Target, Range("CONTROLE_Z")) Is Nothing Then
:
:
End Sub

-------------------------------------------------------------------------------------------

Néanmoins, dans certains cas je ne veux exécuter qu’une partie de ce Private Sub Worksheet_SelectionChange(ByVal Target As Range), sans descendre toujours la totalité (trop long et prend du temps).

Donc, pour ne pas extraire et dupliquer chaque procédure (a, b, c, d, ...) dans des Sub différents, je garde ce Private Sub Worksheet_SelectionChange où je veux lancer une procédure seulement selon un bouton sur ma feuille. Puis-je aller sur l’étiquette concernée dans le Private Sub Worksheet_SelectionChange à partir d'un autre Sub?

En fait, aller à partir d’un Sub sur l’étiquette d’un autre Sub.

Mes boutons appellent ces Subs, où j'irais sur une étiquette de Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Sub LANCE_CALCUL_1()
Goto Etiq_1
End Sub

Sub LANCE_CALCUL_2()
Goto Etiq_2
End Sub

Sub LANCE_CALCUL_3()
Goto Etiq_3
End Sub
Etc …

Est-ce possible?

Avec mes grands remerciements. Cordialement winform
A voir également:

4 réponses

gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 713
30 mai 2018 à 21:31
Bonjour,

Pourquoi compliquer quand l'on peut faire simple ?
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

'Etiq_1
If Not Intersect(Target, Range("CONTROLE_T")) Is Nothing Then
:
:
'Etiq _2
elseIf Not Intersect(Target, Range("CONTROLE_X")) Is Nothing Then
:
:
End If
End Sub 

Ainsi tu n'as qu'un code qui s'exécute selon le contrôle activé : il suffit de mettre le 'elseif.
0
winform Messages postés 66 Date d'inscription mercredi 19 septembre 2012 Statut Membre Dernière intervention 1 juin 2018
31 mai 2018 à 10:35
pardon, j'ai oublié comment je ferais ces Boutons individuels ...

Private Sub Bouton_Calc1_Click()
Call Etiq_1 ’dans Private Sub Worksheet_SelectionChange(ByVal Target As Range)
End sub
Private Sub Bouton_Calc2_Click()
Call Etiq_2 ’dans Private Sub Worksheet_SelectionChange(ByVal Target As Range)
End sub
Private Sub Bouton_Calc3_Click()
Call Etiq_3 ’dans Private Sub Worksheet_SelectionChange(ByVal Target As Range)
End sub
0
winform Messages postés 66 Date d'inscription mercredi 19 septembre 2012 Statut Membre Dernière intervention 1 juin 2018
31 mai 2018 à 10:29
Bonjour, merci pour la réponse. Oui c'est tt à fait juste, néanmoins j'ai omis de préciser qq chose :

Puisque ma feuille contient bcp trop de calculs, j’ai installé un bouton de bascule :
Calcul Automatique ou Calcul Manuel.

Private Sub AUT_MAN_Click()
If AUT_MAN.Value = True Then
Var_Recalcul = "Automatique"
Else
Var_Recalcul = "Manuel"
End If
End Sub

Quand Private Sub Worksheet_SelectionChange... est appelé, Var_recalcul est détecté et s’il est sur Manuel, Exit sub (dans ce cas des Boutons de contrôles individuels seront lancés, qui iront justement sur l'étiquette concernée).

S’il est sur Automatique, je laisse se dérouler le Private Sub Worksheet_SelectionChange... en fonction de If Not Intersect...

Donc, si on choisi Manuel, je voudrais aller (avec ces boutons de calcul) uniquement sur la procédure qui est concernée, sans descendre tout le Private Sub Worksheet_SelectionChange... avec ces dizaines de If Not Intersect...

Merci encore, Cdlt winform
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 713
31 mai 2018 à 12:02
Bonjour,

J'ai nettement l'impression que tu tiens à créer une usine à gaz sans raison.
En quoi le calcul automatique ou manuel peut intervenir ?
0
winform Messages postés 66 Date d'inscription mercredi 19 septembre 2012 Statut Membre Dernière intervention 1 juin 2018
31 mai 2018 à 14:17
Bonjour, ...bonne idée le gaz, le carburant commence à être trop cher!
En fait, si à chaque clic le Private Sub Worksheet_SelectionChange(ByVal Target As Range) se déclenche (et ça se déclenche) il y a énormément de contrôle dedans que j'essaye de limiter avec des dizaines de If Not Intersect(Target, Range("CONTROLE_X")) Is Nothing Then...
Je pourrais extraire ces If Not Intersect et les mettre dans des Sub déparés, mais je voudrais donner un choix (Manuel) que soit ce long contrôle via le Sub Worksheet_SelectionChange s'exécute, soit uniquement la partie demandée. Si possible. Sinon tant pis. Ce qui m'intéresserait, peut-on enter à partir d'un Sub sur une étiquette située dans un autre Sub.
Merci, cldt
0
winform Messages postés 66 Date d'inscription mercredi 19 septembre 2012 Statut Membre Dernière intervention 1 juin 2018
31 mai 2018 à 14:18
... même si j'ai mis des Exit sub après chaque exécution de If Not Intersect .... c'est trop long
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 713
31 mai 2018 à 17:23
Bonjour,

Tu n'as pas du tout compris le fonctionnement de If Not Intersect elseIf Not Intersect ...end if
Même si tu en as 20 cela est instantané mais il faut que ce soit bien codé et tu n'as absolument pas besoin des Exit sub qui ne servent strictement à rien car si tu exécutes le code 10 par exemple il se termine à end if end sub.

peut-on enter à partir d'un Sub sur une étiquette située dans un autre Sub.
C'est possible mais je ne te l'expliquerais pas car c'est totalement anachronique, cela date de la programmation des années 1970 lorsque la programmation objet de VBA ou autre n'existait pas.
0
winform Messages postés 66 Date d'inscription mercredi 19 septembre 2012 Statut Membre Dernière intervention 1 juin 2018
1 juin 2018 à 09:28
Bonjour, OK je me rends ... effectivement après l'exécution de If Not Intersect ... puis tt de suite End sub est tt à fait logique.
Donc je ne me complique plus l'existence, merci bcp pour les éclaircissement. Par contre je vais lancer une autre question sur CCM : comment accélérer l'exécution de Private Sub Worksheet_SelectionChange(ByVal Target As Range).
Merci encore, bonne journée, cdlt winform.
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
Modifié le 31 mai 2018 à 18:34
Bonjour,

fait comme te dit gb. Les goto c'est le mal ;-)

Et tu pourrais faire l'inverse : tes traitements dans les boutons.
Et dans le Change :
If Not Intersect(Target, Range("CONTROLE_T")) Is Nothing Then Bouton_Calc1_Click
ElseIf ....

eric

0
winform Messages postés 66 Date d'inscription mercredi 19 septembre 2012 Statut Membre Dernière intervention 1 juin 2018
1 juin 2018 à 09:35
Bonjour, effectivement ceci est également un bonne solution, mais ces boutons existent déjà qui lancent directement un seul calcul spécifique, si je ne veux pas entrer dans Sub Worksheet_SelectionChange(ByVal Target As Range) où se trouve l'ensemble de ces calculs. Je vais plutôt m'intéresser (dans une autre question sur CCM) à l'accélération de ce Sub. Si ce n'est pas possible, j'abandonne ce Sub Worksheet_SelectionChange... et resteront uniquement ces boutons que l'on pourra lancer à volonté.
Cdlt winform
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 713
1 juin 2018 à 09:53
Bonjour,

Si tu nous mets le code de ta Sub Worksheet_SelectionChange, avec Éric que je salue, l'on est prêt à t'aider à l'accélération de ce Sub.
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
1 juin 2018 à 12:03
Bonjour,

mais ces boutons existent déjà qui lancent directement un seul calcul spécifique, si je ne veux pas entrer dans Sub Worksheet_SelectionChange(ByVal Target As Range) où se trouve l'ensemble de ces calculs
oui. Et ça enlève quoi à ce que je t'ai dit ?
Les boutons font individuellement toutes les action du Change si j'ai bien compris.
Il est inutile de dupliquer le code, tu réutilises celui des boutons plutôt que que ce soit les boutons qui réutilisent celui du Change.
Et si tu veux désactiver le Change par une variable ça reste possible.
eric
0
winform Messages postés 66 Date d'inscription mercredi 19 septembre 2012 Statut Membre Dernière intervention 1 juin 2018
1 juin 2018 à 14:34
Sinon :
avec cette 1ère solution* proposée (If Not Intersect(Target, Range("CONTROLE_T")) Is Nothing Then Bouton_Calc1_Click
ElseIf ....), qui me semble pas mal, je crois quand-même qu'avant d'arriver à la bonne If Not Intersect... la Worksheet_SelectionChange est testé du début jusqu'à y arriver, puis, et comme le dit gbinforme, la procédure Exit tout de suite du ce Sub et rend la main.
La question (car je vais essayer cette solution*) si je lance le BOUTON_Calc1 contenant la procédure concernée, est-ce que Sub Worksheet_SelectionChange me rend la main tt de suite (car sort vers la procédure de ce BOUTON qui va faire son travail) ou je dois attendre là aussi la fin de cette procédure, ce que causera autant de temps d'attente?
Donc j'attaque la modification ... cldt
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
1 juin 2018 à 15:51
Sans voir le code exact de tes procédures on ne peut que parler dans le vide.
0
winform Messages postés 66 Date d'inscription mercredi 19 septembre 2012 Statut Membre Dernière intervention 1 juin 2018
1 juin 2018 à 14:19
Bonjour, oui, avec une variable j'ai mis tt de suite au début un If variable.... Exit du Sub Worksheet_SelectionChange.
Mais en fait c'est ce Sub Worksheet_SelectionChange qui est trop long à traverser tous les If Not Intersect..., c'est à dire qu'à chaque appui n'importe où sur la feuille ça se déclenche et mouline...mouline...
Par contre, déclencher toujours des recalcules avec des boutons est aussi énervant, surtout que les cellules adjacentes utilisent immédiatement la saisie dans une autre cellule (chose que je ne peux pas toujours résoudre avec des SI(...SI(ET(... SI(ET(OU... qui rendent trop complexe la lecture de la feuille).
Merci encore cdlt
0