Bonsoir
J'ai dans mon userform 4 images que j'aimerai faire apparaitre tour a tour toutes les 5 secondes.
Quelqu'un pourrait-il me donner un coup de main.
Merci d'avance.
Version imprimable
Bonsoir
J'ai dans mon userform 4 images que j'aimerai faire apparaitre tour a tour toutes les 5 secondes.
Quelqu'un pourrait-il me donner un coup de main.
Merci d'avance.
Bonsoir.
Je te propose ceci, dans le module associé au userFormDans un module standardCode:
1
2
3
4
5
6 Private Sub UserForm_Initialize() Me.Image1.Visible = True Application.OnTime Now + TimeValue("00:00:04"), "subShowPic" End Sub
Cordialement,Code:
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
31
32
33 Sub subShowPic() Dim i As Integer If fUsfIsLoaded("UserForm2") Then For i = 1 To 4 If UserForm2.Controls("Image" & i).Visible Then Exit For Next i If i < 4 Then UserForm2.Controls("Image" & i).Visible = False UserForm2.Controls("Image" & i + 1).Visible = True Else UserForm2.Controls("Image4").Visible = False UserForm2.Controls("Image1").Visible = True End If Application.OnTime Now + TimeValue("00:00:05"), "subShowPic" End If End Sub Function fUsfIsLoaded(ByVal sUsfName As String) As Boolean Dim oUsf As Object For Each oUsf In VBA.UserForms If oUsf.Name = sUsfName Then Exit For Next oUsf If Not oUsf Is Nothing Then fUsfIsLoaded = True Set oUsf = Nothing End Function
PGZ
Bojour,
à rajouter dans ton UserForm
Code:
1
2
3
4
5
6
7
8
9
10
11 Public Sub subShowPic() Static i As Integer Me.Controls("Image1").Visible = False Me.Controls("Image2").Visible = False Me.Controls("Image3").Visible = False Me.Controls("Image4").Visible = False i = i + 1 Me.Controls("Image" & i).Visible = True If i = 4 Then i = 0 Application.OnTime Now + TimeValue("00:00:05"), "UserForm2.subShowPic" End Sub
Merci à pgz et rdurupt pour vos réponses.
Au fait, avec la réponse de pgz, ça marchait déjà.
Si vous pouvez mettre des commentaire a coté, se serai formidable pour pourvoir comprendre ce code que jusque là je n'y ai rien compris, même si ça fonctionne. Voilà pourquoi je vais encore attendre un peu avant de valider comme "Résolu"
Merci encore.
Mon Objectif est d'atteindre mon Objectif.
RastaBomboclat
Code:
1
2
3
4
5
6
7
8
9
10
11
12 Public Sub subShowPic() 'Je déclare un sub public dans mon formulaire pour la rendre accessible de lextérieur. Static i As Integer 'je déclare une variable static pour que la valeur reste en mémoire même quand je quitte la sub et/ou le formulaire! 'je masque toutes les images. Me.Controls("Image1").Visible = False Me.Controls("Image2").Visible = False Me.Controls("Image3").Visible = False Me.Controls("Image4").Visible = False i = i + 1 'incrément ma variable static pour quelle colle successivement aux images 1,2,3,4 Me.Controls("Image" & i).Visible = True 'je rends visible limage qui correspond à i (1,2,3,4) If i = 4 Then i = 0 'si i match sur l'image 4 je replace i à zéro pour qu'a la prochaine incrémentation il affiche l'image1 Application.OnTime Now + TimeValue("00:00:05"), "UserForm2.subShowPic" 'vue que ma sub est public j'y accède de lextérieur du formulaire! End Sub
Merci rdurupt
Très claire :)
Bonjour.
Je pensais que c'était clair. Voici qq explications.
A l'ouverture du formulaireLe formulaire a été créé avec 4 images masquées. A l'ouverture du formulaire, on rend visible la première image et on commande l'exécution de "subShowPic" 5 s plus tard.Code:
1
2
3
4
5
6 Private Sub UserForm_Initialize() Me.Image1.Visible = True Application.OnTime Now + TimeValue("00:00:04"), "subShowPic" End Sub
Le code vérifie que le formulaire est toujours ouvert et si c'est le cas, regarde quelle image est visible de Image1 à Image 4. Si c'est Image 1 à 3, alors l'image visible est masquée et la suivante est rendue visible (i et i+1). Si c'est l'image 4, alors elle est masquée et c'est la 1 qui est rendue visible (4 et 1).Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 Sub subShowPic() Dim i As Integer If fUsfIsLoaded("UserForm2") Then For i = 1 To 4 If UserForm2.Controls("Image" & i).Visible Then Exit For Next i If i < 4 Then UserForm2.Controls("Image" & i).Visible = False UserForm2.Controls("Image" & i + 1).Visible = True Else UserForm2.Controls("Image4").Visible = False UserForm2.Controls("Image1").Visible = True End If Application.OnTime Now + TimeValue("00:00:05"), "subShowPic" End If End Sub
Ceci fait, on programme à nouveau l'exécution de cette procédure 5 s plus tard. ET donc toutes les 5 s, l'image visible change.Cette fonction permet de s'assurer que le formulaire est ouvert. Ici on parcourt la liste des usf ouverts (= collection VBA.UserForms). SI on trouve le nôtre, on sort de la boucle et l'objet dans oUsf, c'est notre formulaire. Si on ne trouve pas, on sort de la boucle avec oUsf = Nothing.Code:
1
2
3
4
5
6
7
8
9
10
11
12 Function fUsfIsLoaded(ByVal sUsfName As String) As Boolean Dim oUsf As Object For Each oUsf In VBA.UserForms If oUsf.Name = sUsfName Then Exit For Next oUsf If Not oUsf Is Nothing Then fUsfIsLoaded = True Set oUsf = Nothing End Function
Cordialement,
PGZ
Code:
1
2
3 sub Test UserForm2.subShowPic 'Lance le formulaire! end sub
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 Public Sub subShowPic() 'Je déclare un sub public dans mon formulaire pour la rendre accessible de lextérieur. Static i As Integer 'je déclare une variable static pour que la valeur reste en mémoire même quand je quitte la sub et/ou le formulaire! 'je masque toutes les images. Me.Controls("Image1").Visible = False Me.Controls("Image2").Visible = False Me.Controls("Image3").Visible = False Me.Controls("Image4").Visible = False i = i + 1 'incrément ma variable static pour quelle colle successivement aux images 1,2,3,4 Me.Controls("Image" & i).Visible = True 'je rends visible limage qui correspond à i (1,2,3,4) If i = 4 Then i = 0 'si i match sur l'image 4 je replace i à zéro pour qu'a la prochaine incrémentation il affiche l'image1 Application.OnTime Now + TimeValue("00:00:05"), "UserForm2.subShowPic" 'vue que ma sub est public j'y accède de lextérieur du formulaire! me.show 'affiche le formulaire End Sub
Merci Prof PGZ !
Mrs les Experts,
Je reviens encore avec un autre problème, similaire au précedent.
Au fait, quand j'ai dans mon userform un Multipage et que j'utilise le code pour le deux pages que contient le Multipage, il y a un genre retard, et même blank page durant la bouble, spécialement quand la bouble arrive à la dernière image.
Avez-vous une astuce pour résoudre ça?
PS: Fichier joint.
Cdt,
RastaBomboclat
Salut Rasta.
Pas la peine de faire de la lèche, on va t'aider même sans !
Maintenant que ton userform a un contrôle 2 pages :
- tu as convenablement modifié la procédure d'initialisation
- il faut modifier subShowPic
- et ajouter une procédure au changement de page.
Cela donne, pour le module de classe du userformet pour le module standardCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Option Explicit Private Sub MultiPage1_Change() If Me.MultiPage1.Value = 0 Then Me.Image5.Visible = False Me.Image6.Visible = False Me.Image7.Visible = False Me.Image8.Visible = False Me.Image1.Visible = True ElseIf Me.MultiPage1.Value = 1 Then Me.Image1.Visible = False Me.Image2.Visible = False Me.Image3.Visible = False Me.Image4.Visible = False Me.Image5.Visible = True End If End Sub Private Sub UserForm_Initialize() Me.MultiPage1.Value = 0 Me.Image1.Visible = True Application.OnTime Now + TimeValue("00:00:03"), "subShowPic" End Sub
Dans ton classeur il y a actuellement 2 procédures "subShowPic", il faudrait choisir. Avec "Option explicit" tu verras aussi que tu as des variables non définies.Code:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 Option Explicit Public Sub subShowPic() Dim i As Integer If fUsfIsLoaded("UserForm1") Then If UserForm1.MultiPage1.Value = 0 Then For i = 1 To 4 If UserForm1.Controls("Image" & i).Visible Then Exit For Next i If i < 4 Then UserForm1.Controls("Image" & i).Visible = False UserForm1.Controls("Image" & i + 1).Visible = True Else UserForm1.Controls("Image4").Visible = False UserForm1.Controls("Image1").Visible = True End If ElseIf UserForm1.MultiPage1.Value = 1 Then For i = 5 To 8 If UserForm1.Controls("Image" & i).Visible Then Exit For Next i If i < 8 Then UserForm1.Controls("Image" & i).Visible = False UserForm1.Controls("Image" & i + 1).Visible = True Else UserForm1.Controls("Image8").Visible = False UserForm1.Controls("Image5").Visible = True End If End If Application.OnTime Now + TimeValue("00:00:03"), "subShowPic" End If End Sub Function fUsfIsLoaded(ByVal sUsfName As String) As Boolean Dim oUsf As Object For Each oUsf In VBA.UserForms If oUsf.Name = sUsfName Then Exit For Next oUsf If Not oUsf Is Nothing Then fUsfIsLoaded = True Set oUsf = Nothing End Function
Et par défaut, les propriétés Visible des images doivent être positionnées à Faux.
C'est quoi la suite?
Cordialement,
PGZ
PGZ,
Je ne vois pas pourquoi tu dis ça; pas très sympa, mais Merci pour le code.
RastaBomboclat,