Microsoft 365 UserForm - Capture d'écran + sauvegarde + edition

Fab117

XLDnaute Impliqué
Hello,
J'utilise un UserForm pour collecter diverses informations et y éditer un graphique.
01.png

Une fois le UserForm complété, je souhaiterais que lorsque l'utilisateur clique sur le bouton "next", une image (équivalent à capture d'écran) du UserForm soit générée. Et que cette image soit :
  • sauvé sous "C:\Tmp Fab"
  • affiché dans le logiciel (éditeur/visionneuse) par défaut de l'ordinateur utilisé
Est-ce que quelqu'un saurait comment procéder ?
NB : Je joins un fichier de démo

Merci par avance et très bon week-end.

Fab
 

Pièces jointes

  • Demo file v2a.xlsm
    44.8 KB · Affichages: 9

Oneida

XLDnaute Impliqué
Bonjour,

Fichier modifie avec code dont vous trouverz l'auteur dans le VBA de l'UF
Sauve uf en image jpg et affichage
Pour lancer le code, click sur CommandButton en bas a gauche
 

Pièces jointes

  • Demo file v2a_swf.xlsm
    41 KB · Affichages: 6

patricktoulon

XLDnaute Barbatruc
bonjour
il s'agirais de ne pas recommencer a chaque fois
la version la plus rentable est en wmf pour le picture to image
pourquoi tu revient avec le bitmap

je l'ai refait entièrement
tu a un module pour le transfert de l'image dans le userform
et un module captureWin qui capture ton userform et sauve l'image et te l'ouvre dans la visionneuse par défaut
 

Pièces jointes

  • Demo file v3 patricktoulon.xlsm
    46.3 KB · Affichages: 15

Fab117

XLDnaute Impliqué
Hello,
Un grand merci à vous deux.
Je me suis mal exprimé.
Ce que je souhaiterais c'est que lorsqu'on clique sur le bouton "next" une image du UserForm soit automatiquement placée dans le presse papier (puis qu'une boite de dialogue s'ouvre avec possibilité d'enregistrer le contenu du presse papier).
Avec vos propositions, il m'ouvre mon logiciel de capture d'écran par défaut.

Est-ce que ma demande est réalisable ?

Bonne soirée.

Fab
 

patricktoulon

XLDnaute Barbatruc
re
bonsoir

Avec vos propositions, il m'ouvre mon logiciel de capture d'écran par défaut.
ben c'est simple c'est toi qui a attribué l'application capture par defaut a tes images et ça on y peux rien
a tu vu seulement dans un de nos code le chemin de l'application de capture windows
non !!?alors d'après toi l'erreur elle vient d’où ?

ré attribut la visionneuse par défaut a tes jpg, png, gif, etc.....
et tout ira bien

et donc maintenant tu voudrais plus la visionneuse mais le dialog "enregistrer sous "
tu nous diras un jour ou tu a mal hein !!
 

Fab117

XLDnaute Impliqué
Bin là, je me suis fait poser un prothèse de hanche hier=> je dirais à la hanche :)

Je regarde ça plus tard.
Mais l'idée c'est que le fichier soit partagé => mon idée:
LeUserForm s'affiche dans l'appli par défaut. Et en même temps, l'image est enregistrée dans un répertoire commun (je pensais à unsous répertoire dans Teams

Merci pour le support
 

patricktoulon

XLDnaute Barbatruc
re
au puré ça fait mal ça
tien le fichier n'affiche plus la capture mais te propose le dialog enregistrer sous
te reste plus qu'a choisir la destination dans ce dialog et son nom
voila voila
;)
 

Pièces jointes

  • Demo file v3 patricktoulon.xlsm
    45.3 KB · Affichages: 11

Fab117

