Excel 2007 - Problème de Shapes

Signaler
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
-
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
-
Bonjour,

Parmi les feuilles j'en ai une qui possède plusieurs Shapes. Lorsque j'active cette feuille tous les Shapes disparaissent pour réapparaitre dans la seconde.
Lors de l'évènement Activate de cette feuille une macro dispose les Shapes en fonction de la feuille quittée et certains de ceux-ci sont visibles ou pas. Parmi les Shapes il y en a un toujours fixe visible comportant une image jpeg de 150 Ko.
Ceci est dû, je pense, au rafraichissement de la feuille, j'ai essayé ScreenUpdating = False, mais cela reste sans effets.

Avez-vous une solution ? Merci.

Cheyenne

12 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut

Une solution à quoi ?
Tu ne poses pas de question.

Ta première phrase : "Parmi les feuilles ... la seconde"
Est-ce un comportement normal et/ou programmé ou bien le sujet de ton problème ?

"Lors de l'évènement Activate ... il y en a un toujours fixe visible"
Là encore : Constatation ou problème ?

"une macro dispose les Shapes"
Montre ton début de la macro pour voir comment tu te réfères à la feuille + comment tu énumères et manipules tes Shapes

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Bonjour jack,

Certes, je n'ai pas posé de questions mais évoqué le phénomène qui se produit lorsque j'active une feuille.

Je n'ai pas mis le code de manipulation des Shapes car il est assez lourd.
Pour faire simple, disons que dans l'Activate de cette feuille je lance une routine qui exécute divers calculs astro. En fonction de la date et des résultats certains Shapes restent visibles et d'autres pas ou certains visibles sont orientés selon un certain angle.
Le seul Shape qui reste fixe est l'image qui change de teinte selon que le calcul est appelé le jour ou la nuit. Sur cette image vient se positionner un autre Shape (un symbole de planète) à un endroit défini par une partie du calcul.

En résumé, à l'appel de la feuille, plus de Shapes, ceux-ci ne réapparaissant qu'une fois le calcul terminé. A noter que je ne rends pas les Shapes invisibles en début de calcul.

Malgré la présence de ScreenUpdating = False avant la manipulation des Shapes j'ai toujours ce problème lors de l'activation de la feuille.

Cheyenne
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Je n'ai pas beaucoup d'expérience dans le domaine des Shapes.
L'idée qui me viendrait à l'esprit serait de tenter ces manips de Shape en les lançant bien après le Activate.
Si, comme cela arrive en VB classique avec un Form_Load, les objets graphiques ne sont pas encore initialisés au moment du Activate, cela pourrait produire ce genre de phénomène.
--> Essaye de supprimer l'appel dans Activate et d'installer un bouton pour lancer la lourde procédure.
Dit voir si cela change quelque chose au comportement des objets.

Dans ta réponse, insiste sur ce qui ne fonctionne pas. En effet, tu répètes "le seul Shape qui reste fixe ...", mais on ne sait toujours pas si c'est normal/volontaire ou si c'est un de tes problèmes.
Il nous sera impossible de t'aider si on ne sait pas ce qui se passe / ou ce qui ne se passe pas.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Seconde idée : Mets des DoEvents de temps à autre dans ton code afin de laisser Windows agir sur les objets.
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Bonjour jack,

Merci pour ta réponse. En effet, à l'évènement Activate, quand on clique sur l'onglet, les Shapes ne sont pas initialisés et je pense que c'est de là que vient le problème car la version 2007 n'est pas des plus rapides en ce qui concerne le rafraichissement des Shapes et graphiques.

Quant au bouton pour appeler la procédure, j'ai l'équivalent. Il suffit de cliquer sur certaines cellules dans les autres feuilles pour lancer la procédure de calcul et disposer les Shapes. Mais à la fin de cette procédure j'ai toujours cet inconvénient quand j'active la feuille.

Bien évidement, je dispose les Shapes en utilisant :
With Sheets("toto")
   .Shapes("titi").Left .Shapes("tata").Visible
   .Shapes("tutu").Rotation =
    '  etc... etc... etc...
   .Activate
