XL 2013 Affichage d'un userform avec GIF animé pendant l’exécution d'une macro

Flown720

XLDnaute Nouveau
Bonjour,

Je m'adresse à vous pour vous demander si c'est possible de réaliser une fenêtre avec un gif animé qui sera stocké sur un pc (je n'ai pas besoin de l'integrer au fichier excel)
pour le moment, ça j'ai réussi en faisant une userform avec outil webbrowser , elle s'affiche comme je le souhaite sans que la macro tourne.
Ma macro fonctionne correctement aussi.

Je lance ma macro par un bouton activeX, voici le code que j'utilise

VB:
Private Sub CommandButton1_Click()

ActiveCell.Select
    
UserForm1.Show vbModeless
UserForm1.Repaint
DoEvents

Application.ScreenUpdating = False

'................
'la macro qui tourne comme il faut
'et je termine par ça
'................

Unload UserForm1

End Sub

Après le code de mon userform1 est le suivant
Code:
Private Sub UserForm_Initialize()
Dim S As String
Dim Hauteur As Long, Largeur As Long
Dim LePath As String

LePath = "C:\GIF\"
Largeur = WebBrowser1.Width * 140 / 110
Hauteur = WebBrowser1.Height * 441 / 410

S = LePath & "loading-spin-defaut.gif"

WebBrowser1.Navigate _
"ABOUT:<HTML><CENTER><HEAD><body scroll='no' LEFTMARGIN=0 TOPMARGIN=0><IMG WIDTH=" & _
Largeur & " HEIGHT=" & Hauteur & _
" SRC='" & S & "'</IMG></BODY></CENTER></HTML>"

End Sub

Donc mon problème, c'est que pratiquement tout fonctionne, alors que j'ai récuperer pas mal de code sur le forum pour l'adapter.
Le seul soucis, c'est que le gif ne s'anime pas, mais il s'affiche dans l'userform, et s'arrête bien au bon moment.

Alors c'est mon premier post sur ce type, j'espère avoir été le plus clair possible de mes attentes, et j'espère avoir des solutions à problèmes
Merci encore :)
 
