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 :

capture d'écran usf 64 bit


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 90
    Par défaut capture d'écran usf 64 bit
    Bonjour,

    Je cherche à automatiser des captures d'écran d'un userform sous excel 2021 64 bits en cliquant sur un commandbutton (j'ai vu des solutions sur le forum mais en 32 bits, apparemment il faudrait passer par des api pour les 64 bits...?).
    Une fois la capture faite l'idée est de l'enregistrer en tant qu'image avec un nom dépendant du contenu du usf, dans un google drive...

    Des pistes ?
    Merci !

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 524
    Par défaut
    Salut,

    Théoriquement, il suffit d'adapter la déclaration de l'API, et bien souvent, on les trouve qui traînent sur le net.

    As-tu cette dernière ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 90
    Par défaut
    Non sincèrement je suis utilisateur vba occasionnel et parler des api c'est me parler en mandarin

  4. #4
    Membre chevronné
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 204
    Par défaut re:une solution parmis tant d'autres
    Bonjour
    travaillant sur 2007 2013 2016 et 365 il est penible de faire sans cesse des adaptations
    alors je me suis developpé un outils (un complement xla) dans le quel j'ai mis une fonction captureform avec les api mais utilisées par les macro4
    ce qui implique que pas de déclaration d'api ni en 32 ni 64

    voici un extrait allégée de ma fonction
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    '*****************************************************************************************************
    '    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
    '   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
    '  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
    ' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
    '//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
    '****************************************************************************************************
    'fonction de cature pour userform
    'Utilisation des api avec les macro 4
    'pas de déclarations  à  faire
    'capture avec la simulation de la touche snapshot avec argument fenêtre acive
    'enregistrement avec un paste  et export d'un chart 
    Sub captureForm(uf)
        If Not uf.Visible Then MsgBox "Le userform n'est pas affiché": Exit Sub
        Hwnd = ExecuteExcel4Macro("CALL(""user32"",""FindWindowA"",""JCC""," & """" & vbNullString & """" & ", " & """" & uf.Caption & """)")
     
        ExecuteExcel4Macro ("CALL(""user32"",""ShowWindow"",""JJJ"",""" & Hwnd & """,""" & 9 & """)") ' application du mode
     
        'vidage du clipBoard
        'avec les versions suppérieures a 2007 le clibboard est un peu lent (latence) en lecture et en ecriture
        'alors pour éviter de sauver une eventuelle capture précédente  on le vide
        ExecuteExcel4Macro ("CALL(""user32"",""OpenClipboard"",""JJ""," & 0& & ")")
        ExecuteExcel4Macro ("CALL(""user32"",""EmptyClipboard"",""J"")")
        ExecuteExcel4Macro ("CALL(""user32"",""CloseClipboard"",""J"")")
        'attente de vidage de/des image(s) dans le cipboard boucle
        'tant qu'un handle d'image bitmap ou metafile se trouve dans le clipBoard
        Do
            DoEvents
            X = ExecuteExcel4Macro("CALL(""user32"",""IsClipboardFormatAvailable"",""JJC""," & 2 & ")")
            X = X + ExecuteExcel4Macro("CALL(""user32"",""IsClipboardFormatAvailable"",""JJC""," & 14 & ")")
        Loop While X = 1
     
        'simulation de la touche printscreen(snapshot)
        ExecuteExcel4Macro ("CALL(""user32"",""keybd_event"",""JJJJJ""," & 44 & ", " & 1 & ", " & 0 & ", " & 0 & ")") 'api SetWindowLongA
        ExecuteExcel4Macro ("CALL(""user32"",""keybd_event"",""JJJJJ""," & 44 & ", " & 1 & ", " & &H2 & ", " & 0 & ")") 'api SetWindowLongA
     
        'attente d'acces complet au bitmap dans le clipboard
        Do: DoEvents: X = ExecuteExcel4Macro("CALL(""user32"",""IsClipboardFormatAvailable"",""JJC""," & 2 & ")"): Loop While X = 0
        'Enregistrement
        'dialog saveas
        Fichier = Application.GetSaveAsFilename(InitialFileName:=uf.Name, filefilter:="image Files (*.jpg), *.jpg", Title:="ENREGISTREMENT DE LA CAPTURE")
        If Fichier = False Then Exit Sub
        ActiveSheet.Paste
        With ActiveSheet
            Set shp = .Shapes(.Shapes.Count)
            With .ChartObjects.Add(shp.Left + 200, shp.Top, shp.Width, shp.Height)
                .Chart.Paste: .Chart.Export Filename:=Fichier, FilterName:="jpg"
                .Delete
                shp.Delete
            End With
        End With
    End Sub
    dans le userform tu met un bouton et dans l'event click tu met
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton1_Click()
    captureForm Me
    End Sub
    et voila tu clique et ca te propose le dialog enregistrer sous pour enregistrer ta capture ou tu veux
    bonne continuation

  5. #5
    Membre chevronné
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 204
    Par défaut re:autre solution parmi tant d'autre
    re
    une autre méthode vielle comme le monde
    ici on va simplement manipuler la touche snapshot avec le send keys
    et ensuite pareil on paste sur un chart et l'export
    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
    '*****************************************************************************************************
    '    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
    '   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
    '  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
    ' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
    '//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
    '****************************************************************************************************
    'capture du userform
    'pas d'utilisation d'api
    'Attention  déactive parfois le pavé numérique
    Sub CaptureForm2(uf)
        Dim fichier
        If Not uf.Visible Then MsgBox "Le userform n'est pas affiché": Exit Sub
        fichier = Application.GetSaveAsFilename(InitialFileName:=uf.Name, filefilter:="image Files (*.jpg), *.jpg", Title:="ENREGISTREMENT DE LA CAPTURE")
        If fichier = False Then Exit Sub
     
        Application.SendKeys "(%{1068})" 'touche impression ecran
        DoEvents
        'en simulant la touche ESC on lache la touche snapshot
        'ce qui permet parfois de libérer le pavé numérique(non garanti)
        Application.SendKeys "{ESC}" 'on remet le pavé numerique
     
        With ActiveSheet.ChartObjects.Add(0, 0, uf.Width, uf.Height).Chart
            .Paste 'colle l'image dans graphique
            .Export fichier
            .Parent.Delete
        End With
    End Sub

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 90
    Par défaut
    Bonjour,

    Merci pour les 2 propositions sur lesquelles je fais le retour suivant : la 1ère propose une capture ciblée, (mais impose donc une manipulation manuelle supplémentaire ce qui est à éviter dans mon cas), fait fait ramer l'ordi 40 secondes environ par la suite...

    La seconde est plus rapide, copie bien une capture d'écran dans le presse papier, mais ne l'enregistre pas sur l'image (j'ai un grand carré jaune sur le fichier sauvegardé, pas la capture) je ne sais pas pourquoi... D'ailleurs pourquoi faut-il passer par un chartobjects.add? Ne peut on pas commander en vba à windows de sauvegarder le dernier élément du presse papier sous forme de fichier jpeg ?

    Je cherche un moyen d'enregistrer bêtement la capture à un endroit, en tant que jpeg ou pdf, sans manipulation extérieure (définir initialement l'emplacement et le nom du fichier).

    Merci encore !

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

Discussions similaires

  1. Capturer image depuis webcam sur os 64 bits
    Par hackerslife dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 14/10/2013, 19h01
  2. Main icon (16 bits)
    Par DR dans le forum C++Builder
    Réponses: 2
    Dernier message: 02/09/2002, 08h23
  3. Cherche l'algo crc 16 bits
    Par icepower dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 21/08/2002, 13h27
  4. Debugger 16-32 bits
    Par Mat dans le forum Assembleur
    Réponses: 4
    Dernier message: 28/06/2002, 11h34
  5. Lire 1 bit d'un fichier en C
    Par Anonymous dans le forum C
    Réponses: 3
    Dernier message: 23/05/2002, 18h31

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