Comportement étrange de VBA/Excel

Signaler
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
-
Bonjour,
Certains d'entre vous ont peut-ête suivi cette discussion récente :
Tapez le texte de l'url ici.

Une solution a été trouvé et de demandeur en est satisfait

Reste que la discussion en cause a mis en exergue un étrange comportement de Excel et qu'il m'a fallu près de 48 heures pour trouver le moyen de pallier ce comportemeent.
Pire : à l'occasion de divers essais approfondis, j'ai eu l'occasion de constater que :
- disparaissaient purement et simplement certaines instructions
- disparaissaient également des valeurs données à des variables publiques juste avant l'exécution du code
- plus grave encore : il arrivait qu'au "retour", certains verbes de VBA n'étaient plus fonctionnels ! ===>> plantage de EXCEL

============================================================================================
Voici de quoi identifier plus simplement le phénomène



1) un userform userform1 non modal avec un bouton de commande commandbutton1 et ce code

Private Sub CommandButton1_Click()
  faire_cette_action
End Sub

Dans un module module1 :
Public Sub reprise()
    UserForm1.Show
End Sub

Sub faire_cette_action()
  Application.OnTime Now, "reprise"
  Dim Contrôle_Image1 As OLEObject
  Set Contrôle_Image1 = ActiveSheet.OLEObjects.Add(ClassType:="Forms.Image.1", Link:=False, _
  DisplayAsIcon:=False, Left:=210, Top:=124.5, Width:=123, Height:=49.5)
End Sub

=======================================================================
Observons :
- si l'on supprime la ligne
Application.OnTime Now, "reprise"
le userform ne réapparaît pas
- si on la remplace par l'appel direct de reprise (sans forcer à son appel au ontime) ===>> ne réapparaît pas non plus
- si on la remplace par ce que fait la procédure reprise, à savoir Userform1.Show == >> ne réapparaît pas non plus

Seul le forcing à l'aide de Ontime (y compris sans délai par Now) conduit à sa réapparition .

Tout donne donc à penser que, dans le contexte de ce code (ajout d'image OLE), Excel "oublie" (Alzheimer ?) toutes les instructions qu'il lui a été demander d'exécuter.
Toutes, sauf une, liée directement à l'application Excel et non au classeur : Application.ontime (j'ai passé 48 heures à chercher celles qui ne seraient pas "perdues" !)

Voilà le contexte et le constat.
J'ai ouvert la présente discussion dans le seul but de tenter de tirer des conclusions plausibles sur le comportement de Excel en coulisses.
Ces conclusions pourront, à mon avis, être assez utiles.

[u]Je ne souhaite par contre pas que la présente discussion se transforme en une espèce de "troll".
/u
Mon voeu :
- que les plus avancés uniquement donnent leur avis
- que chaque avis soit assorti d'un exposé précis de ce qui les a conduit à cet avis
- que des essais soient faits (sur la base de ce qu'ils pensent) pour corroborer l'avis donné.

Je remercie par avance tous ceux qui voudront et pourront aller dans ce sens.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient

9 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Bon.
Je constate que ce bug avait été déjà découvert et avec les mêmes symptômes en ce qui concerne la conservation des valeurs des variables !
Voir cette discussion :
Tapez le texte de l'url ici.
Pour laquelle aucune solution n'avait été trouvée (alors que nous savons maintenant, nous, comment y remédier).
Le demandeur, dans cette discussion, était victime de la disparition de ces valeurs.
S'il était allé plus loin en tentant de trouver un remède, il aurait découvert (comme dit plus haut) que dans certains cas de figure, certains Verbes de VBA pouvaient également disparaître
Voilà ... juste pour montrer à quel point il peut s'avérer utile d'essayer de comprendre ce qui se passe "en coulisse", hein ...


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut ucfoutu

Dans quelle version de Excel as-tu eu ces tracas ?
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Excel 2007 en ce qui me concerne.
Mais je pense que c'est également valable pour 2003 (je crois que c'est la version de SERIEUXETCOOL )

Er regarde ce que je viens de découvrir :
petit test :
dans module1 (nécessaire ^pour ne pas perdre le userform, comme vu plus haut):
Public Sub reprise()
    UserForm1.Show
End Sub

et dans userform : deux boutons de commande et :
Private Sub CommandButton1_Click()
  CommandButton2.Caption = "coucou"
  MsgBox "le caption de commanbutton2 a bien été modifié"
  Application.OnTime Now, "reprise" 'on en a besoin, si l'on veut revoir le userform
  Dim Contrôle_Image1 As OLEObject
  Set Contrôle_Image1 = ActiveSheet.OLEObjects.Add(ClassType:="Forms.Image.1", Link:=False, _
  DisplayAsIcon:=False, Left:=210, Top:=124.5, Width:=123, Height:=49.5)
  MsgBox "regardez ce qu'il va redevenir à la sortie de cette sub"
End Sub

