VBA - Excel : Réduire temps chargement images dans un USF

Fermé
JohnnyBeGood - 13 mai 2020 à 09:06
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 20 mai 2020 à 10:00
Bonjour,

J'ai crée un projet pour gérer ma vidéothèque. Entre autres choses, je peux afficher dans un USF toutes les affiches des films correspondants à ma sélection (par genre, alphabétique, DTS,...). Cela ne pose aucun problème.
Par contre, comme il peut y avoir plusieurs centaines de titres, le temps de chargement de toutes les affiches est assez long (même si cela est relatif - il faut compter 8 secondes pour 100 titres).
J'ai légèrement optimisé mon USF en séparant le travail en deux. Une première boucle crée les contrôles image et dimensionne la hauteur du USF. Cela est quasi immédiat. Une seconde boucle charge les affiches. L'avantage de cette solution, c'est que je peux naviguer dans le USF pendant que les affiches se chargent.
Ma question est : y-a-t'il une autre solution que la boucle pour charger les images ? Et cette autre solution réduirait-elle mon temps de chargement ?
Merci par avance

Private Sub X_Cover() 'gère l'affichage des affiches

Espace = 40: Hauteur = 60: Pas = 1
'TabloTempo est le tableau dans lequel sont stockées les données relatives aux films
For i = 0 To (r - 1) 'boucle créant les contrôles images
DoEvents

Set ObjIMG = UF_FilmsRecherche.Controls.Add("forms.image.1")
With ObjIMG
.Name = "Image" & i
.Left = Espace
.Top = Hauteur
.Width = 153
.Height = 210
.BackStyle = fmBackStyleTransparent
.BorderStyle = fmBorderStyleNone
.ControlTipText = TabloTempo(i, 6) & " - Cliquez pour accèder à la fiche du film"
.Tag = TabloTempo(i, 5)
.MousePointer = fmMousePointerCustom
.MouseIcon = LoadPicture("D:\Mes documents\INFORMATIQUE\CURSORS\harrow.cur")
.PictureSizeMode = fmPictureSizeModeZoom
End With
Espace = 40 + (215 * Pas): Pas = Pas + 1
If Pas > 5 Then Hauteur = Hauteur + 245: Espace = 40: Pas = 1
Next i

HauteurUSF = (Application.WorksheetFunction.RoundUp((i) / 5, 0) * 245) 'défini la hauteur USF
If HauteurUSF > 900 Then
Me.A_Haut.Top = HauteurUSF + 50: Me.A_Haut.Visible = True
Me.A_Fermer.Top = HauteurUSF + 50: Me.A_Fermer.Visible = True
Else
End If
Me.ScrollHeight = HauteurUSF + 100

For i = 0 To (r - 1) 'boucle chargeant les affiches
DoEvents
Nom_Photo = TabloTempo(i, 0)
Chemin_Photo = ActiveWorkbook.Path & "\Outils communs\Affiches\" & Nom_Photo & ".jpg"
Me.Controls("Image" & i).Picture = LoadPicture(Chemin_Photo)
Me.LB_Cpteur.Caption = i + 1 & "/"
Next i

End Sub




Configuration: Windows / Firefox 76.0
A voir également:

4 réponses

cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
13 mai 2020 à 11:07
Bonjour,

pour accélérer l'action de la macro voir ceci:

https://docs.microsoft.com/fr-FR/office/vba/api/Excel.Application.ScreenUpdating

0
JohnnyBeGood
13 mai 2020 à 15:56
merci pour cette réponse, mais j'ai retesté screenupdating, sans réelle différence. De plus, le process d'affichage n'a pas changé. Je peux me tromper, mais il me semble que cette fonction s'applique pour des feuilles (je l'utilise régulièrement) et pas pour des USF.
Ma question reste donc ouverte...
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
13 mai 2020 à 16:16
Cela s'applique à toutes les macro, lire le lien!
0
JohnnyBeGood > cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024
13 mai 2020 à 18:02
Désolé, mais le lien ne parle pas de USF. J'ai aussi positionné screenupdating à différents endroits, sans résultat. J'ai ajouté la fonction enableevents, mais cela ne change rien non plus.
Je n'ai trouvé aucun lien parlant de l'utilisation des screenupdating avec des USF, même sur le site d'aide de microsoft.
Si vous avez un exemple d'utilisation de cette fonction avec un USF, je serais heureux de le voir.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 757
14 mai 2020 à 10:50
Bonjour,

Tu pourrais revoir toute ta manière de procéder non?

Supposes que tu n'affiches que 10 ou 20 images à la fois?
Ce serait instantané?

Et bien :
> fixe toi donc un nombre d'images max,
> intègre directement le nombre de contrôles images dans ton USF en mode création,
> ajoute 2 boutons de "défilement" (droite et gauche ou haut et bas selon ton orientation),
> crée toi les fonctions utiles :
>>> rendre visible ou non le(s) contrôle(s) images (si tu as 20 contrôles images et seulement 9 affiches à montrer)
>>> changement des images au clic sur les boutons de défilement,
>>> etc...
0
JohnnyBeGood
14 mai 2020 à 16:05
C'est une bonne remarque, merci. Mais c'est un peu ce que je faisais avant : je n'affichais que dix photos à la fois et c'était effectivement instantané. J'utilisais la toupie pour passer d'une "page" à l'autre. Cependant, c'était pénible quand j'étais à la "page" 10, par exemple, et que je voulais revenir à la "page" 1. C'est pour cela que j'ai opté pour un affichage total avec un USF à hauteur variable. Comme je le présente dans mon premier message, j'ai optimisé la macro en créant d'abord les contrôles Image, ce qui est quasi instantané, puis en chargeant les affiches. Pendant le chargement, je peux monter ou descendre dans mon USF, ce qui fait que le temps paraît moins long, puisque je peux faire quelque chose. Ce n'est pas l'idéal. C'est pour cela que je cherchais une autre piste, histoire qu'on se creuse les méninges !
Bonne fin de journée.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 757
20 mai 2020 à 10:00
Bonjour,

Cependant, c'était pénible quand j'étais à la "page" 10, par exemple, et que je voulais revenir à la "page" 1.
Suffit d'ajouter un bouton...
avec 4 boutons, tu règles tous les soucis :
<<   <   >   >>
0