Actualisation d'image dans un boite de dialogue Excel

cs_balisto2 Messages postés 10 Date d'inscription lundi 1 novembre 2010 Statut Membre Dernière intervention 24 février 2011 - 8 févr. 2011 à 07:50
cs_balisto2 Messages postés 10 Date d'inscription lundi 1 novembre 2010 Statut Membre Dernière intervention 24 février 2011 - 24 févr. 2011 à 15:59
Bonjour

J'ai écrit une VBA sous excel 2002 avec une boite de dialogue. Dans cette boite de dialogue, on sélectionne un élément dans une liste et le programme affiche l'image correspondant à la ligne sélectionnée.

ça fonctionne plutot bien mais après un cetain nombre de changement d'image, (en sélectionnant les lignes les unes après les autres), l'image n'est plus actualisée.

J'ai d'abord pensé que j'avais mal référencé un variable et que ça ne marchait plus mais j'ai modifié le code pour qu'il m'inscrive dans une zone texte le nom de l'image qu'il doit charger et le nom est juste.

Je suppose que Excel décide de lui-même de ne plus afficher l'image pour gagner du temps, ou de la place. C'est une supposition gratuite de ma part.

Quelqu'un peut-il m'éclairer?

13 réponses

WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
8 févr. 2011 à 23:44
Bonsoir

A tout hasard tu n'aurais pas des problèmes de fuites mémoire ? (Images allouées les unes après les autres sans être désallouées par exemple)

N.B. Regarde sous le gestionnaire de tâches, si tu n'as pas l'utilisation de la mémoire qui augmente pour ton application au fur et à mesure des changements d'image.

P.S. Un bout de code, si c'est possible, permettrait de mieux cerner le(s) problème(s).

Cordialement.[hr]"L'imagination est plus importante que le savoir." Albert Einstein
0
cs_balisto2 Messages postés 10 Date d'inscription lundi 1 novembre 2010 Statut Membre Dernière intervention 24 février 2011
10 févr. 2011 à 07:12
Bonjour, merci de me répondre.

Mon ordinateur fonctionne en allemand mais je pense que j'étais tout de même au bon endroit. La barre reste à 600 MB. Elle monte un peu de temps en temps puis redescent.

Je tiens à préciser que j'ai appris les VBA sur le tas. Il est tout à fait possible que je passe à côté de quelquechose d'enfentin.

Pour ce qui est du code, voici la macro qui me fait afficher l'image:

Private Sub INfolignE()

Label6 = ""
Label7 = ""
Label8 = ""
Label9 = ""
Label10 = ""
Label20 = ""
UserForm1.Image1.Picture = Nothing



chOIx = UserForm1.Label11

ListBox1.ListIndex = chOIx
ListBox2.ListIndex = chOIx
ListBox3.ListIndex = chOIx
ListBox4.ListIndex = chOIx

WzNAme = ListBox1.Text
DEsC3 = ListBox4.Text
DesC2 = ListBox3.Text
DesC1 = ListBox2.Text
Label6 = WzNAme
Label7 = DesC1
Label8 = DesC2
Label9 = DEsC3
Label20 = WzNAme
ComBien2
UserForm1.Label16 = "1"

If UserForm1.Label18 = 1 Then
UserForm1.CommandButton7.Visible = False
UserForm1.CommandButton8.Visible = False
UserForm1.Label15.Visible = False
UserForm1.Label16.Visible = False
UserForm1.Label17.Visible = False
UserForm1.Label18.Visible = False
Else
UserForm1.CommandButton7.Visible = True
UserForm1.CommandButton8.Visible = True
UserForm1.Label15.Visible = True
UserForm1.Label16.Visible = True
UserForm1.Label17.Visible = True
UserForm1.Label18.Visible = True

End If

On Error Resume Next

PhotOActu
End Sub



Private Sub PhotOActu()
WzNAme = ListBox1.Text
phoTOchanGE = 0
UserForm1.Image1.Picture = Nothing
UserForm1.Image1.Picture = LoadPicture(ActiveWorkbook.Path & "\Photos" & WzNAme & "-1" & ".jpg")
UserForm1.Image2.Picture = Nothing
UserForm1.Image2.Picture = LoadPicture(ActiveWorkbook.Path & "\Photos" & WzNAme & "-1" & ".jpg")
CommandButton6.Visible = True
Label21 = WzNAme
End Sub

