Utiliser commande public

Bonsoir à tous

j'ai besoin de vous car j'ai un petit soucis dans mes codes, je vous explique.... lorsque je code dans mon module, je crée plusieurs procédures mais qui sont liés quand meme.. le soucis que j'ai est qu'il faut que j'écrive à chaque fois la déclarations des variables et leurs valeurs dans chaque procédures car vba ne les reconnait pas sinon malgré que j'ai écrit "PUBLIC" devant chaque procédure, vba semble ignorer complètement le public et j'ai meme déclarer des variables public tout en haut de mes procédures mais pareil ça me pose des soucis .. notamment avec des tableau virtuel que j'ai créee, vba ne reconnait pas les valeurs qui sont à l'intérieur lorsque je change de procédure ... donc comment faire pour rendre public toutes mes procédures pour que je n'ai pas à recopier 36000 fois les memes lignes de codes...?

Merci beaucoup beaucoup

Sab

Bonsoir,

Pour la clarter de ton code il convient de limiter les variables publiques...

Mais si tu en as besoin ces variables doivent être déclaré ( dim ) une seule fois en dehors de toutes procedures..

bonsoir merci pour ta réponse pierre.jy euh .....ah il faut les déclarer une seule fois sinon ca pose pb dans le code? meme si jai mis une option explicit cela ne va pas poser pb dans mes codes?

et aussi je dois déclarer des tableaux dynamiques mais apparemment vba ne recaonnait aps du tout les tableaux et encore moins leur contenus ...comment faire ?

re..

j'ai fait ce que tu mas dit de faire c'est à dire déclarer mes variables une seule fois en dehors de toutes procédurres, le probleme est que vba m'affiche un message "l'indice n'appartient aps à la selection" et il me dit que l tableau est vide donc il ne reconnait pas le tableau....

Bonsoir,

Tu fais quelques confusions sur les définitions de variables et leur portée... pas très grave puisqu'il semble que tu débutes et cela va finir par "rentrer" à l'usage.

Tu ferais mieux de fournir un fichier comportant les éléments qui te posent problème et les questions que tu soulèves à leur égard.

Pour débroussailler un peu, que tu utilises ou pas Option Explicit, il est de toute façon conseillé de déclarer toutes ses variables. Si tu l'utilises, VBA te rappellera à l'ordre chaque fois que tu auras oublié d'en déclarer une.

Les variables que tu vas utiliser ont des portées diverses selon l'endroit où tu les déclares et la façon de les déclarer.

Au niveau Procédure, les variables ne sont accessibles qu'à l'intérieur de la procédure, et lorsque celle-ci s'exécute. Entre deux appels de la même procédure, les variables auront disparus de la mémoire, les valeurs qu'elles auront eues ne sont pas conservées. C'est donc dans le code de la procédure que les variables de niveau procédure doivent être initialisée à chaque appel aux valeurs dont tu auras besoin.

(Un cas particulier des variables niveau procédure est les variables statiques (déclarées avec le mot-clé Static) qui conservent leur valeur entre deux appels de la procédure, elles permettent de répondre à des besoins particuliers avec des procédures appelées de façon répétitive mais laissons cela de côté pour l'instant, leur maniement est un peu plus délicat et il faut d'abord roder le courant.)

Dans tous les cas, les variables procédure n'existent que durant l'exécution de la procédure et ne sont pas accessibles de l'extérieur.

Les variables de niveau module, à déclarer en tête du module : il y aura quelques différences selon le type de module. Pour les modules standards, modules de code les plus couramment utilisés, qui sont des modules publics, les variables déclarées avec l'instruction Dim seront accessibles par toutes les procédures du module mais pas de l'extérieur du module. Toutes les variables sont privées par défaut. Pour qu'elles soient accessibles de l'extérieur, il faut les déclarer avec l'instruction Public.

Dans un module privé la situation est à peu près la même, et un variable déclarée avec Public pourra être accessible de l'extérieur, mais il faudra l'appeler en utilisant le nom du module, sous la forme : MonModulePrivé.MaVariable pour y accéder, au lieu d'utiliser simplement son nom.

En ce qui concerne les tableaux, ne te frappe pas pour les erreurs d'indices, tu en auras moins à l'expérience, mais on en rencontre toujours, au moins de loin en loin. Il faut voir cas par cas. Ce qu'il faut savoir au départ, c'est que les indices de tableaux débutent à 0 par défaut :

Dim Tabl(12) déclare un tableau de 13 éléments, de 0 à 12. Tu peux modifier ce comportement en plaçant Option Base 1 en tête de module, qui fera débuter les tableaux à l'indice 1 mais je ne le conseille pas car c'est une source d'erreur, et selon besoin fixer l'indice inférieur :

