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 :

Sauvegarder image userform [XL-2013]


Sujet :

Macros et VBA Excel

  1. #81
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re

    Ton dernier code sur la copie toute simple du HTML est impeccable !
    simple et efficace, des fois à pertir d'une idée on se perd dans la complexité !!
    je ne te l'ai pas proposé tout de suite car certains shuntent carrément internet explorer de leur system il préfèrent d'autre explorateurs comme chrome, Firefox ,etc...

    donc si IE est shunté elle ne fonctionnera pas attention a cela !!!!

    après comme dit jacques on pourrait faire un simple tableaux 2 colonnes (nom control/valeur du control) et utiliser une méthode html ou l'autre que je t'ai proposé et en faire le tableau html pour l'envoie

    comme je te l'ai dis il y a un moment le tout c'est de décider par quelle méthode (UNIQUE!!!!!!) tu veux travailler

    @jacques
    tu radote on a compris
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  2. #82
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    @jacques
    tu radote on a compris
    Rien , R I E N ne sera jamais plus étonnant que d'avoir "compris" et ne pas "appliquer".
    Il est pourtant tellement simple, d' "appliquer", d'éviter de telles maladresses ...
    Y compris, pour les plus "bourrins", les plus "rustres", de se servir tout bêtement de la propriété tag de chaque "petite chose" à imprimer ...
    Allez -->> j'aime (elle sont toujours belles) mes siestitas ... Je vais m'en offrir une de ce pas ...
    Amusez-vous bien ... Dispersez-vous bien ... Egarez-vous bien ... Dépensez inutilement bien ...
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  3. #83
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Rien , R I E N ne sera jamais plus étonnant que d'avoir "compris" et ne pas "appliquer".
    il n'y a rien a comprendre c'est son choix c'est tout même si ca n'est pas orthodoxe ou ne correspond pas a ta conception ou c'elle d'un autre

    et au final bien heureusement car sinon forum n'aurait pas lieu d'être: seule une source https://www.unparia.com serait utile

    bon sieste
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #84
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    seule une source https://www.unparia.com serait utile
    Non ! En aucun cas !
    Peut-être une réponse, mais alors --->> à une discussion/demande à ouvrir dans une autre section (la section Conception) de ce forum.
    Un mécanisme tout bête y serait alors exposé, non pour obtenir une "image" d'un userform, mais un document, mille fois moins gourmand, non pixelisé, etc ... composé des seuls éléments utiles .
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  5. #85
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    non pixelisé!!!?
    a tu essayé ma proposition avec api bitblt c'est du hd !!! ce que tu vois a l'cran est la même chose que tu vois dans l'image

    moins gourmand ??? on s'en fout ...l'image est créée ,envoyée et détruite ma fois

    peut être reviendra t il a une méthode html globale oui mais laisse avancer les autres a la vitesse de leur compréhension

    ca sert a quoi de forcer si il n'y a pas assimilation "a rien du tout " voir même le contraire

    il en est une de savoir les choses --->>> de les transmettre en est une autre

    parfois de laisser les débutants faire quelques petites expériences qui pour toi et moi sembleront inutiles, peuvent éclairer un novice

    tranquille "pas de galère dans le teston"
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #86
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    ca sert a quoi de forcer si il n'y a pas assimilation "a rien du tout " voir même le contraire

    il en est une de savoir les choses --->>> de les transmettre en est une autre

    parfois de laisser les débutants faire quelques petites expériences qui pour toi et moi sembleront inutiles, peuvent éclairer un novice

    tranquille "pas de galère dans le teston"
    Je n'abonderai jamais DANS UN TEL SENS . J A M A I S ...
    Et surtout pas sur un forum informatique.
    Et encore moins si cela aboutit à la mise en oeuvre de ce que tu as proposé et qui s'écarte mille fois plus encore de la compréhension d'un débutant.
    Mais c'est là ton point de vue...
    Crois-tu vraiment "avoir transmis" quelque chose ? VRAIMENT ?

    Bref ... le demandeur aura probablement le "loisir" de prendre la mesure exacte des réactions dans son entreprise. Je n'en doute personnellement pas.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  7. #87
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    non je laisse le demandeur faire ces expériences

    je le laisse observer ce que fait le code

    c'est lui qui décidera la méthode qui lui convient le plus informatique ou pas

    chaque personnalité est différentes et se vois même dans les codes et heureusement d'ailleurs j'ai pas envie d'avoir un brassard rouge

    pourquoi vouloir normaliser une question qui reste a la seule propriété du demandeur

    il veux comme ca il fera comme ca ou bien il fera autrement
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #88
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    il veux comme ca il fera comme ca ou bien il fera autrement
    Celui qui ne sait pas ce qu'il est possible de faire de manière plus orthodoxe pense que ce qu'il entrevoit, lui, est la seule solution.
    Celui qui lui permet d'aller dans ce sens-là contribue à ne pas "ouvrir les yeux" et à pérenniser les décisions maladroites.
    Mais tu as raison --->> C'est la maladresse, qui a été choisie ? --->> encourageons-là et n'en parlons plus ! (enfin ... ici ... pas dans son entreprise, hein ...).
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  9. #89
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    oserais je te rappeler un exemple des plus récent une certaine firme diffusant un system d'exploitation complètement catastrophique et qui a pourtant débouché par la suite sur un system d'exploitation relativement puissant et stable et qui pourtant a été conçu avec le même noyau

    je ne parle même pas de la version 2010 de office qui (pourtant pas bien née) a donné par la suite les versions qui lui ont succédés
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #90
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Mais tu as raison --->> C'est la maladresse, qui a été choisie ? --->> encourageons-là et n'en parlons plus ! (enfin ... ici ... pas dans son entreprise, hein ...).
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  11. #91
    Membre averti
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Points : 314
    Points
    314
    Par défaut Feed back de la solution après un mois de fonctionnement
    Bonjour Patrick, comme promis une petit retour sur le démarrage de l'appli.

    Merci Patrick pour ton aide précieuse et positive dans cette histoire.

    Tu as pris le temps de proposer et de développer une solution fonctionnelle.
    Après un mois de fonctionnement, environ 500 mails ont été générés par ce biais.
    Le coeur de mon application était de partir d'une feuille excel afin d'enregistrer les données de chaque mail envoyé dans des bases de données primaires.
    Les utilisateurs récupèrent chacun dans leurs environnements ces données primaires pour travailler avec dans leurs base de travail selon leur guise sans avoir à tout retaper à la main ce qui vient des mails (c'était le cas avant).

    Pour l'envoi j'utilise à la fois les images pour les informations de type communication (pas de suivi ni de modification)
    J'utilise l'envoi d'une plage pour les quelques cas ayant trop de données pour un USF et qui sont amendées par plusieurs utilisateurs.

    J'ai toujours le soucis de l'image qui n'est pas visible à l'extérieur de l'organisation, mais qui le devient quand on fait suivre le mail
    Pour l'instant j'envoie l'image en fichier joint en plus quand la demande va à l'extérieur.

    Voilà il y a encore de l'amélioration à faire, mais cela fonctionne et c'était le but.
    Ce n'est bien sûr pas l'application rêvée, (ça on était d'accord dès le début) mais ça fonctionne et permettra peut-être de servir de spécification à une vraie application par la site.

    Encore une fois merci
    Denis

  12. #92
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    tant mieux j'en suis ravi pour toi t'aura bien bossé
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  13. #93
    Membre averti
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Points : 314
    Points
    314
    Par défaut
    Coucou me revoilou !

    J'espère que tu vas bien Patrick.

    Donc après 8 mois d'utilisation, la solution fonctionne toujours, elle s'est même étoffée.

    A ce stade, j'ai deux questions.

    Patrick dans le code qui capture l'image de l'USF et sauvegarde le clipboard en tant qu'image, peut-on ajouter une commande de compression ?
    en effet je me récupère une image 1M minimum pour les usf les plus simples.
    Rappel du code actuellement utilisé
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    Private Declare Function OpenClipboard Lib "User32" (ByVal hwnd As Long) As Long
    Private Declare Function EmptyClipboard Lib "User32" () As Long
    Private Declare Function CloseClipboard Lib "User32" () As Long
    Private Declare Function SetClipboardData Lib "User32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
    Private Declare Function GetClipboardData& Lib "User32" (ByVal wFormat%)
    Private Declare Function GetDC Lib "User32" (ByVal hwnd As Long) As Long
    Private Declare Function ReleaseDC Lib "User32" (ByVal hwnd As Long, ByVal Hdc As Long) As Long
    Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal Hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
    Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal Hdc As Long) As Long
    Private Declare Function SelectObject Lib "gdi32" (ByVal Hdc As Long, ByVal hObject As Long) As Long
    Private Declare Function BitBlt Lib "gdi32" (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 GetPixel Lib "gdi32" (ByVal Hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
    Private Declare Function SetPixel Lib "gdi32" (ByVal Hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
    Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    Private Declare Function DeleteDC Lib "gdi32" (ByVal Hdc As Long) As Long
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Declare Function GetForegroundWindow Lib "User32" () As Long
    Private Declare Function GetDesktopWindow Lib "User32" () As Long
    Private Declare Function GetActiveWindow Lib "User32" () As Long
    Private Declare Function GetWindowRect Lib "User32" (ByVal hwnd As Long, lpRect As RECT) As Long
    ' api creation object image
    Private Declare Function CopyImage& Lib "User32" (ByVal handle&, ByVal un1&, ByVal n1&, ByVal n2&, ByVal un2&)
    Private Declare Function IIDFromString Lib "ole32" (ByVal lpsz As String, ByRef lpiid As GUID) As Long
    Private Declare Function OleCreatePictureIndirect Lib "olepro32" (pPictDesc As PICTDESC, ByRef riid As GUID, ByVal fOwn As Long, ByRef ppvObj As IPicture) As Long
    'rectangle
    Type RECT: Left As Long: Top As Long: Right As Long: BOTTOM As Long: End Type
    'guid all propertie pour le jpg
    Type GUID: Data1 As Long: Data2 As Integer: Data3 As Integer: Data4(8) As Byte: End Type
    ' info image
    Private Type PICTDESC: cbSize As Long: picType As Long: hImage As Long: End Type
    Const SRCCOPY = &HCC0020
    Public Chemin_Image As String
    Public Mon_Usf As String
    '******************************************************************
    ' La fonction qui suit sert à générer et sauvegarder ue image copie ecran d'un UserFrom.
    ' en cas de soucis contatcer PATRICKTOULON sur developpez.com
    '*******************************************************************
     
     
    Sub captur_USERFORM(usf)
        Dim ActiveHwnd As Long, DeskHwnd As Long, Hdc As Long, hdcMem As Long, RECT As RECT, action As Long, fwidth As Long, fheight As Long
        Dim hBitmap As Long, iPic As IPicture, hCopy&, tIID As GUID, tPICTDEST As PICTDESC, Ret As Long
        '---------------------------------------------------
        DeskHwnd = GetDesktopWindow(): ActiveHwnd = GetActiveWindow()    ' determination du handle de la fentre active et du bureau
        '---------------------------------------------------
        '---------------------------------------------------
        'determination du rectangle de capture avec les coordonnée de la fenetre active
        Call GetWindowRect(ActiveHwnd, RECT)
        fwidth = (RECT.Right - RECT.Left): fheight = (RECT.BOTTOM - RECT.Top)
        '---------------------------------------------------
        '---------------------------------------------------
        ' determination du contexte HDC du desktop et creation du bitmap avec son HDC
        Hdc = GetDC(DeskHwnd)
        hdcMem = CreateCompatibleDC(Hdc)
        hBitmap = CreateCompatibleBitmap(Hdc, fwidth - 9, fheight - 24)
        '---------------------------------------------------
        If hBitmap <> 0 Then
            SelectObject hdcMem, hBitmap
            BitBlt hdcMem, 0, 0, fwidth - 9, fheight - 24, Hdc, RECT.Left + 4.5, RECT.Top + 24, SRCCOPY
            '---------------------------------------------
            ' vidage et mise en memoire de l'image bitmap dans le clipboard
            OpenClipboard 0: EmptyClipboard: SetClipboardData 2, hBitmap: CloseClipboard
            '---------------------------------------------
        End If
        '                                                 SAUVEGARDE DE L IMAGE
        Chemin_Image = Environ("userprofile") & "\Desktop\" & usf.Name & ".jpg"
        Mon_Usf = usf.Name & ".jpg"
        OpenClipboard 0&
        hCopy = CopyImage(GetClipboardData(&H2), 0, 0, 0, &H8)
        CloseClipboard
        If hCopy = 0 Then Exit Sub
        Const IPictureIID = "{7BF80981-BF32-101A-8BBB-00AA00300CAB}"
        Ret = IIDFromString(StrConv(IPictureIID, vbUnicode), tIID)
        If Ret Then Exit Sub
        With tPICTDEST: .cbSize = Len(tPICTDEST): .picType = 1: .hImage = hCopy: End With
        Ret = OleCreatePictureIndirect(tPICTDEST, tIID, 1, iPic)
        If Ret Then Exit Sub
        SavePicture iPic, Chemin_Image    'on enregistre le cliché
        '---------------------------------------------
        ' Clean up handles
        DeleteDC hdcMem: ReleaseDC DeskHwnd, Hdc
        '---------------------------------------------
    End Sub
    Deuxième question, nous allons migrer sur W10 et donc Edge,
    J'utilise aussi la fonction copier/coller d'une plage via linternet explorer.
    Sais-tu si le passage par Edge fonctionnera aussi ?
    Rappel du code actuellement utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ' construction de la page HTML
    Set Plage_Html = Sheets("Form_CCA").Range("zones_cca")
         Plage_Html.Copy
         Set ie = CreateObject("internetexplorer.application")
        With ie
            .navigate "about:blank"
            Do: DoEvents: Loop While .readystate <> 4
           ' .Visible = True
            .document.Body.innerhtml = "<div contenteditable=true></div>"
            Set div = .document.getelementsbytagname("DIV")(0)
            div.Focus: .ExecWB 13, 0: codehtml = div.innerhtml
            .Quit
        End With

    Merci pour ton aide toujours précieuse.
    Denis

  14. #94
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    tu


    re bonjour denis
    tu pourrais réouvrir en catimini ton fichier créé et avec WIA et recréer limage avec l'image elle meme en reduisant la qualité a 50%
    je regarde dans mes archives ,il me semble que javais fait ca deja meme a 50% avec WIA j'avais une qualité bien superieur qu'avec la methode exporte d'un chart
    tu peux meme la redimentioner il me semble laisse moi le temps de trouver
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  15. #95
    Membre averti
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Points : 314
    Points
    314
    Par défaut
    En cherachant de mon coté, je pensais pouvoir ajouter l'attribut résolution pbPictureResolutionWeb_96dpi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    expression. SaveAsPicture ( NomFichier, résolution)
    Mais ça ne marche pas dans la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       SaveasPicture iPic, Chemin_Image, pbPictureResolutionWeb_96dpi   'on enregistre le cliché
    '
    Alors j'ai tenté le WIA expliqué par Skyroad, j'ai un message
    type défini par l'utilisateur pas defini
    donc cela veut dire qu'il faudrait que tous mes utilisaeurs active une librairy supplémentaire, pas facile.

    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
     
     
    '**************d'après le tuto de sylkyroad*******
     
    SavePicture iPic, Chemin_Image   'on enregistre le cliché
        Dim Img As WIA.ImageFile, IP As WIA.ImageProcess
    '
    'Création conteneur pour l'image à manipuler
        Set Img = CreateObject("WIA.ImageFile")
        'Création du gestionnaire de filtre
        Set IP = CreateObject("WIA.ImageProcess")
     
        'Chargement de l'image dans le conteneur
        Img.LoadFile Mon_Usf
    '
    ''        'Ajoute le filtre pour redimensionner l'image (Scale)
    ''        IP.Filters.Add IP.FilterInfos("Scale").FilterID
    ''        'Définit la largeur maxi pour le redimensionnement
    ''        IP.Filters(1).Properties("MaximumWidth") = 90
    ''        'Définit la hauteur maxi pour le redimensionnement
    ''        IP.Filters(1).Properties("MaximumHeight") = 90
    ''        'remarque :
    ''        'Les proportions sont conservées. Le filtre prend en compte
    ''        'les ratios et adapte la taille pour ne pas dépasser les valeurs maxi définies.
    ''
    ''    'Application du filtre à l'image
        Set Img = IP.Apply(Img)
    '    'Enregistre l'image redimensionnée
    '    Img.SaveFile "C:\fourmizThumbnail.JPG"
    Img.saveaspicture Mon_Usf, pbPictureResolutionWeb_96dpi

  16. #96
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    non ne confond pas late binding et early binding
    latebinding(declaration tardive) c'est avec createobject et dans les dim c'est "As object"
    sinon tu n'aurais pas besoins de créer l'object img ou autre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Dim Img As WIA.ImageFile, IP As WIA.ImageProcess
    '
    'Création conteneur pour l'image à manipuler
        Set Img = CreateObject("WIA.ImageFile")
        'Création du gestionnaire de filtre
        Set IP = CreateObject("WIA.ImageProcess")
    donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Img As object, IP As object
    par consequence pas de reference a activer
    tiens pour reprendre l'exemple de Silkyroad
    un exemple
    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
    Sub redimensionnerImage()
        Dim Img As Object, IP As Object    'OBJECT!!!!! OBJECT!!!!!
        Set Img = CreateObject("WIA.ImageFile")    'Création conteneur pour l'image à manipuler
        Set IP = CreateObject("WIA.ImageProcess")    'Création du gestionnaire de filtre
        Img.LoadFile "H:\fond d'ecran\paysages\paysage2.jpg"    'Chargement de l'image dans le conteneur
        With IP.Filters
            .Add IP.FilterInfos("Scale").FilterID
            .Filters(1).Properties("MaximumWidth") = 90
            .Filters(1).Properties("MaximumHeight") = 90
            'Application du filtre à l'image
            Set Img = .Apply(Img)
        End With
        'Enregistre l'image redimensionnée
        Img.SaveFile "H:\fond d'ecran\paysages\paysage22.jpg"
    End Sub
    il ne te reste plus qu'a le combiné a la sortie des bitmaps peut etre en metant les dimentions en point des userform et le tour est joué
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  17. #97
    Membre averti
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Points : 314
    Points
    314
    Par défaut
    OK, mais pour le early and late binding ...

    bon
    J'ai trouvé une liste de filters
    https://docs.microsoft.com/en-us/pre...to-use-filters
    et je devrais pouvoir utiliser "convert".

    Par contre j'ai encore l'erreur
    438 propriété ou méthode non gérée par cet objet
    au moment ou j'essaye d'affecter une autre valeur à la ligne filters(1).properties
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            .Add IP.FilterInfos("Scale").FilterID
            .Filters(1).Properties("MaximumWidth") = 90
    Merci si tu vois ce qui manque dans mes définitions.
    Denis

  18. #98
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    puré c'est moi qui fait le C... la!!!! mille excuse c'est juste une question d'object dans le with

    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
    Sub redimensionnerImage()
        Dim Img As Object, IP As Object    'OBJECT!!!!! OBJECT!!!!!
        Set Img = CreateObject("WIA.ImageFile")    'Création conteneur pour l'image à manipuler
        Set IP = CreateObject("WIA.ImageProcess")    'Création du gestionnaire de filtre
        Img.LoadFile "H:\fond d'ecran\paysages\paysage2.jpg"    'Chargement de l'image dans le conteneur
        With IP.Filters
            .Add IP.FilterInfos("Scale").FilterID
            .Item(1).Properties("MaximumWidth") = Img.Width / 3
            .Item(1).Properties("MaximumHeight") = Img.Height / 3
            'Application du filtre à l'image
            Set Img = IP.Apply(Img)
        End With
        'Enregistre l'image redimensionnée
        Img.SaveFile "H:\fond d'ecran\paysages\paysage22.jpg"
    End Sub
    ton image sera disée par 3 en terme de dimention a toi d'adapter si c'est trop ou pas assez
    mille excuse pour l'induction en erreur c'est de ma faute
    demain j'arrete le pinnard
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  19. #99
    Membre averti
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Points : 314
    Points
    314
    Par défaut
    Merci Patrick, j'aurais aussi dû le voir !

    Bon donc le redimensionnement fonctionne., mais cela ne me convient pas puisque j'envoie une image illisible (trop petite).
    donc j'aimerais réduire la qualité, et là ça coince erreur sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            .Item(1).Properties("FormatID").Value = wiaFormatJPEG
    The ID is not formatted correctly

    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
       Sub redimimage()
       Dim Img As Object, IP As Object    'OBJECT!!!!! OBJECT!!!!!
        Set Img = CreateObject("WIA.ImageFile")    'Création conteneur pour l'image à manipuler
        Set IP = CreateObject("WIA.ImageProcess")    'Création du gestionnaire de filtre
     
        Img.LoadFile "Mon_Image.JPG"    'Chargement de l'image dans le conteneur
        With IP.Filters
    '        .Add IP.FilterInfos("Scale").FilterID
    '        .Item(1).Properties("MaximumWidth") = 90
    '        .Item(1).Properties("MaximumHeight") = 90
     
            .Add IP.FilterInfos("Convert").FilterID
            .Item(1).Properties("FormatID").Value = wiaFormatJPEG
            .Item(1).Properties("Quality").Value = 5
     
            'Application du filtre à l'image
            Set Img = IP.Apply(Img)
        End With
     
        'Enregistre l'image redimensionnée
        Img.SaveFile "Mon_Image_2.jpg"
     
       End Sub
    Je ne trouve rien sur cette erreur.

  20. #100
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re fonction complete avec conversion en vrai jpg en qualité 100%
    bonjour Denis
    voila ta fonction complete
    resultat on passe de 1.2 M a 50kilos en jpg en qualité 100% et le tout en late binding tu n'a donc pas de reference a activer
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    Private Declare Function OpenClipboard Lib "User32" (ByVal hwnd As Long) As Long
    Private Declare Function EmptyClipboard Lib "User32" () As Long
    Private Declare Function CloseClipboard Lib "User32" () As Long
    Private Declare Function SetClipboardData Lib "User32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
    Private Declare Function GetClipboardData& Lib "User32" (ByVal wFormat%)
    Private Declare Function GetDC Lib "User32" (ByVal hwnd As Long) As Long
    Private Declare Function ReleaseDC Lib "User32" (ByVal hwnd As Long, ByVal Hdc As Long) As Long
    Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal Hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
    Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal Hdc As Long) As Long
    Private Declare Function SelectObject Lib "gdi32" (ByVal Hdc As Long, ByVal hObject As Long) As Long
    Private Declare Function BitBlt Lib "gdi32" (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 GetPixel Lib "gdi32" (ByVal Hdc As Long, ByVal x As Long, ByVal Y As Long) As Long
    Private Declare Function SetPixel Lib "gdi32" (ByVal Hdc As Long, ByVal x As Long, ByVal Y As Long, ByVal crColor As Long) As Long
    Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    Private Declare Function DeleteDC Lib "gdi32" (ByVal Hdc As Long) As Long
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Declare Function GetForegroundWindow Lib "User32" () As Long
    Private Declare Function GetDesktopWindow Lib "User32" () As Long
    Private Declare Function GetActiveWindow Lib "User32" () As Long
    Private Declare Function GetWindowRect Lib "User32" (ByVal hwnd As Long, lpRect As RECT) As Long
    ' api creation object image
    Private Declare Function CopyImage& Lib "User32" (ByVal handle&, ByVal un1&, ByVal n1&, ByVal n2&, ByVal un2&)
    Private Declare Function IIDFromString Lib "ole32" (ByVal lpsz As String, ByRef lpiid As GUID) As Long
    Private Declare Function OleCreatePictureIndirect Lib "olepro32" (pPictDesc As PICTDESC, ByRef riid As GUID, ByVal fOwn As Long, ByRef ppvObj As IPicture) As Long
    'rectangle
    Type RECT: Left As Long: Top As Long: Right As Long: BOTTOM As Long: End Type
    'guid all propertie pour le jpg
    Type GUID: Data1 As Long: Data2 As Integer: Data3 As Integer: Data4(8) As Byte: End Type
    ' info image
    Private Type PICTDESC: cbSize As Long: picType As Long: hImage As Long: End Type
    Const SRCCOPY = &HCC0020
    Public Chemin_Image As String
    Public Chemin_Imagetemp As String
    Public Mon_Usf As String
    '******************************************************************
    ' La fonction qui suit sert à générer et sauvegarder ue image copie ecran d'un UserFrom.
    ' en cas de soucis contatcer PATRICKTOULON sur developpez.com
    '*******************************************************************
     
    Sub captur_USERFORM(usf)
        Dim ActiveHwnd As Long, DeskHwnd As Long, Hdc As Long, hdcMem As Long, RECT As RECT, action As Long, fwidth As Long, fheight As Long
        Dim hBitmap As Long, iPic As IPicture, hCopy&, tIID As GUID, tPICTDEST As PICTDESC, Ret As Long, Img As Object, IP As Object    'OBJECT!!!!! OBJECT!!!!!
     
        '---------------------------------------------------
        DeskHwnd = GetDesktopWindow(): ActiveHwnd = GetActiveWindow()    ' determination du handle de la fentre active et du bureau
        '---------------------------------------------------
        '---------------------------------------------------
        'determination du rectangle de capture avec les coordonnée de la fenetre active
        Call GetWindowRect(ActiveHwnd, RECT)
        fwidth = (RECT.Right - RECT.Left): fheight = (RECT.BOTTOM - RECT.Top)
        '---------------------------------------------------
        '---------------------------------------------------
        ' determination du contexte HDC du desktop et creation du bitmap avec son HDC
        Hdc = GetDC(DeskHwnd)
        hdcMem = CreateCompatibleDC(Hdc)
        hBitmap = CreateCompatibleBitmap(Hdc, fwidth - 9, fheight - 30)
        '---------------------------------------------------
        If hBitmap <> 0 Then
            SelectObject hdcMem, hBitmap
            BitBlt hdcMem, 0, 0, fwidth - 9, fheight - 30, Hdc, RECT.Left + 4.5, RECT.Top + 30, SRCCOPY
            '---------------------------------------------
            ' vidage et mise en memoire de l'image bitmap dans le clipboard
            OpenClipboard 0: EmptyClipboard: SetClipboardData 2, hBitmap: CloseClipboard
            '---------------------------------------------
        End If
        '                                                 SAUVEGARDE DE L IMAGE
        Chemin_Imagetemp = Environ("userprofile") & "\Desktop\" & usf.Name & "temp.jpg"
        Mon_Usf = usf.Name & ".jpg"
        OpenClipboard 0&
        hCopy = CopyImage(GetClipboardData(&H2), 0, 0, 0, &H8)
        CloseClipboard
        If hCopy = 0 Then Exit Sub
        Const IPictureIID = "{7BF80981-BF32-101A-8BBB-00AA00300CAB}"
        Ret = IIDFromString(StrConv(IPictureIID, vbUnicode), tIID)
        If Ret Then Exit Sub
        With tPICTDEST: .cbSize = Len(tPICTDEST): .picType = 1: .hImage = hCopy: End With
        Ret = OleCreatePictureIndirect(tPICTDEST, tIID, 1, iPic)
        If Ret Then Exit Sub
        SavePicture iPic, Chemin_Imagetemp    'on enregistre le cliché
        '---------------------------------------------
        ' Clean up handles
        DeleteDC hdcMem: ReleaseDC DeskHwnd, Hdc
        '---------------------------------------------
         Set Img = CreateObject("WIA.ImageFile")    'Création conteneur pour l'image à manipuler
        Set IP = CreateObject("WIA.ImageProcess")    'Création du gestionnaire de filtre
        Img.LoadFile Chemin_Imagetemp    'Chargement de l'image dans le conteneur
        With IP.Filters
                .Add IP.FilterInfos("Convert").FilterID
            .Item(1).Properties("FormatID").Value = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}" 'c'est la constante ""wiaFormatJPEG"" en late biding
            .Item(1).Properties("Quality").Value = 100
            'Application du filtre à l'image
            Set Img = IP.Apply(Img)
        End With
        'Enregistre l'image redimensionnée
        If Dir(Replace(Chemin_Imagetemp, "temp", "")) <> "" Then Kill Replace(Replace(Chemin_Imagetemp, "temp", ""), "bipmap", "jpg")
        Img.SaveFile Replace(Chemin_Imagetemp, "temp", "")
        'Kill Chemin_Imagetemp
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

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

Discussions similaires

  1. probleme sauvegarde image
    Par clod83 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 09/12/2007, 11h43
  2. [BufferedImage] Redimensionner / Sauvegarder image sur disque
    Par nicolas.pied dans le forum Multimédia
    Réponses: 1
    Dernier message: 17/04/2007, 02h54
  3. sauvegarde image dans un dossier
    Par charaf dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/03/2007, 11h17
  4. [Image]sauvegarde image redimensionnée
    Par taka10 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 10/04/2006, 10h58
  5. StretchDIBits et sauvegarde image affichée en BPM
    Par chris_wafer_2001 dans le forum BPM
    Réponses: 5
    Dernier message: 25/12/2005, 11h09

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