J'ai constaté que ce problème surgit systématiquement après le lancement de cette macro:

Private Sub Image1_Click()
WzNAme = ListBox1.Text
If MultiPage1.Value = 0 Then
UserForm1.Image2.Picture = LoadPicture(ActiveWorkbook.Path & "\Photos" & WzNAme & "-1" & ".jpg")
MultiPage1.Page2.Visible = True
MultiPage1.Value = 2
Else
MultiPage1.Value = 0
End If
End Sub

Cette dernière macro fait changer de multipage et dans ce multipage, j'affiche l'image en plus grand format.

Merci pour votre aide
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
10 févr. 2011 à 07:36
Bonjour

N.B. Je n'ai pas le temps ce matin de regarder précisement ton code. Donc comme ça, rapidement et sans tests ! Ca change quelquechose si tu fais ça ?

Private Sub PhotOActu() 
WzNAme = ListBox1.Text 
phoTOchanGE = 0 
UserForm1.Image1.Picture = LoadPicture(ActiveWorkbook.Path & "\Photos" & WzNAme & "-1" & ".jpg") 
UserForm1.Image2.Picture = UserForm1.Image1.Picture
UserForm1.Image2.Autosize = TRUE
CommandButton6.Visible = True 
Label21 = WzNAme 
End Sub 

Private Sub Image1_Click() 
WzNAme = ListBox1.Text 
If MultiPage1.Value = 0 Then 
MultiPage1.Page2.Visible = True 
MultiPage1.Value = 2 
Else 
MultiPage1.Value = 0 
End If 
End Sub 


Cordialement.[hr]"L'imagination est plus importante que le savoir." Albert Einstein
0
cs_balisto2 Messages postés 10 Date d'inscription lundi 1 novembre 2010 Statut Membre Dernière intervention 24 février 2011
10 févr. 2011 à 08:08
Merci pour la réponse

J'ai effectué les changements que tu m'as proposé, Je l'ai un peu modifié mais minime (J'ai notemment supprimé l'autosize)

Mes codes sont maintenant:

Private Sub Image1_Click()

WzNAme = ListBox1.Text
If MultiPage1.Value = 0 Then
MultiPage1.Page2.Visible = True
MultiPage1.Value = 2
Else
MultiPage1.Value = 0
End If


End Sub

Private Sub PhotOActu()
WzNAme = ListBox1.Text
phoTOchanGE = 0
UserForm1.Image1.Picture = LoadPicture(ActiveWorkbook.Path & "\Photos" & WzNAme & "-1" & ".jpg")
UserForm1.Image2.Picture = UserForm1.Image1.Picture
UserForm1.Image2.AutoSize = False
CommandButton6.Visible = True
Label21 = WzNAme
End Sub


Cela ne change rien. Je ne l'ai pas précisé car pour moi c'était clair. Il n'y a que image 1 qui ne s'actualise pas.
Dans le code, nous avons:
UserForm1.Image2.Picture = UserForm1.Image1.Picture
et Image1 me donne une photo A et image 2 une Photo B.
En l'occurence Image 2 est juste et Image1 est faux.

C'est pourquoi je pense qu'il s'agit plus d'un paramètre d'excel ou de l'ordinateur plutôt qu'une erreur dans les codes (tout en étant conscient que mes codes sont perfectionables).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
10 févr. 2011 à 20:11
Bonsoir

Loin de moi de critiquer ton code. Comme je l'ai écrit ce matin, j'ai regardé cela à la va-vite. Ce soir, je vais regarder plus tranquillement ton code et je reposte plus tard ici, sans garanties aucunes du résultat...

Cordialement.[hr]"L'imagination est plus importante que le savoir." Albert Einstein
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
10 févr. 2011 à 20:41
Pourrais-tu effectuer quelques tests ?
Rajouter un "Refresh" derrière l'affectation des images(ex: UserForm1.Image1.Refresh)
Rajouter un "BringToFront" derrière l'affectation des images (ex: UserForm1.Image1.BringToFront)
Rajouter un "DoEvents" derrière l'affectation de l'image.

Chaque action ci-dessus devrait forcer le rafraichissement de l'image. J'aimerais savoir si cela change quelquechose.

Cordialement.[hr]"L'imagination est plus importante que le savoir." Albert Einstein
0
cs_balisto2 Messages postés 10 Date d'inscription lundi 1 novembre 2010 Statut Membre Dernière intervention 24 février 2011
11 févr. 2011 à 11:16
ça ne fonctionne pas mieux.