Solution
re
virage 190° ;)
et oui parce que des idées j'en ai plein
avec IE(internet explorer on peut faire la même chose
en utilisant une variable("OBJRETURN") en CALLBACK je ferme la fenêtre quand je veux et dans la sub lanceuse

voila
l'ouverture et fermeture est maitriser dans la sub
VB:
Sub testavecIE()
    Dim Gif$, t&, OBJRETURN As Object
    Gif = "C:\Users\polux\DeskTop\cuicui.gif"    'mettre l'adresse du gif ici
    'on lance le message
    msgboxhtml "il est pas dans excel mon message ", "MESSAGE HORS EXCEL BY patricktoulon", Gif, OBJRETURN

    'POUR TESTER exemple on attend un peu
    t = Timer
    Do:: DoEvents: Loop While Timer - t < 5 '5secondes

    'apres ces 5 secondes on ferme le message
    OBJRETURN.Quit
End Sub...

patricktoulon

XLDnaute Barbatruc
re
virage 190° ;)
et oui parce que des idées j'en ai plein
avec IE(internet explorer on peut faire la même chose
en utilisant une variable("OBJRETURN") en CALLBACK je ferme la fenêtre quand je veux et dans la sub lanceuse

voila
l'ouverture et fermeture est maitriser dans la sub
VB:
Sub testavecIE()
    Dim Gif$, t&, OBJRETURN As Object
    Gif = "C:\Users\polux\DeskTop\cuicui.gif"    'mettre l'adresse du gif ici
    'on lance le message
    msgboxhtml "il est pas dans excel mon message ", "MESSAGE HORS EXCEL BY patricktoulon", Gif, OBJRETURN

    'POUR TESTER exemple on attend un peu
    t = Timer
    Do:: DoEvents: Loop While Timer - t < 5 '5secondes

    'apres ces 5 secondes on ferme le message
    OBJRETURN.Quit
End Sub


Function msgboxhtml(Message, titre, Gif, obj As Object) As Object

    Dim oIE As Object

    Set obj = CreateObject("InternetExplorer.Application")
    With obj
        .Top = 100
        .Left = 100
        .AddressBar = False
        .MenuBar = False
        .StatusBar = False
        .Toolbar = False
        .Visible = True
        .Width = 280
        .Height = 330
        .navigate2 "about:blank"

        Do While .readyState <> 4: DoEvents: Loop    'attend la fin du chargement
        code = "<html>|<head>| <title>|" & titre & "|</title>| </head>|<body style=""margin:0;"">|<p align=""center""> " & Message & _
               "</p>|<img style=""width:100%;height:150;"" src=""" & Gif & """></img>|</body>|</html>"

        code = Replace(code, "|", vbCrLf)
        .document.write code

    End With

End Function

pourquoi je n'y ai pas pensé plus tôt :rolleyes:;)

ET C'EST NON BLOQUANT :cool:
 

Flown720

XLDnaute Nouveau
je viens de tester ce nouveau codage, et je suis malheureusement obligé de t'annoncé que ça fonctionne pas chez moi
alors je me demande toujours si j'ai pas foiré qqchose....
En tout cas, j'ai bien le message qui s'affiche, mais je sais que ma macro de test s’exécute en 13sec. sauf qu'avec ce message elle met 23sec
la différence est bien les 10sec d'affichage du message (je l'ai augmenté pour accentué le défaut)
 

eriiic

XLDnaute Barbatruc
Bonjour,

Pour faire accélérer ta macro il faut travailler en mémoire.
Le principe est de lire les données en une fois dans une variable tableau, travailler avec ce tableau et coller le résultat en une fois.
Le gain peut être de x100...
eric
 

Flown720

XLDnaute Nouveau
Bonjour,

Pour faire accélérer ta macro il faut travailler en mémoire.
Le principe est de lire les données en une fois dans une variable tableau, travailler avec ce tableau et coller le résultat en une fois.
Le gain peut être de x100...
eric
Alors j’ai aucun doute que ce que j’ai fait peut-être largement amélioré. Par contre, ce que tu m’as décrit je sais pas comment le faire. Car j’ai déjà une mise en forme tableau dans Excel, et quand j’écris dans la colonne j’écris bien tous d’un coup dans cette colonne avec ce code là
VB:
Range("Données[Statut]").FormulaR1C1 = _
    "=IF([@[Type d''erreur]]<>"""",""1 - ERREUR"",IF([@[Montant total]]=0,""4 - NE PAS ENVOYER"",""2 - PRÊT A ENVOYER""))"
Range("Données[Statut]") = Range("Données[Statut]").Value
Est-ce que tu pourrai plus m’en dire, s’il te plaît ?
 

eriiic

XLDnaute Barbatruc
Effectivement, tu écris en une fois. Pas sûr d'avoir un gain important (voire même une perte), il faut tester pour avoir la réponse.
As-tu désactivé les maj en début de macro ? Avec :
VB:
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
à rétablir avec :
Code:
Application.Calculation = xlCalculationAutomatic
Ca peut faire un gain conséquent.

Sinon je te met un exemple de travail en mémoire que tu aies le principe.
Je n'utilise pas le fait que tu aies déclaré tes données en tableau ce qui ne simplifierait pas le code, et sa compréhension.
Une plage en tableau c'est autre chose que de travailler avec des tableaux en VBA, c'est indépendant.
eric
 

Pièces jointes

  • Classeur1.xlsm
    18.1 KB · Affichages: 15

patricktoulon

XLDnaute Barbatruc
Bonjour le fil
oui tu a du rater quelque chose (au pire 1 seconde de plus pour ouvrir IE et c'est tout)

il est certain que des que ie est ouvert ou meme le hta dans l'autre version il n'a plus rien a voir avec l'exécution du code de la macro

serait ce les allocations mémoire qui ne se libère pas ??

VB:
Sub testavecIE()
    Dim Gif$, t&, OBJRETURN As Object
    Gif = "C:\Users\polux\DeskTop\cuicui.gif"    'mettre l'adresse du gif ici
    'on lance le message
    msgboxhtml "il est pas dans excel mon message ", "MESSAGE HORS EXCEL BY patricktoulon", Gif, OBJRETURN
    
    'POUR TESTER va remplir des cellule pendant l'affichage du msgbox html
    t = Timer
    Do:: DoEvents
    i = i + 1
    Cells(i, 1) = "Flown" & 720 + i
    Loop While Timer - t < 5 '5secondes

    'maintenant on ferme le message
    OBJRETURN.Quit
End Sub


Function msgboxhtml(Message, titre, Gif, obj As Object) As Object

    Dim objie As Object

    Set objie = CreateObject("InternetExplorer.Application")
    With objie
        .Top = 100
        .Left = 100
        .AddressBar = False
        .MenuBar = False
        .StatusBar = False
        .Toolbar = False
        .Visible = True
        .Width = 280
        .Height = 330
        .navigate2 "about:blank"

        Do While .readyState <> 4: DoEvents: Loop    'attend la fin du chargement
        code = "<html>|<head>| <title>|" & titre & "|</title>| </head>|<body style=""margin:0;"">|<p align=""center""> " & Message & _
               "</p>|<img style=""width:100%;height:150;"" src=""" & Gif & """></img>|</body>|</html>"

        code = Replace(code, "|", vbCrLf)
        .document.write code

    End With
Set obj = objie
Set objie = Nothing
End Function
si ta colonne "A" se rempli pendant l'affichage c'est que ca marche ;)
 
Dernière édition:

Flown720

XLDnaute Nouveau
Effectivement, tu écris en une fois. Pas sûr d'avoir un gain important (voire même une perte), il faut tester pour avoir la réponse.
As-tu désactivé les maj en début de macro ? Avec :
VB:
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
à rétablir avec :
Code:
Application.Calculation = xlCalculationAutomatic
Ca peut faire un gain conséquent.

Sinon je te met un exemple de travail en mémoire que tu aies le principe.
Je n'utilise pas le fait que tu aies déclaré tes données en tableau ce qui ne simplifierait pas le code, et sa compréhension.
Une plage en tableau c'est autre chose que de travailler avec des tableaux en VBA, c'est indépendant.
eric

Alors, j'ai pas compris va falloir, que je le regarde de plus près, mais il est certain que ça va vite, à méditer de mon côté!!!!
Et là, je lance un test sur la macro avec le le code
VB:
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
à rétablir avec :
Code:
Application.Calculation = xlCalculationAutomatic

En tout cas merci de votre aide
 

Flown720

XLDnaute Nouveau
Bonjour le fil
oui tu a du rater quelque chose (au pire 1 seconde de plus pour ouvrir IE et c'est tout)

il est certain que des que ie est ouvert ou meme le hta dans l'autre version il n'a plus rien a voir avec l'exécution du code de la macro

serait ce les allocations mémoire qui ne se libère pas ??

VB:
Sub testavecIE()
    Dim Gif$, t&, OBJRETURN As Object
    Gif = "C:\Users\polux\DeskTop\cuicui.gif"    'mettre l'adresse du gif ici
    'on lance le message
    msgboxhtml "il est pas dans excel mon message ", "MESSAGE HORS EXCEL BY patricktoulon", Gif, OBJRETURN
   
    'POUR TESTER va remplir des cellule pendant l'affichage du msgbox html
    t = Timer
    Do:: DoEvents
    i = i + 1
    Cells(i, 1) = "Flown" & 720 + i
    Loop While Timer - t < 5 '5secondes

    'maintenant on ferme le message
    OBJRETURN.Quit
End Sub


Function msgboxhtml(Message, titre, Gif, obj As Object) As Object

    Dim objie As Object

    Set objie = CreateObject("InternetExplorer.Application")
    With objie
        .Top = 100
        .Left = 100
        .AddressBar = False
        .MenuBar = False
        .StatusBar = False
        .Toolbar = False
        .Visible = True
        .Width = 280
        .Height = 330
        .navigate2 "about:blank"

        Do While .readyState <> 4: DoEvents: Loop    'attend la fin du chargement
        code = "<html>|<head>| <title>|" & titre & "|</title>| </head>|<body style=""margin:0;"">|<p align=""center""> " & Message & _
               "</p>|<img style=""width:100%;height:150;"" src=""" & Gif & """></img>|</body>|</html>"

        code = Replace(code, "|", vbCrLf)
        .document.write code

    End With
Set obj = objie
Set objie = Nothing
End Function
si ta colonne "A" se rempli pendant l'affichage c'est que ca marche ;)


Avec ce code là, ça rempli la colonne A pendant l'affichage, la seule chose que je vois c'est qu'elle ne termine pas à toujours à la même ligne
Capture.JPG
 

patricktoulon

XLDnaute Barbatruc
bonsoir
ben elle termine pas toujours a la même ligne tout simplement par ce que ton pc n'a pas constamment la même occupation de mémoire et procc donc des fois il va plus vite des fois moins vite donc en 5 secondes il peut avoir un résultat plus ou moins différent a chaque essai c'est normal
donc celui la fonctionne aussi puisque tu a les cellules d'inscrites

tu a le choix de la méthode maintenant
;)
 

Flown720

XLDnaute Nouveau
Bonjour,

Je suis de retour après mon opération, pas évidement pour moi, mais j'ai tester un peu mieux. donc le dernier code fonctionne à merveille !!!! c'est juste moi qui encore une fois avait pas bien compris comment l'employer !!

Merci encore
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 330
Membres
103 187
dernier inscrit
ebenhamel