End With

Le Shape qui reste fixe, c'est voulu. J'entends par fixe : qui ne change pas de place, ce qui ne veut pas dire que lui aussi ne disparait pas quand j'active la feuille d'une manière ou d'une autre pour réapparaitre ensuite...

Je vais expérimenter les DoEvents en les plaçant judicieusement et te tiens au courant.
Remarques que ce problème relève plus du confort visuel que d'autre chose...

Cheyenne
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Bonjour,

Les DoEvents, placés aux "endroits stratégiques", ne changent rien à l'affaire.
Sur cette fameuse page il y a des Shapes sur lesquels on peut cliquer. Le fait de cliquer sur un certain Shape entraine l'exécution de cette macro :
Public Sub cmd_LUNE_SOLEIL()
   bSOLEIL = Not bSOLEIL
 
   Application.ScreenUpdating = False
   With Sheets("AZIMUT")
      .Unprotect

      If .Shapes("cmdACTUALISER").Visible Then
          With .Shapes("shpLIVE")
            .Visible = True
            If bSOLEIL Then .Top 63 Else .Top 55
         End With
      End If

      .Protect UserInterfaceOnly:=True
   End With
   
   Call CHOIX_PAGE_AZIMUT
End Sub

A titre d'essai, j'ai inhibé l'appel de la routine Call CHOIX_PAGE_AZIMUT, et bien le fait de cliquer sur le Shape entraine un clignotement de tous les Shapes.
Que le ScreenUpdating soit à True ou False j'ai le clignotement, par contre si je supprimme la ligne ScreenUpdating curieusement je n'ai plus de clignotement !
Si j'appelle la routine les Shapes disparaissent le temps d'exécution de celle-ci puis réapparaissent.
Enfin, rien de bien grave, mais c'est agaçant ! A noter que j'ai une feuille avec des graphiques qui eux scintillent à l'activation de la feuille et pourtant les séries de données ne sont pas changées.
Il semblerait que la version 2007 ne soit pas aboutie, d'ailleurs l'enregistreur de macro ne fonctionne ni pour les Shapes ni pour les graphiques et il n'y a pas que ce problème !

Cheyenne
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
En effet, beaucoup de problèmes (bêtes pour certains) pour les résultats fournis par l'enregistreur de macro de cette version 2007; Condoléances.
En toute logique, et pour t'y retrouver plus facilement, on devrait retrouver un
Application.ScreenUpdating = True
avant la sortie de ta Sub.

S'il y a clignotement, il y a surement du programme qui tourne.
Fais l'essai en pas-à-pas pour vérifier quelle instruction provoque un clignotement. Peut-être découvriras-tu que ton programme demande le visible False avant de le remettre à True, par exemple à cause d'un manque de filtre sur les objets - rappel : Shape désigne tout, bouton comme dessin.

Je le devine, mais confirme quand même : tous tes Shapes sont placés sur une feuille, pas sur une UserForm.
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Bonjour jack,

Oui, tu devines bien, tous les Shapes qui posent problème sont effectivement placés sur une feuille. Je n'ai pas d'UserForm.
D'après Microsoft mettre le ScreenUpadting à True n'est pas nécessaire car il se fait automatiquement avant de quitter la Sub. Mais par prudence j'en colle toujours un avant le Exit Sub.(Mais effectivement pas dans l'exemple de mon dernier post !!!)
Peut-être découvriras-tu que ton programme demande le visible...

Oui, c'est une piste que j'ai explorée en pratiquant, avant que tu me le conseilles, le pas-à-pas et je n'ai rien découvert de particulier, même en mettant certaines instructions critiques en commentaires.
J'ai 17 feuilles dont 12 (une par mois) qui comportent chacune un Shape indiquant le nom du mois et qui commandent tous une macro. En cliquant sur ces Shapes j'ai également un clignotement, tout comme lorsque j'active ces feuilles !
J'ai 4823 lignes de code dans cette application !.
La Sub principale en appelle beaucoup d'autres en cascades et celles-ci ne font que du calcul. Chaque Sub est dédiée à un type de calcul précis. Ce n'est que la dernière qui manipule les Shapes (sur la feuille "principale") en fonction des résultats et cette feuille n'est pas visible à ce moment. Ce n'est qu'à son activation que se produit le phénomène