Mais je ne comprends pas... hier, ça fonctionnait, aujourd'hui, des tas de lignes semblent ne pas être exécutées.
Est-il possible que Excel n'exécute pas certaines lignes par mang^que de temps ou mémoire ou encore autre chose.
la même question pour l'ordi en général en fait.
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
11 févr. 2011 à 12:14
bonjour

oui en cas de fuite mémoire. tu ne consommes pas de plus en plus de mémoire, mais tu en perds continuellement, pour finir par ne plus en avoir.Si les handles des différents objets ne sont pas libérés, c'est le genre de symptômes qui s'en suivent.

Cordialement.[hr]"L'imagination est plus importante que le savoir." Albert Einstein
0
cs_balisto2 Messages postés 10 Date d'inscription lundi 1 novembre 2010 Statut Membre Dernière intervention 24 février 2011
11 févr. 2011 à 12:41
Comme je ne suis pas informaticien, je ne comprends pas tout à fait. Est-ce une défectuosité de mon ordinateur? est-ce une question de paramètre? puis-je y remédier avec une ligne de programmation à l'ouverture du fivher pour remettre dans la même configuration à la clôture du fichier?
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
11 févr. 2011 à 14:53
il faut que tu regardes au niveau de ton programme.
pour éviter les fuites mémire, il faut libérer tous les objets alloués. par exemple, imagines que tu ais besoin d'afficher une image, meme si tu ne le vois pas, le système va réserver des objets pour afficher cette image (par exemple, une surface pour dessiner dessus, un pinceau pour effectuer le dessin, etc) donc si tu utilises 1 objet image ou autre, mais qu'à la fin tu ne le libère pas, le système crois que tu l'utilises toujours et n'y touches pas. tu as alors perdu une partie de la mémoire disponible. maintenant, si ce n'est plus 1 mais 100 objets qui sont utilisés et non libérés, tu auras perdu 100 fois la taille de l'objet.

Cordialement.[hr]"L'imagination est plus importante que le savoir." Albert Einstein
0
cs_balisto2 Messages postés 10 Date d'inscription lundi 1 novembre 2010 Statut Membre Dernière intervention 24 février 2011
15 févr. 2011 à 15:23
Ok, j'ai compris l'idée. Mais comment je libère l'objet? J'ai déjà régulièrement le code par exemple : UserForm1.Image2.Picture = Nothing . Je viens d'essayer de le remplacer par UserForm1.Image2.Picture = false. Dans le premier cas, ça ne change rien, dans le deuxière cas, ça ne fonctionne absolument pas.
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
15 févr. 2011 à 23:41
Bonsoir

Voilà ce que j'ai testé (excel 2003), sans detecter de problèmes chez moi, bien que la taille des fichiers soit assez importante (Un peu plus de 3Mo chaque) :

Private Sub CommandButton1_Click()

  Image1.AutoSize = True
  Dim Count
  For Count = 50 To 1 Step -1
    Image1.Picture = Nothing
    Image1.Picture = LoadPicture("E:\Mes images\k10k.bmp")
    Image2.Picture = Nothing
    Image2.Picture = LoadPicture("E:\Mes images\ice%20cube.jpg")
    Application.Wait Now + TimeValue("0:00:01")
    DoEvents
    Image1.Picture = Nothing
    Image1.Picture = LoadPicture("E:\Mes images\ice%20cube.jpg")
    Image2.Picture = Nothing
    Image2.Picture = LoadPicture("E:\Mes images\k10k.bmp")
    Application.Wait Now + TimeValue("0:00:01")
    DoEvents
  Next Count
  
End Sub

Peux tu essayer chez toi pour voir si cela est correct ?

Cordialement.[hr]"L'imagination est plus importante que le savoir." Albert Einstein
0
cs_balisto2 Messages postés 10 Date d'inscription lundi 1 novembre 2010 Statut Membre Dernière intervention 24 février 2011
24 févr. 2011 à 15:59
Désolé d'avoir mis longtemps à te répondre.

J'ai effectué les modifications que tu me proposais.

Cela ne change rien. Je vais encore l'essayer ce soir sur l'ordinateur de ma femme. Elle travaille avec Windows 7 et un excel bien plus récent que le mien.
0
Rejoignez-nous