XLDnaute Impliqué
Salut @patricktoulon :
J'ai à priori de la chance, car je n'ai que très peu de douleurs (je peux rentrer chez moi aujourd'hui; 1 jour plus vite que le standard 😊).
Merci pour ta patience.

Je rencontre 2 difficultés avec ton fichier de démo.

1. Rappatriement du graphique:
Si je prends ton fichier tel quel est que je remplis mon UserForm jusqu'à l'étape où il rapatrie le graphique, j'ai l'erreur suivante :
01.png

Du coup, si je remplace ton code par celui du précédent post dans ton module "sheetImgToControlImg" Ca fonctionne.
VB:
'******************************************************************************************************************************************************
'    ___     _     _______  __      _   ____  _   _   _______  ___     _   _  _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //     //    //  \\  //  // //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__||     //    //   // //  // //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\     //    //   // //  // //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\   //     \\__// //__// //___ \\__// //   |//
'******************************************************************************************************************************************************

'capturer une plage en wmf et créer une image en memoire (Ipicture)pour
's'en servir dans un control image dans un userform
'patricktoulon sur developpez.com
'date/22/03/2010
'remasteurisation du code date: 12/09/2023
' api creation object image
'Option Explicit
'Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long
'Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
'Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
'Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As LongPtr) As LongPtr
'Declare PtrSafe Function CopyEnhMetaFileA Lib "gdi32" (ByVal HwndImage As LongPtr, ByVal Direction As String) As LongPtr
'Declare PtrSafe Function OleCreatePictureIndirect Lib "OleAut32.dll" (pPictDesc As PICTDESC, ByRef riid As GUID, ByVal fOwn As Long, ByRef ppvObj As IPicture) As Long
'
'Type RECT: Left As Long: top As Long: Right As Long: BOTTOM As Long: End Type
'Type GUID: Data1 As Long: Data2 As Integer: Data3 As Integer: Data4(0 To 7) As Byte: End Type
'Type PICTDESC: cbSize As Long: picType As Long: himage As LongPtr: hPal As LongPtr: End Type

'Function copyxlPicture(obj, Optional Ex_transparency As Boolean = False) As IPicture
'    Dim hCopy As LongPtr, PictStructure As PICTDESC, DispatchInfo As GUID, IPic As IPicture, T#, p, Shap
'    obj.CopyPicture
'    Set p = obj.Parent
'    If Ex_transparency = True Then
'        p.Paste: Set Shap = p.Shapes(p.Shapes.Count)
'        Shap.Fill.Visible = msoTrue: Shap.Fill.ForeColor.RGB = vbWhite: Shap.CopyPicture: Shap.Delete
'    End If
'    OpenClipboard 0
'    T = Timer
'    Do While hCopy = 0
'        hCopy = CopyEnhMetaFileA(GetClipboardData(14), vbNullString): If Timer - T > 1 Then Exit Do
'    Loop
'    CloseClipboard
'    If hCopy = 0 Then Set copyxlPicture = IPic: Exit Function    ' si pas de handleimage WMF dans clip on arrete tout
'    With DispatchInfo
'        .Data1 = &H7BF80980: .Data2 = &HBF32: .Data3 = &H101A: .Data4(0) = &H8B: .Data4(1) = &HBB
'        .Data4(2) = &H0: .Data4(3) = &HAA: .Data4(4) = &H0: .Data4(5) = &H30: .Data4(6) = &HC: .Data4(7) = &HAB
'    End With
'    With PictStructure: .cbSize = Len(PictStructure): .picType = 4: .himage = hCopy: .hPal = 0: End With
'    OleCreatePictureIndirect PictStructure, DispatchInfo, True, IPic
'    Set copyxlPicture = IPic
'End Function
Option Explicit
Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long
Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As LongPtr) As LongPtr
Declare PtrSafe Function IIDFromString Lib "ole32" (ByVal lpsz As String, ByRef lpiid As GUID) As LongPtr
Declare PtrSafe Function copyimage Lib "user32" Alias "CopyImage" (ByVal handle As LongPtr, ByVal un1 As LongPtr, ByVal n1 As LongPtr, ByVal n2 As LongPtr, ByVal un2 As LongPtr) As LongPtr
Declare PtrSafe Function OleCreatePictureIndirect Lib "OleAut32.dll" (pPictDesc As PICTDESC, ByRef riid As GUID, ByVal fOwn As Long, ByRef ppvObj As IPicture) As Long

Type RECT: Left As Long: top As Long: Right As Long: BOTTOM As Long: End Type
Type GUID: Data1 As Long: Data2 As Integer: Data3 As Integer: Data4(0 To 7) As Byte: End Type
Type PICTDESC: cbSize As Long: picType As Long: himage As LongPtr: hPal As LongPtr: End Type
Function copyimagex(obj)
    Dim IPic As IPicture
    Dim hCopy As LongPtr
    Dim tIID As GUID
    Dim PictStructure As PICTDESC
    Dim x As Double
    Dim Ret As LongPtr
    Call OpenClipboard(0): EmptyClipboard: CloseClipboard
    obj.Copy 'Picture Format:=xlBitmap
    OpenClipboard 0&
    x = Timer
    Do While (hCopy = 0)
        hCopy = copyimage(GetClipboardData(&H2), 0, 0, 0, &H8)
        If Timer - x > 1 Then Exit Do
    Loop
    CloseClipboard
    If hCopy = 0 Then Set copyimagex = IPic: Exit Function
    Const IPictureIID = "{7BF80981-BF32-101A-8BBB-00AA00300CAB}"
    Ret = IIDFromString(StrConv(IPictureIID, vbUnicode), tIID)
    If Ret Then Set copyimagex = IPic: Exit Function
    With PictStructure: .cbSize = Len(PictStructure): .picType = 1: .himage = hCopy: End With
    Ret = OleCreatePictureIndirect(PictStructure, tIID, 1, IPic)
    If Ret Then Set copyimagex = IPic: Exit Function
    Set copyimagex = IPic
    Call OpenClipboard(0): EmptyClipboard: CloseClipboard
    Set copyimagex = IPic
End Function

Mais c'est vrai que la qualité de l'image est mauvaise :
03.png

et je constate à l'instant que ce n'est pas le bon graph (le point devrait être en (1,1) et il manque le titre.


2. Enregistrement de l'image du UserForm
Lorsque je clique sur le bouton "Next", il me propose bien d'enregistrer un fichier
04.png

Quand je valide en cliquant sur Enregistrer, j'ai le petit pop up qui va bien :
05.png


Et après, il m'ouvre mon logiciel de capture d'écran par défaut.
Lorsque je retourne sur l'Excel, j'ai le pop up que tu as prévu :
06.png


Et aucun fichier essai.jpg sur mon bureau
 

patricktoulon

XLDnaute Barbatruc
re
je pige pas tu me montre les deux versions
et en plus tu reprend celui qui a la qualité médiocre au niveau de l'image alors que je t'en ai donné un mieux
ensuis tu me dit qu'il t'ouvre l'image sauf que le chemin n'est pas trouvé
mais dans la derniere version il n'est pas question d'ouvrir la visionneuse mais seulement d'enregistrer le fichier

ensuite cette erreur de fichier non trouvé c'est peut être que tu n'est pas sur un compte administrateur de Windows et donc enregistrer par l' intermédiaire d'un automate (en l’occurrence ici vba excel)sur le bureau te sera interdit
bref c'est le foutoir chez toi on dirais

je suppose que pour sortir aussi vite , tu a du bien souffrir avec le kinétech non?
 

patricktoulon

XLDnaute Barbatruc
re
alors je te le redonne je l'avais pas encore jetté
le bouton copy envoi le graphique dans le userform et le bouton next cature le userform et l'enregistre dans le chemin donné par la boite de dialogue
 

Pièces jointes

  • Demo file v3 patricktoulon.xlsm
    44.8 KB · Affichages: 12

Fab117

XLDnaute Impliqué
Hello,
Non, même pas, les exercices se sont bien passées (juste la jambe valide qui fatigue pas mal).

Désolé pour la confusion.
Prenons un cas après l'autre. Je commence avec le transfert du graphique dans le champ imgGraph
Si j'ouvre ton fichier "Demo file v3 patricktoulon.xlsm".
Je remplis mon UserForm :
08.png

Lorsque je mets la dernière valeur, il va ouvrir Sub CreationDuGraphique()
Et là il plante :
09.png
 

patricktoulon

XLDnaute Barbatruc
heu....
soit tu est encore sous anesthésie
au quel cas je te suggere de d'aller te reposer
soit alors tu comprends pas ce que l'on te dis

alors je répète en majuscule ET EN ROUGE
LES CAPTURES QUE TU MONTRE DÉMONTRENT QUE TU N UTILE PS PAS LE BON FICHIER PUISQU IL Y A ENCORE LA FONCTION COPYIMAGEX
PREND LE FICHIER
DU POST 10

c'est plus clair là ou il faut que je tape ?
 

Statistiques des forums

Discussions
315 127
Messages
2 116 497
Membres
112 765
dernier inscrit
SIDIANW