Empêcher l'exécution d'un module dans un autre classeur

Bonjour à tous,

J'aimerais savoir s'il est possible de créer des modules qui ne soient exécutables que dans le classeur Excel auquel il appartient.

J'ai fait des recherches sur Google mais en vain. J'ai cependant appris qu'il existe des modules de type classeur, feuille ou encore général.

J'ai créer un module auparavant avec l'option " insérer module ". Mais j'ai un problème car celui- ci s'exécute aussi dans d'autres classeurs ouverts (je pense qu'il s'agit d'un module de type général).

Ensuite j'ai déplacé les macros de ce module dans "ThisWorkBook" (en pensant que c'est un module de type classeur) pour éviter cela, mais maintenant je ne peux pas appeler ces macros dans une macro contenue dans un module de type feuille (macro liée à une feuille du classeur excel).

Je peux mettre ces macros dans un module de type feuille mais j'aimerais tout de même créer un module pour cela et sans qu'il ne soit actif dans d'autre classeur ouvert .

Est-ce possible?

J'ai aussi lu quelques choses sur les modules de classe mais pas compris comment ca fonctionne. Peut-être c'est une solution à ce que je veux obtenir.

Merci d'avance pour vos réponses.

Cordialement

Elo7

Elo7 a écrit :

J'aimerais savoir s'il est possible de créer des modules qui ne soient exécutables que dans le classeur Excel auquel il appartient.

Bonjour,

Regarde dans l'image.

macro

Bonjour,

désolée pour la réponse tardive.

Merci pour votre réponse.

Si je crée un module de cette manière, ne sera t-il toujours pas exécutable dans un autre classeur excel? Car j'ai l'impression que c'est la même chose.

Cdlt

Elo7

Re,

Essaye tu verras

Bonsoir,

J'ai l'impression que tu fais un joyeux mélange

Explique-donc ce qu'il en est exactement et on pourra te dire pourquoi, et comment faire en sorte que tout se passe comme tu le souhaite.

Cordialement.

En fait j'ai plusieurs classeurs avec les mêmes modules et les mêmes nom de feuilles (j'ai fait des copies du premier classeur pour obtenir les autres) mais les données qui y figurent sont différentes.

Et parfois lorsque 2 de ces classeurs sont ouvert simultanément et que je travaillle sur l'un des classeurs, j'ai l'impression que c'est le module qui est enregistré dans l'autre qui se met en marche. (Je ne sais pas comment ça se produit. Et quand j'essaie de le répéter intentionnellement, eh ben je remarque rien de tel).

Peut être que je me trompe.

Mais là ce que j'ai fait, c'est que j'ai effacé tous ces modules et j'ai mis tous les codes dans un module feuille.

Si je comprend bien la suggestion de Raja, je devrais créer mes modules par le biais de l'enregistreur de macro et sélectionner enregistrer la macro dans ce classeur pour être sûre qu'il ne puisse pas être exécuté dans un autre classeur.

J'ai commencer la programmation VBA sans m'être informé sur ces modules et autres, mais j'ai appris des trucs au fur et à mesure.

Mais pouvez vous svp me faire une petite liste des "règles" en ce qui concerne l'organisation d'un projet (s'il y en a. Mais je crois que oui)? Ce serait bien à savoir pour éviter le genre de pb que j'ai eu , car mon projet est, je dois dire, chaotique en ce moment.

Merci d'avance

Cdlt

Elo7

Bonsoir,

Si tu as fait des duplications, il y a toujours interpénétion possible, les boutons auxquels sont attachés des procédures par exemple conservent le lien avec la procédure de l'ancien classeur si on ne fait pas de réaffectation dans le nouveau...

Les modules dépendant d'un objet (feuille, Userform, classeur) sont des modules privés. Les modules standards sont des modules publics, tu peux les rendre privé en mettant en tête de module la déclaration : Private Module.

Mais tu as vu que cela allait te compliquer un peu l'existence...

Je suppose que le problème que tu décris ne se produit qu'avec des procédures ordinaires, qui n'exigent pas d'arguments à leur fournir pour être lancées.

Je crois qu'une vérification de l'attachement de procédures à des boutons (tu dois savoir les cas où il y a un risque, ce qui limite le volume de vérifications), et changer les noms de procédures qui peuvent être identiques, devrait éliminer le problème.

A savoir aussi que pour accéder à une procédure dans un module privé (la procédure doit évidemment être publique elle), il faut l'appeler en utilisant le nom du module où elle se trouve : NomModule.NomProcédure.

D'une façon générale les procédures sont publiques par défaut (ce pourquoi il est toujours inutile de mette Public Sub...) comme les variables sont privées par défaut (ce pourquoi Private MaVariable n'est jamais utilisé).

De toutes façons, là où tu as un doute sur la procédure qui est lancée, tu testes, en mettant un MsgBox en tête de celle qui doit être lancée, et si tu as le message c'est OK...

Les problèmes de portée sont toujours un peu difficiles à apprécier au départ, mais ça vient à l'usage avec les expériences... Ne te casse donc pas plus la tête que nécessaire.

Quelques petits trucs qui peuvent être utiles selon la configuration de ton projet :

  • Déjà l'usage de bouton ActiveX dont la procédure liée est une procédure d'évènement dans le module de la feuille peut offrir une protection dans certains cas.
  • Si tu veux rendre invisible (dans la boîte de dialogue macro, pour éviter par exemple qu'elle puisse être lancée en dehors du bouton), après affectation au bouton ou à la forme, tu la dotes d'un argument optionnel : Sub Macro (Optional mask As Boolean) par exemple, elle reste attachée au bouton, mais n'est plus visible.
  • Si tu as des variables dont les valeurs doivent être protégées d'un accès par d'autres procédures que celles pour lesquelles c'est prévu, tu les places dans un module standard à part et dans ce modules tu crées des fonctions renvoyant la valeur des procédures, ainsi on n'y accède plus directement mais par l'intermédiaire de fonctions... Il ne faut pas omettre de créer aussi une procédure te permettant de les initialiser et éventuellement les modifier dans ce cas (tu peux aussi créer des procédures particulières : Property Let et Property Get, c'est un peu plus délicat, mais il suffit de le faire une fois...)

Bon courage, et bonne soirée.

Bonjour,

Et parfois lorsque 2 de ces classeurs sont ouvert simultanément et que je travaillle sur l'un des classeurs, j'ai l'impression que c'est le module qui est enregistré dans l'autre qui se met en marche.

Pour compléter est-ce que ça ne serait pas plutôt les données d'un mauvais classeur qui seraient utilisées ?

Si tu ne spécifies pas le classeur dans ta macro c'est le classeur actif (et la feuille active si tu ne la spécifies pas non plus) qui est utilisé.

Par exemple Range("A1") ça sera A1 de la feuille active du classeur actif qui sera utilisée.

Avec ThisWorkbook.Sheets("Feuil3").[A1] ça sera A1 de la feuille "Feuil3" du classeur contenant la macro qui sera utilisée.

Défini tes feuilles et tes classeurs dans des variables et tu sauras clairement lequel tu utilises.

Ex :

Dim shSource as Worksheet
Set shSource = ThisWorkbook.Sheets("Feuil3")
....
msgbox shSource.[A1]

eric

Bonjour, Bonjour Eric,

Et merci d'avoir soulevé cette question... J'avais justement pensé qu'il faudrait revenir sur les qualifications d'objets qui peuvent générer des problèmes récurrents.

Bonne journée à tous.

Bonjour et bon début de semaine,

Merci à MFerrand, un Grand Merci même pour ton explication et les astuces. je ne m'attendais pas à une réponse aussi élaborée.

je vais relire et relire ce message pour bien tout cerner.

eriiic a écrit :

Pour compléter est-ce que ça ne serait pas plutôt les données d'un mauvais classeur qui seraient utilisées ?

Si tu ne spécifies pas le classeur dans ta macro c'est le classeur actif (et la feuille active si tu ne la spécifies pas non plus) qui est utilisé.

Par exemple Range("A1") ça sera A1 de la feuille active du classeur actif qui sera utilisée.

Avec ThisWorkbook.Sheets("Feuil3").[A1] ça sera A1 de la feuille "Feuil3" du classeur contenant la macro qui sera utilisée.

Défini tes feuilles et tes classeurs dans des variables et tu sauras clairement lequel tu utilises.

Et Merci à toi aussi Eric,

je pense que c'est bien cela le problème. Ce sont parfois les données d'un autre classeur "jumeau" (ils ont les mêmes noms, les même noms de feuilles et la même Disposition. Seules les valeurs diffèrent. ).

Je vais faire à l'avenir comme tu me suggères de faire en combinaison avec les consignes que j'ai eu dans cette discussions et je pense que le problème sera résolu.

Et pour finir un merci général à tous.

Cdlt

elo7

Bonne continuation...

Rechercher des sujets similaires à "empecher execution module classeur"