Snapshot d'un userform non ouvert - VBA

MattMons

XLDnaute Nouveau
Bonjour bonjour !

Voilà mon objectif :
- Ouvrir un Userform normalement
- Lorsque je clique sur mon Commandbutton1, je souhaite qu'excel ouvre un second userform plus propre par dessus (ce qu'il fait très bien), le snapshot, puis le ferme.
Or, jusqu'ici, ma fonction qui snapshot l'userform récupère l'image du premier userform et non celle de l'userform qui s'ouvre par dessus :(
Chose curieuse : la prise d'écran se fait même quand le premier userform est en vbModeless, mais si les deux sont vbModeless aucune prise d'écran n'est faite et la macro plante...

Je soupçonne le code de ne pas "sélectionner" le second usf comme fenêtre active lors de la prise d'écran, mais aucune idée de comment régler ça.

Autre contrainte : le Unload du second userform ne fonctionne que si celui ci est en vbModeless, sinon je suis obligé de le fermer à la main pour que la procédure continue...

Voilà mon code :

Sur le premier Userform :

VB:
Private Sub CommandButton1_Click()
    ApercuDoss.Show
    Call Export_dossier_trspt
    Unload ApercuDoss
    MsgBox "Dossier envoyé avec succès", vbInformation, "Succès"
End Sub

Sur le module1 :

Code:
Sub Export_dossier_trspt()

Dim Ws As Worksheet
   
    Application.ScreenUpdating = False
    PrintScreen
    DoEvents
   
    On Error Resume Next
       Application.DisplayAlerts = False
       Sheets("impression").Delete
       Application.DisplayAlerts = True
    On Error GoTo 0
   
    'Ajoute une feuille pour coller l'image du formulaire
    Set Ws = Sheets.Add
   
    'renomme la feuille
    ActiveSheet.Name = "impression"
        Sheets("impression").Paste
        Sheets("impression").PageSetup.Orientation = xlLandscape
        Selection.ShapeRange.LockAspectRatio = msoTrue
        'Selection.ShapeRange.Height = Range("A1:N44").Height
        Selection.ShapeRange.Width = Range("A1:N44").Width
       
        'impression centrée dans la page
        With Sheets("impression").PageSetup
            .CenterHorizontally = True
            .CenterVertically = True
            .PrintArea = "A1:N44"
            .LeftMargin = Application.InchesToPoints(0)
            .RightMargin = Application.InchesToPoints(0)
            .TopMargin = Application.InchesToPoints(0)
            .BottomMargin = Application.InchesToPoints(0)
            .Zoom = False
        End With

    ActiveSheet.ExportAsFixedFormat _
            Type:=xlTypePDF, _
            Filename:=ThisWorkbook.Path & "\" & "Formulaire" & ".pdf", _
            Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, _
            IgnorePrintAreas:=False, _
            OpenAfterPublish:=False
       

        'enléve les messages d'alerte
        Application.DisplayAlerts = False
        ActiveSheet.Delete
        'remet les messages d'alerte
        Application.DisplayAlerts = True
        'réactive le rafraichissement de l'écran
        Application.ScreenUpdating = True
       

...ETC...

End Sub


Sub PrintScreen()
     keybd_event VK_MENU, 0, 0, 0
     keybd_event VK_SNAPSHOT, 0, 0, 0
     keybd_event VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0
     keybd_event VK_MENU, 0, KEYEVENTF_KEYUP, 0
End Sub


Merci beaucoup pour votre aide !!
 

patricktoulon

XLDnaute Barbatruc
re
bonjour a tous
effectivement il y a un soucis de priorité et de fenêtre active
tu fait un show userform2 puis exécute le reste du code donc ton usf reprend la main en terme d'index dans la liste des fenêtre affiché
tu a 2 solutions
soit tu met le code snapshot dans userform2 et ayant une variable public a l’intérieur la modifier dans userform1 le code snapshot serait alors excuté par la fenêtre concernée

soit tu vire a 190° et tu utilise l'api blitblt qui elle dessine ce qui il a a l’écran
petit bemole!!!!! si la fenêtre sort un peu de l’écran la partie masquée ne sera pas prise en compte dans la capture
conclusion
au plus simple code capture dans userform2 piloté par SA variable public dans userform2
 

MattMons

XLDnaute Nouveau
Bonjour !

mapomme je comprends tout à fait, je prendrai soin de mettre les sujets en résolu ! :)

patricktoulon
Merci beaucoup pour tes indications ! J'ai essayé de réaliser ce que tu m'as conseillé de faire, mais maintenant le screen se fait bien mais ce n'est toujours pas la bonne fenêtre qui est prise, je joins un fichier exemple à ce message !

Merci !!!
 

Pièces jointes

  • MATTMONS.xlsm
    54.3 KB · Affichages: 8

Laurent78

XLDnaute Occasionnel
Bonsoir,
Une piste peut-être ...
J'ai juste ajouté un MsgBox dans UserForm_Activate de AppercuDoss, le screenshot est bon pour le coup. Dans ton cas, je pense qu'en fait le screenshot se fait avant ou après l'affichage du userForm.
Je n'ai pas le temps de chercher plus ce soir.
Bonne soirée
Laurent
 

Pièces jointes

  • MATTMONS.xlsm
    53.8 KB · Affichages: 8

patricktoulon

XLDnaute Barbatruc
bonjour
Bonjour
cf fichier joint, avec une attente de 1 seconde, cela semble résoudre le problème.

oui sur un pc ca va fonctionner et sur un autre il en faudra 2 ou plus
d'autant plus que j'ai vu nule part dans la discussion le vidage du clipboard
alors le coup classique et tres bien connu c'est par exemple

je snap avec la touche snapshot, j'attends une seconde , je colle sur sheet et sauve pas de soucis

je refais la même opération mais la mon pc fait tourner une autre app il est donc plus chargé j'attend une seconde je colle et je sauve surprise!!!!! j'ai la capture 1 dans la seconde tentative


bref
y a des api pour ca

les 3 api clipbord de base(open,empty,close) et l'api isclipboardformatavailable qui permet de faire une gestion d'attente de chargement complet de la capture dans le clipboard

j'ai tout dis allez hop !! au boulot ;)
 

patricktoulon

XLDnaute Barbatruc
re
et je vais vous donner une astuce pour se passer des api bien que l'aime pas trop
l'userform doit avoir une taille bien précise
touche snap , colle sur sheets ,examen de la taille de l'image collées(pictures(pictures.count)
si pas la bonne taille supprime et recomence
le tout dans un do loop while pictures(pictures.coun).width <> userformX.width
la encore j'ai tout dis ;)
 

Discussions similaires

Réponses
2
Affichages
110

Statistiques des forums

Discussions
312 071
Messages
2 085 051
Membres
102 767
dernier inscrit
jmkp