Variables globales PERDUES

Bonjour à tous,

Je créé ce poste car je suis vraiment embêté par le comportement de VBA sous Excel!!!

Mon problème est le suivant:

Lorsque j'ajoute un contrôle sur un feuille Excel via une macro, toutes les variables globales sont perdues !!!

Je joints un classeur mettant en évidence ce comportement avec le minimum syndical de code pour que ça soit plus clair.

https://www.excel-pratique.com/~files/doc2/variablePerdue.xls

En espérant que le phénomène se reproduise chez vous (ou pas)

J'explique la procédure:

  • - à l'ouverture du classeur, la variable globale "myVar" est initialisée.
  • - Effectivement, lorsque l'on appuie sur le bouton "Afficher la variable", celle-ci affiche "initialisée" dans un MsgBox
  • - Ensuite, on appuie sur le bouton "ajouter ComboBox", qui ajoute un combobox
  • - Enfin, on affiche à nouveau la variable... Celle-ci est nulle!!! CQFD

Ce comportement me gène énormément et ne me semble pas un comportement normal.

Aussi, je fait appel à vos services.

J'espère que vous pourrez m'expliquer le phénomène et me dire comment m'en affranchir.

Merci!

Bonjour,

Normal qu'elle ne soit pas affichée puisque tu n'appelles pas la macro qui te renvoit le message.

Dans la feuille 1 remplace le code par celui-ci :

Private Sub AfficherVariable_Click()
Call InitVariable
MsgBox myVar
End Sub

Amicalement

Dan

Bonjour, et merci de m'avoir répondu.

Je sais bien que je ne l'appel car le but du bouton et uniquement d'afficher la valeur de la variable est non pas de l'initialiser et d'afficher la valeur.

Ce que je ne comprend pas, c'est pourquoi n'est-il pas suffisant de l'initialiser une seul fois au démarrage.

Pourquoi ma variable perd sa valeur après l'ajout dynamique d'un contrôle?

(ça me semble logique qu'elle conserve sa valeur dès l'instant où je n'y touche pas et que l'appli ne plante pas...)

Il y a manifestement quelque chose que je n'est pas compris dans le fonctionnement d'Excel et de VBA

Si vous pouviez m'éclairer un peu ,

Merci d'avance!

Bonjour,

Ben, nous non plus on comprend pas... Il y a ce qu'on sait, ce qu'on croit savoir et le ...reste !

Ce que j'ai cru découvrir, c'est qu'une erreur d'exécution provoque la perte des variables publiques... (Cependant la création de contrôle n'entraine pas d'erreur d'exécution récupérable...)

Une solution (peut-être ! je n'ai pas le temps de tester ) : La création de Nom "en dur" dans le classeur ?

A+

Bonjour galopin01, merci pour ta réponse!

Je ne suis pas franchement rassuré de ne pas être le seul à ne pas comprendre (trois négations dans une phrase, c'est du Zola!)

Je ne vois pas trop ce que tu entends par création de nom en dur dans le classeur.

s'il s'agit d'écrire mes variables dans cellules quelque part pour ne pas les perdre, ça me parait un peu sale.

De plus, j'ai simplifié le problème mais dans la réalité, c'est non seulement des string que je perd, mais aussi des collections et des objets.

Je ne peux pas stocker des objets dans des cellules.

Ce problème me parait sérieusement rédhibitoire pour programmer en VBA.

Si quelqu'un comprend le phénomène, qu'il n'hésite pas à ce manifester!

Merci d'avance!

Merci encore pour ta réponse et ta franchise!

Re,

Le pb vient lors de la création de l'objet via la boite à outils de contrôle car si tu fais la même opération par la boite à outils "formulaire" ta variable reste "initialisée"

Là il faudrait voir ce que excel voit lorsque tu cliques sur ton bouton "Combobox". Peut être qu'excel supprime ta variable pour des questions de mémoire allouée (cela reste à vérifier….)

VBA permet peut être de pallier à ce pb mais là il y a besoin de plus de précisions sur ce que tu veux faire et quel est le but de cette variable dans ton projet.

A te relire

Dan

Merci Dan pour ta réponse.

Ce que je veux faire est on ne peut plus simple.

Je veux pouvoir ajouter dynamiquement des contrôles dans ma feuille sans que cela ne provoque la réinitialisation de mes variables globales.

typiquement, si je souhaite gérer un catalogue d'articles:

lorsque j'ajoute un article, un ligne est ajoutée dans mon catalogue.

En plus des informations concernant l'article, deux bouton sont ajoutés en fin de ligne:

un pour supprimer l'article

un pour modifier l'article

Problème: l'ajout de ces boutons réinitialise toutes mes variables globales.

En fait, j'ai du mal à imaginer comment me passer de ce genre de fonctionnalité tant cela me parait essentiel dans une IHM.

Cela se produit également quand on supprime un contrôle. (retirer article du catalogue)

re,

Si j'ai bien compris ce que tu veux faire, voici juste quelques suggestions.

lorsque j'ajoute un article, un ligne est ajoutée dans mon catalogue.

Pourquoi n'ajoutes tu pas une liste de validation dans la cellule de la colonne B plutôt que d'ajouter une combo ?

En plus des informations concernant l'article, deux bouton sont ajoutés en fin de ligne: un pour supprimer l'article, un pour modifier l'article

Pourquoi ne pas créer deux bouton dans tes barres d'outils ou placer seulement deux boutons en ligne 1.

Pour ajouter, on ajoute une ligne après la dernière ligne

Pour supprimer, tu sélectionnes une cellule de la ligne à supprimer, puis clique sur le bouton "supprimer" (se trouvant au dessus de ta page ou dans une barre spécifique) et là un message te demandant de confirmer la suppression.

De cette sorte ton fichier serait à terme plus léger en poids.

A te relire

Dan

Je précise que le classeur du début du thread est uniquement pour illustrer le problème.

Pour la liste de validation, c'est une bonne remarque.

Je me demande juste si je suis capable d'intercepter l'évènement de change d'état de ma liste comme je le fait avec des combobox.

L'avantage des combobox c'est que je peux surcharger les méthodes _change() ou _Click() pour faire ce que je veux.

Peut-être qu'avec une liste il me faut passer par workSheet_Change(), dans quel cas cette méthode déjà largement exploitée risque de devenir bordélique!

Concernant les boutons,

dans l'exemple que j'ai cité, ta solution est juste, cependant, je trouve dommage de devoir faire ce genre de d'arrangement.

Je suis tout de même intéressé par les listes à défaut de pouvoir utiliser des combobox dynamiquement.

Je pose donc une dernière question:

et-il possible de tester si une cellule est un liste de validation?

Merci beaucoup pour ta réponse!

Au plaisir!

re,

Je me demande juste si je suis capable d'intercepter l'évènement de change d'état de ma liste comme je le fait avec des combobox.

Bien sûr.

cependant, je trouve dommage de devoir faire ce genre de d'arrangement.

A toi de voir mais excel gérera mieux si tu fais référence à un objet plutôt qu'un par ligne.

Imagine une base de données que tu achètes avec un bouton par ligne dans un tableau.

et-il possible de tester si une cellule est un liste de validation?

A vérifier mais je ne vois pourquoi cela ne pourrait pas se faire.

Une chose à voir, c'est comment est fait ton fichier.De là c'est plus simple d'apporter des idées.

Amicalement

Dan

Bonsoir,

et-il possible de tester si une cellule est un liste de validation?

Dans le Worksheet_Change :

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Cells.SpecialCells(xlCellTypeAllValidation)) Is Nothing Then
   'ton code
End If
End Sub

Si tu modifies une valeur d'une cellule contenant une liste de validation, tu déclenches ton code...

Bonne soirée

Ok, merci pour les listes de validation, ça fonction correctement et c'est plus facilement gérable!

Merci cousinhub pour ton code, j'avais fait un peu différemment avec un code du genre:

if cells(Target.Row, Target.Column).Validation.Type = xlValidateList Then
...mon code...
End if

Je ne sais pas ce qui est mieux mais de mon coté ça fonctionne, ton code aussi je suppose.

Merci pour vos conseils et votre assiduité à mon thread

Il est clair qu'un code en VBA est totalement différent du JAVA et C++

Think different comme disait l'autre

Bien que je ne sois toujours pas fixé sur ma requête initiale, je suis débloqué dans l'avancement de mon application.

Je ne sais pas du coup si je dois clore le sujet, ça résolution étant je pense dans l'intérêt général...

Finalement, j'ai pris le code cousin hub qui fonctionne mieux que le mien

re,

Merci de mettre RESOLU sur le fil si ton pb est terminé

Explications ici --> https://www.excel-pratique.com/forum/viewtopic.php?t=13

A bientôt

Dan

Rechercher des sujets similaires à "variables globales perdues"