Je crois, jack, que l'on va en rester là, car finalement ce n'est pas vraiment un problème de programmation mais peut-être, tout bêtement de "synchro".
En tous cas merci pour l'intérêt que tu as porté à mon "problème".

Bonne continuation,

Cheyenne
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Bonjour,
Je viens de tomber sur cette discussion (suis occupé à des tâches matérielles).
Voilà longtemps que j'ai abandonné l'utilisation des shapes de Excel. Trop de problèmes divers et variés.
De mémoire, cependant : les shapes se mettent à "danser la mazurka" dans de nombreuses circonstances, dont :

- la présence de "frozen panes"
- la présente de sauits de page

de tout ce qui, je le pense, doit regérer les dispositions sur la feuille

Essaye, cheyenne, de les inhiber, genre (entre autres) :
ActiveSheet.DisplayPageBreaks = False, pour les sauts de page
Cherche ce qui "va" pour inhiber (mettre à False) les "frozen panes" éventuellement présents
etc ...


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Pour le 2, devrait être (si panes gelés présents) :
ActiveWindow.FreezePanes = False




________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Bonjour ucfoutu,

Merci pour les infos.
N'ayant pas de sauts de page ni de volets dans les feuilles, j'ai quand même inclus les deux instructions, mais cela ne change évidement rien.

Oui, les Shapes posent de nombreux problèmes avec cette version et le tort que j'ai est de vouloir faire du VB6 avec Excel qui est avant tout un tableur. Mais il est quand même plus pratique de visualiser les données dans les tableaux des feuilles (surtout grâce aux nouveaux bargraph) que dans des MSHFlexGrid. Les MFC me sont également très utiles quoique facilement faisables en VB6.
Les Shapes sont là à la fois pour l'agrément et en tant que boutons de commande, on fera avec...

J'avais déjà fait cette appli en VB6, cependant je dois utiliser Excel car l'utilisateur final ne souhaite pas que j'installe des composants sur sa machine. Il avait vu fonctionner le programme et souhaitait le même, mais avec Excel pour les raisons mentionnées ci-dessus.

Tant pis, je laisse cela en l'état, le principal étant l'exactitude des calculs (comparés avec ceux de l'IMCCE).

Bonne continuation,

Cheyenne
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Bonjour,

J'ai résolu le problème !
Le ScreenUdating à False n'agissant pas, tout comme les DoEvents, j'ai mis des Exit Sub à certains endroits et je me suis aperçu que le problème était posé par un reformatage de cellules.
With .Cells(6, 9)
   .VerticalAlignment = xlBottom
   .Font.Color = vbRed
End With
.Cells(7, 9).VerticalAlignment = xlTop
' etc... etc...

Malheureusement je ne peux pas appeler le reformatage avant d'accéder à la feuille car celui-ci se fait par les boutons de commande (Shapes) disposés sur la feuille où sont disposée les autres Shapes avec image.
Selon telle ou telle commande j'appelle une Sub qui inscrit des données dans ces cellules qui ont besoin d'être reformatées.
J'ai trouvé la parade en préformartant des groupes de cellules (hors écran) selon chaque commande.
Au lieu d'inscrire sur les cellules visibles, je place les data dans ces groupes de cellules et je fais Copy sur les cellules non visibles et PasteSpecial Paste:=xlPasteAll sur les cellules visibles avec DisplayAlerts à False et le tour est joué.

C'est un peu du bricolage mais pour l'instant cela fonctionne très bien car tous les Shapes de la feuille restent bien stables.
Mais j'aimerai quand même bien avoir l'explication... avec cette maudite version 2007 !!!

Cheyenne