Etonnant et étonamment grave !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Je viens de demander à SERIEUXERCOOL de nous préciser sa version (dans la discussion de référence).
Mais je ne me fais aucune illusion car j'ai passé beaucoup de temps aujourd'hui, sur ta toile ===>> une floppée de lamentations de ce genre (disparition d'instructions et de valeurs de variables).


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
115
Date d'inscription
dimanche 6 avril 2003
Statut
Membre
Dernière intervention
29 juin 2012

bonjour
version 2010 egalement
@+JP
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Ceci (avec l'exemple à 2 boutons utilisé plus haut) met bien en évidence que nous n'avons plus du tout affaire à la même fenêtre du userform au retour de l'ajout de l'objet OLE :
code dans module macros :
Option Explicit
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long


Public toto As String
Public Sub reprise()
    UserForm1.Show
    MsgBox FindWindow(vbNullString, UserForm1.Caption)
End Sub


code userform :
Option Explicit

Private Sub CommandButton1_Click()
  MsgBox FindWindow(vbNullString, Me.Caption)
  CommandButton2.Caption = "coucou"
  MsgBox "le caption de commanbutton2 a bien été modifié"
  Application.OnTime Now, "reprise" 'on en a besoin, si l'on veut revoir le userform
  Dim Contrôle_Image1 As OLEObject
  'GoTo 10
  Set Contrôle_Image1 = ActiveSheet.OLEObjects.Add(ClassType:="Forms.Image.1", Link:=False, _
  DisplayAsIcon:=False, Left:=210, Top:=124.5, Width:=123, Height:=49.5)
10
  MsgBox "regardez ce qu'il va redevenir à la sortie de cette sub"
  MsgBox FindWindow(vbNullString, Me.Caption)
End Sub

Private Sub CommandButton2_Click()
  MsgBox FindWindow(vbNullString, Me.Caption)
  CommandButton2.Caption = "eee"
End Sub


si l'on inhibe la ligne GOTO (donc pas d'ajout) on garde la même fenêtre.
si on ne l'inhibe pas === >> on la perd

Ceci étant vu : on peut comprendre le retour à une fenêtre intacte (perte des modifs) puisque nouveau handle.
Passe, encore !
Mais quid de la perte, également, des valeurs des variables publiques ????? (voir plus haut) ! Car là est bien le plus gênant de l'histoire !
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Un autre test plus que "parlant" :
nous allons, pour celui-ci, nous affranchir carrément de l'userform.
Et nous allons constater la disparition du contenu d'une variable publique
une macro essai ===>>
Option Explicit

Public test As String


Public Sub essai()
  MsgBox "la valeur de test est à l'entrée dans la sub essai ===> " & test
  test = "bonjour"
  MsgBox "la valeur de test est maintenant ===> " & test
  'GoTo 10
   Dim Contrôle_Image1 As OLEObject
   Set Contrôle_Image1 = ActiveSheet.OLEObjects.Add(ClassType:="Forms.Image.1", Link:=False, _
   DisplayAsIcon:=False, Left:=210, Top:=124.5, Width:=123, Height:=49.5)
10
   MsgBox "la valeur de test est encore là juste avant la sortie de la sub essai ===>> " & test & vbCrLf & _
   "relancez la macro essai et regardez ce qu'est devenue cette valeur en y entrant !"
  
End Sub


on lance ===>> on lit ===>> on relance ===>> test est vide en entrant !

on commente GOTO (donc plus de passage par l'ajout d'un activex) ===>> on lance ===>> on lit ===>> on relance ===>> cette fois-ci, test a gardé sa valeur

Conclusion : sacré bug ! le fautif est bel et bien l'ajout de l'activex et tout est perdu dès la sortie de la sub (pas avant !)

=====================================================================

J'ai continué à chercher sur la toile ===>> j'y ai découvert d'autres graves ennuis du fait de l'ajout d'activex sur une feuille de calcul ===>> je vous propose de lire ceci (entre autres) :
http://support.microsoft.com/kb/155051/en-us?fr=1' target='_blank'>Tapez le texte de l'url ici.

J'ai affiché en anglais(colonne de gauche) et français (colonne de droite).
Il est nettement préférable de lire directement en anglais car quelques regrettables imprécisions de traduction en français
Il est assez désespérant de constater la légèreté de l'équipe responsable de ce bug .
Voilà tout ce qu'ils ont trouvé comme "solution", au lieu de traiter le bug :
Programmatically add a non-ActiveX control to the worksheet instead of an ActiveX control. You can find Non-ActiveX controls on the Forms toolbar.

Microsoft Excel 97 provides non-ActiveX controls for compatibility with earlier versions of Microsoft Excel.

je fais volontairement abstraction de la "Methose 1" qui, elle, ne traitait que l'affichage lui-même, pas le "fonds" du bug !!!
Que pensez-vous de tout celà ?
Faut-il se plaindre à Microsoft ? (je pense que oui, personnellement).



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Et c'est vraiment du "se moquer du monde" !
Regardons la date de dernière mise à jour de leur article :
Article ID: 155051 - Last Review: October 11, 2006 - Revision: 1.2

Non seulement rien n'a été fait pour corriger ce bug (de gestion de fils, apparemment), mais, ne plus : sont depuis sorties les versions 2007 et 2010, avec le même bug !
Et se surcroît : sans la moindre réserve exposée dans leur doc (l'aide VBA). On ne peut plus inconscient (dommages possibles) et malhonnête !

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
Bonjour,

ceci ne vous apprendras peut être rien mais, je n'ai vu personne aborder le fait que ce problème est une reproduction par code de ce qui ce produit si l'on passe en mode création pendant le déroulement du code.

Je pense que le fait d'ajouter un objet OLE par macro bascule le mode création à "ON" de la même façon que cela ce produit lors d'un ajout manuel du même type d'objet.

Je ne sais pas expliquer pourquoi le mode modal de la form empêche l'apparition du problème mais la aussi, et par ce que l'on à pas la main le problème ne peut apparaître, si l'on tente de passer en mode création pendant le déroulement de la macro. (évidemment puisque l'on a pas la main)
Il n'y a donc peut être pas uniquement l'utilisateur qui n'a plus la main !?!

Peut être une piste...

A+