IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Reset des variables globales lié à création d'OleObjects ?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 9
    Par défaut Reset des variables globales lié à création d'OleObjects ?
    Bonjour à tous,

    Voici mon problème : sur le 1er clic sur un CommandButton toutes les variables globales sont effacées et les OLEObjects sont déréférencés. Les clics suivants ne posent pas de problème.

    Voici le code VBA :

    ThisWorkBook :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Private Sub Workbook_Open()
     
        Init
        Debug.Print "Workbook_Open(), TestVar = ", TestVar  'Afficher la valeur après l'init.
     
    End Sub
    Feuil1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub BtnTest_Click()
     
        Debug.Print "BtnTest_Click(), TestVar = ", TestVar  'A chaque clic afficher la valeur
                                                            ' à l'entrée dans la routine
        TestVar = 12                                        ' puis recharger la variable.
     
    End Sub
    Module1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    Public TestVar As Long
    Public TestButton As OLEObject
     
     
    '-----------------------------------------------------------------------------------------------
    Public Sub Init()
     
    Dim Ctrl As Object
     
        For Each Ctrl In ThisWorkbook.Worksheets("Feuil1").OLEObjects
            Ctrl.Delete                                     'Effacer tout objet présent.
        Next Ctrl
                                                            'Création du bouton.
        Set TestButton = ThisWorkbook.Worksheets("Feuil1").OLEObjects.Add( _
                ClassType:="Forms.CommandButton.1", _
                DisplayAsIcon:=False, _
                Left:=100, Top:=10, Width:=50, Height:=30)
     
        TestButton.Name = "BtnTest"
        TestButton.Object.Caption = "Test"
     
        TestVar = 55                                        'Init de la variable globale.
     
    End Sub

    En utilisant la fenêtre d'exécution on peut voir que TestVar prend les valeurs 55, 0, 12, 12, 12...
    Elle est correcte après la création du CommandButton, elle est effacée sur le 1er clic du bouton, et les clics suivants sont corrects.

    Le problème n'est pas lié au lancement du code par Workbook_Open(). Il apparaît même si le code est lancé par une macro ordinaire.

    Le problème est le même pour des variables objet. Si j'avais créé un autre contrôle AutreCtrl et que j'aie besoin de lire sa valeur il faudra que je le re-référence d'abord :
    Set AutreCtrl = ThisWorkbook.Worksheets("Feuil1").OLEObjects("NomDuControle")
    sinon "Erreur d'exécution 91 : variable objet non définie". Une fois le contrôle re-référencé je peux lire sa valeur, elle a été correctement conservée.

    J'ai lu sur certain forums que la création d'OLEObjects dans une feuille peut effacer les variables globales (bug apparemment connu). Mais ici la variable est initialisée après la création du bouton.

    Même comportement avec un OptionButton ou un SpinButton.

    Pour contourner le problème je suis obligé de stocker les variables globales dans une feuille, mais c'est vraiment cracra !


    Y a-t-il un problème avec mon code ? Quelqu'un a une idée ou a connaissance de ce problème ?

    Merci d'avance.

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour
    Je n'ai pas encore d'explication mais j'ai refais ton test autrement.
    Dans un même module public, je lance Init, puis Toto (encore du sel, Toto est appelée au sein d'Init)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Public TestButton As OLEObject
    Public TestVar As Long
     
    Public Sub Init()
    Dim Ctrl As Object
     
    TestVar = 55
    Debug.Print "1. TestVar= " & TestVar
     
    For Each Ctrl In ThisWorkbook.Worksheets("Feuil1").OLEObjects
        Ctrl.Delete
    Next Ctrl
    Debug.Print "2. TestVar= " & TestVar
     
    Set TestButton = ThisWorkbook.Worksheets("Feuil1").OLEObjects.Add( _
                ClassType:="Forms.CommandButton.1", _
                DisplayAsIcon:=False, _
                Left:=100, Top:=10, Width:=50, Height:=30)
     
        TestButton.Name = "BtnTest"
        TestButton.Object.Caption = "Test"
    Debug.Print "3. TestVar= " & TestVar
     
    Call Toto
    Debug.Print "--------------------Fin Sub Init------------------------"
    End Sub
     
    Public Sub Toto()
    Debug.Print "4. TestVar= " & TestVar
    End Sub
    Le résultat donne
    1. TestVar= 55
    2. TestVar= 55
    3. TestVar= 55
    4. TestVar= 55
    --------------------Fin Sub Init------------------------
    4. TestVar= 0
    Il y a effectivement à la fin de Init, une réinitialisation de la variable publique TestVar

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 9
    Par défaut
    Merci mercatog de t'être penché sur le problème.

    De mon côté j'ai continué à investiguer et voici ma conclusion aujourd'hui : la création ou l'effacement dynamiques du bouton provoque la perte de toutes les variables globales. Les variables globales sont disponibles apparemment jusqu'à la fin de l'exécution de la macro qui crée ou efface le bouton, mais ensuite elles sont effacées et ne sont plus disponibles pour les actions suivantes.
    Ce comportement concerne les contrôles CommandButton, OptionButton et SpinButton. En fait peut-être tous les OLEObjects ?

    Si personne ne voit de souci avec mon code, c'est peut-être un problème avec Excel 2002. J'ai vu sur un forum (ici) la description d'un bug qui correspond à peu près, mais la solution proposée (Application.OnTime) ne fonctionne pas ici.

Discussions similaires

  1. [C#] Peut-on avoir des variables globales ?
    Par Seth77 dans le forum C#
    Réponses: 7
    Dernier message: 10/09/2006, 16h07
  2. comment faire des variables globales
    Par user_ensias dans le forum Struts 1
    Réponses: 3
    Dernier message: 07/09/2006, 10h03
  3. portée des variables globales dans un fichier js
    Par crakazoid dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 14/04/2006, 16h49
  4. utilisation des variables global dans tout le projet
    Par EYENGA Joël dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 12/01/2006, 10h55
  5. De la bonne pratique des variables globales...
    Par say dans le forum C++Builder
    Réponses: 9
    Dernier message: 25/11/2005, 09h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo