IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Copie d'écran et enregistrement en jpg


Sujet :

Macros et VBA Excel

  1. #1
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut Copie d'écran et enregistrement en jpg
    Comme alternative et complément à la sauvegarde d'une image sous forme de fichier .gif donnée par Cafeine (http://www.developpez.net/forums/sho...ighlight=image) j'ai récupérer ce code dans la FAQ VB6 pour réalisé la sauvegarde d'une copie d'écran et ai tenté de l'adapter à VBA.
    Ma première question est : Est-ce possible ?
    La seconde est : A quoi correspond en VBA Pic.hDC (en rouge)
    (Pic étant ici le nom de l'image dans l'userform)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Private Declare Function BitBlt Lib "gdi32.dll" ( _
         ByVal hDestDC As Long, _
         ByVal x As Long, _
         ByVal y As Long, _
         ByVal nWidth As Long, _
         ByVal nHeight As Long, _
         ByVal hSrcDC As Long, _
         ByVal xSrc As Long, _
         ByVal ySrc As Long, _
         ByVal dwRop As Long) As Long
    
    Private Declare Function GetDesktopWindow Lib "user32.dll" () As Long
    
    Private Declare Function GetDC Lib "user32.dll" ( _
         ByVal hwnd As Long) As Long
    
    Private Const SRCCOPY As Long = &HCC0020
    '______________________________________________________________________________
    
    Private Declare Function FindWindowA Lib "user32" _
            (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
      
    Public Sub ScreenShot(Pic As Image)
    'Dim Hdl As Long
        'Hdl = FindWindowA(vbNullString, Me.Caption)
        Pic.PictureSizeMode = 3
        Pic.Width = Me.Width
        Pic.Height = Me.Height
        Pic.Visible = False
        BitBlt Pic.hDC, 0&, 0&, Me.Width, Me.Width, GetDC(GetDesktopWindow()), 0&, 0&, SRCCOPY
        SavePicture Pic.Image, "C:\ScreenShot.bmp"
    End Sub
    
    Private Sub CommandButton1_Click()
        ScreenShot Pic
    End Sub
    Par avance, merci

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour Ousk,
    1) a ta question "Est-ce que c'est possible" ?
    ma réponse est "oui, mais à condition d'afficher l'image là où on peut bénéficier d'un hdc"
    2) je ne comprends pas ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Sub ScreenShot(Pic As Image)
    associé à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     BitBlt Pic.hDC, 0&, 0&, Me.Width, Me.Width, GetDC(GetDesktopWindow()), 0&, 0&, SRCCOPY
    car un contrôle Image n'a précisément pas de hdc !
    3) si tu en as réellement besoin, je peux te fabricoter quelque chose adapté à VBA, mais avec quelques modifications :
    a) VBA ne travaille pas en Pixels mais en points (mais j'ai déjà fait ce calcul il y a quelque temps ... me reste à le retrouver dans mon fouillis)
    b) le résultat final pourra être envoyé en image d'une UserForm, mais sans l'autoredraw
    c) je pense qu'il serait possible de récupérer le tout dans un contrôle image (je ne crois pas que cela serait trop difficile), mais en passant d'abord par une UserForm...

    Conclusion : je veux bien reprendre mon travail là où je l'ai arrêté brutalement il y a deux ans pour VBA, si tu m'assures que tu en as vraiment besoin.

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Hello ucfoutu,
    Vraiment besoin ? Pour le moment je fais ça en manuel. Un vrai bricollage.
    Pour le code original, je l'ai trouvé ici, chapitre "Comment faire une capture d'écran ?"Pour la ligne que tu cites, j'ai remplacé Pic As PictureBox par image (que j'ai laissé) mais j'ai testé avec msforms.image, Forms.image... etc.
    Pour ta proposition, tu vois mais ne vas pas te prendre la tête. Si la solution avait existé, ça m'aurait arrangé.
    Comme je sais, grace à Cafeine, enregistrer une copie de cellules en gif et autres, peut-être, dans VBA est-il possible de récupérer une copie d'écran avec Clipboard (?) Tu n'as pas une idée ?
    Merci de ta réponse.

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Oui, j'ai déjà une idée...
    Le presse-papier, en effet.

    Mais VBA n'a pas d'objet Clipboard. Qu'à cela ne tienne, on va faire avec deux fonctions de l'Api de Windows. M'en occupe après dîner. Ne cherche plus de ton côté (pâs la peine de s'y mettre à deux).

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Ok, merci.
    A+

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    J'en bave dans tous les sens...
    1) Ce coquin de VBA ignore ce qu'est la propriété AutoRedraw, ce qui fait que je "perds" mon image d'écran (bien constituée, pourtant) à tous les coups
    2) j'arrive par une autre méthode à la mettre dans le presse-papier (vérifié en allant sous Paint pour voir qu'elle est bien là), mais je ne parvioens toujours pas à l'en extraire ensuite depuis VBA pour la mettre dans un contrôle image....
    Vais laisser un peu et y revenir demain avec plus de .

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Bonjour UcHS,
    Désolé pour le travail que je t'ai donné. Il me semblait bien avoir déjà fait ça... J'ai retrouvé un code dans mes archives. En fait il reprend bien un code de Cafeine auquel a été ajouté la copie d'écran.
    Je le mets à tout tasard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, _
    ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
     
    Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
    (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
    ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
     
    Sub CopieEcran_En_jpg()
    Dim FL As Worksheet, Limage As String, Shp As Shape
        keybd_event vbKeySnapshot, 1, 0&, 0&
        DoEvents    
        Set FL = Worksheets.Add
        DoEvents   
        Range("A1").Select
        ActiveSheet.Paste
        DoEvents
        Set Shp = ActiveSheet.Shapes(ActiveSheet.Shapes.Count)
        Limage = "C:\Limage.jpg"
        Application.ScreenUpdating = False    
            With ActiveSheet.ChartObjects.Add(0, 0, Shp.Width, Shp.Height).Chart
                .Paste
                .Export Limage, "JPG"
            End With        
            Application.DisplayAlerts = False
                FL.Delete
            Application.DisplayAlerts = False
        Application.ScreenUpdating = True
    End sub
    J'avais dû trouver ça sur le forum et le modifier pour mes besions, les mêmes qu'aujourd'hui.
    Merci de t'être penché sur mon problème.
    A+

    Edit
    Pendant que j'y suis, pour afficher l'image avec l'appli désignée pour faire ça par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute 0, vbNullString, "C:\Limage.jpg", vbNullString, vbNullString, SW_SHOWNORMAL

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour Ousk,

    Achtung !

    ce qui m'inquiète est ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    keybd_event vbKeySnapshot, 1, 0&, 0&
    car c'est là l'une des méthodes que j'ai tentées (voir plus haut)
    et j'étais même parvenu à "récupérer" du presse-papier en passant par des voies normales (et non par un tremplin paste), en utilisant une IPicture.
    Pourquoi ai-je alors abandonné cette idée ?
    Tout simplement pour cette raison :
    Les essais que j'ai faits ont été concluants sur mon portable (avec son clavier), mais non sur mon PC (avec un autre clavier) !!!
    J'ai donc essayé sur d'autres machines (3) chez mes voisins : ==>> au poil sur 2 d'entre elles et ratage sur la 3ème !!!
    Après analyse, le problème n'est pas vraiment la réupération dans le presse-papier, mais ce qui y est mis par simulation de la touche Imprime Ecran (sur 2 machines, la mienne et l'une de celles des voisins, ce qui est mis dans le presse-papiers n'est pas complet (alors que ça l'est sur les autres machines !!!) ===>> pas vraiement conseillé, donc ... (on dirait que le code 44 - du vbKeySnapshot - ne correspond pas à la même action sur une machine et sur l'autre !!!)

    Cette méthode présente par ailleurs un autre inconvénient : si un utilisateur a besoin de quelquechose déjà mis dans le presse-papier ===>> il le perd dès lors qu'il simule la touche Imprime écran...

    J'ai bien évidemment essayé de m'y prendre autrement qu'avec le presse-papier, ce que je réussis à faire sans problème avec VB, mais pas avec VBA (voir plus haut) en raison du fait que l'image capturée n'étant pas persistante, elle se "perd" dans la nature au moment de son transfert.

    Je vois que tu as choisi de ne pas capturer l'écran entier, mais uniquement la fenêtre active (1 et non 0).
    Je suis (en plus d'être opiniatre), sur une autre manière de procéder (en évitant la nécessité de persistance - propriété autoredraw - ainsi que celle de "figer" par la propriété image que l'on a sous VB).
    Je ne sais pas si je vais y parvenir, mùais m'acharne... et te ferai connaître le résultat de cette nouvelle démarche, plus orthodoxe que l'emploi du presse-papier.

    A +

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Tes recherches sont intéressantes et je t'encourage à les poursuivre
    Bon, elles pourront servir à d'autres qui n'ont pas mon clavier et on pourra les mettre dans contribuer ou dans la FAQ
    Pour ce qui me concerne, mon code suffit à mon bonheur. Il me reste simplement à l'automatiser afin de pouvoir réaliser la copie d'une foultitude de d'écrans.
    Même sous la torture, je n'avouerais pas ce que je fais
    Bonne chance
    Je suis ça de très prés
    A+

    NB - Je déplace la discussion sous VBA-E

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Delphi]Copie d'écran dans un fichier jpg
    Par khayyam90 dans le forum Contribuez
    Réponses: 0
    Dernier message: 04/01/2011, 14h23
  2. copie d'écran jpg
    Par youp_db dans le forum Windows
    Réponses: 2
    Dernier message: 20/02/2008, 15h17
  3. Faire une copie d'écran d'un Panel
    Par Wilco dans le forum Langage
    Réponses: 2
    Dernier message: 19/10/2005, 17h28
  4. Reformatter un doc word pour en faire des copies d'écran
    Par titouille dans le forum VBA Word
    Réponses: 4
    Dernier message: 22/09/2005, 18h21
  5. Copie d'écran dans un fichier
    Par angsthase dans le forum Autres Logiciels
    Réponses: 12
    Dernier message: 17/08/2005, 00h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo