C'est une très mauvaise technique de programmation. Désolé de le dire aussi crûment que ça.
Un sous-programme doit se terminer par la commande RETURN. Une procédure de termine par la commande END_SUB. Ces deux commandes ne sont pas équivalentes.
Tu peux effectivement placer un label dans une procédure, tu peux même faire un GOTO ou un GOSUB en direction de ce label, ou l'utiliser comme label pour un évènement. Et il s'exécutera sans problème. Seulement, arrivé au END_SUB, il produira un crash.
Il faut inverser la construction. Il faut faire le sous-programme colplet, du labe au RETURN. Ce label peut alors servir normalement, pour un évènement. Et dans la procédure d'où tu as extrait la partie qui devient un sous-programme, tu fais un GOSUB vers ce label.
Voilà. C'est aussi simple que ça.