Dim Tabl(-10 to 10) déclare un tableau de 21 éléments...

Les tableaux sont un domaine très étendu. On peut faire des tableaux multidimensionnels, jusqu'à 60 dimensions (au delà de 3 cela commence à devenir épineux à gérer !), des tableaux dynamiques dimensionnés en cours d'exécution et redimensionnables en cours d'utilisation mais seulement pour ce qui concerne la dernière dimension., et outre les variables tableaux on peut insérer des tableaux dans des variables de type Variant... On n'épuisera pas le sujet.

Cordialement.

merci mferrand pour tes explications . J'ai deja déclarer mes variables en haut du modules en public ainsi que mes procédures mais rien y fait ça ne fonctionne pas..

je vous envoie le workbook si vous pouvez y voir plus clair..

c'est un projet que je fais (gestion de portefeuille). donc à travers le userform, l'utilisateur choisit les actifs de son portefeuille et ensuite lorqu'il clique sur "maximisation du alpha" vba devrait calculer et afficher les rendements du portefeuille choisis par l'utilisteur sur la feuil2 mais vba ne reconnait pas la matrice des rendements des actifs calculé dans une autre procédure mais dans le meme module( car oui le rendement du portefeuile= somme des rendements de chaque actif qui le compose).

Je vous remercie..

Sab


j'aimerais rendre tout public en fait car plus tard je vais créer dautres modules donc j'aimerais que vba puisse reconnaitre n'importe quel tableau ou variable peut importe la procédure ou le module. comment faire? merci bien

Sab

Bonjour,

Je vais regarder. Mais

mais vba ne reconnait pas la matrice des rendements des actifs calculé dans une autre procédure mais dans le meme module( car oui le rendement du portefeuile= somme des rendements de chaque actif qui le compose).

Une fois calculée, que devient cette matrice... car la procédure qui doit l'utiliser doit bien la trouver quelque part.

Sous réserve de voir ta configuration, quand tu déroules une procédure qui a besoin d'éléments calculés au cours de l'exécution, faire faire les calculs par des procédures de type Function est généralement un bon schéma d'organisation. La proc. appelante fait appel à la fonction au moment où elle en a besoin, laquelle fait le calcul et lui passe le résultat...

A plus tard.

Bon ! Je n'ai encore rien vu vraiment, mais au premier coup d'oeil je vois que tu as basculé les procédures associées aux contrôles du Userform en Public. Il ne s'agit pas de variables ici.

Par défaut, toutes les procédures sont publiques (contrairement aux variables qui par défaut sont privées), on les rend privées avec l'instruction Private... sauf les procédures évènementielles, déclenchées non par l'utilisateur mais par un évènement affectant un objet, qui par définition ne peuvent être que privées. Le Private est plus là pour t'en informer, et le changer est sans effet. Tu as intérêt à laisser les choses ainsi et à le rétablir.

Je vais essayer de voir où se situent tes problèmes.

Je reprendrai plus tard ! Ton code est un peu désordonné... Prends l'habitude de l'indenter systématiquement, de pas sauter des lignes en nombre variable, etc. On y gagne en lecture, donc en fatigue et énervement...

Ta stratégie de déclaration de toutes variables en Public (y compris des variables compteur) n'est pas la meilleure, elle te jouera certainement des tours à un moment ou un autre. Le fait qu'une variable puisse être modifiée par n'importe quelle procédure la rend vulnérable et il faut être très sélectif en la matière.

Supposons que tu ouvres simultanément un autre classeur, que tu soies amenée à lancer une procédure dans ce classeur, que par hasard cette procédure utilise une variable de même nom qu'une de tes variables publiques. Ta variable publique va se trouver modifiée à ton insu. Et tu risques de chercher longtemps le pourquoi de la chose....

Autre chose : pour les CheckBox, si tu veux être sûre que la procédure se déclenche, utilise l'évènement Change. Eventuellement en testant la valeur si elle ne doit être lancée que si le contrôle est coché.

Et oubli précédent par rapport à ce que tu disais : évite de multiplier les modules. Généralement un seul suffit amplement. Lorsqu'on en ajoute c'est pour des raisons précises, principalement pour isoler une fonctionnalité du reste du programme. Un exemple en contrepoint à ton usage : isoler des variables sensibles pour que justement elles ne soient pas accessibles à partir d'un autre module et faire en sorte que l'accès à ces valeurs ne se fasse que par l'intermédiaire de fonctions (qui elles ne seront pas en principe appelées accidentellement).

A plus tard.

Effectivement mon code est un ^peu confu car je suis débutante, merci en tout les cas pour tes conseils que j'appliquerai ... sinon c bon mes codes marchent, j'ai pris tes conseils .

merci encore

Bonne soirée

Sab

Rechercher des sujets similaires à "utiliser commande public"