Copiar una tabla en Outlook en formato imagen

Resuelto
fabkiller78 Mensajes publicados 11 Estado Miembro -  
fabkiller78 Mensajes publicados 11 Estado Miembro -
Bonjour, Merci pour votre message. Vous pouvez insérer directement une image du tableau Excel dans le corps du mail en utilisant VBA pour copier le tableau au format image et l’ajouter en tant que pièce jointe ou HTML dans le Corps. Voici une approche possible en préservant votre structure et en ajoutant l’image dans le corps du mail. Option 1: insérer l’image en tant que pièce jointe et l’utiliser dans le corps HTML - Copier le tableau en image - Enregistrer l’image sur le disque - Joindre l’image au mail et l’insérer dans le corps HTML Exemple adapté à votre code (suppose que vous utilisez le corps HTML): Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0) Dim corps_mail As String Dim imgPath As String JourJ = Date ' ou votre variable existante imgPath = Environ("USERPROFILE") & "\Desktop\DailySales.png" ' chemin de sauvegarde temporaire ' Copier le tableau Excel comme image With ThisWorkbook.Sheets("Daily sales") .Range("B2:X53").CopyPicture xlScreen, xlPicture ' Sauvegarder l'image dans le presse-papiers, puis créer un shape dans une fenêtre temporaire pour enregistrer si nécessaire ' Alternative simple : coller dans un nouveau classeur puis enregistrer comme image Dim tmpWbk As Workbook Dim tmpSh As Worksheet Set tmpWbk = Workbooks.Add Set tmpSh = tmpWbk.Sheets(1) tmpSh.Range("A1").PasteSpecial tmpWbk.SaveAs ThisWorkbook.Path & "\DailySales.png", xlPNG imgPath = ThisWorkbook.Path & "\DailySales.png" tmpWbk.Close False End With corps_mail = "Bonjour, " & vbNewLine & vbNewLine & _ "Veuillez trouver ci-dessous les ventes jour au " & Format(JourJ, "dd/mm/yyyy") & "." & vbNewLine & vbNewLine & _ "" & vbNewLine & vbNewLine & _ "Bien cordialement

" With OutMail .To = "ventesjour" .CC = "" .BCC = "" .Subject = "Ventes jour au " & Format(JourJ, "dd/mm/yyyy") ' Utilisez du HTML dans le Body et attachez l’image en tant que pièce jointe avec un CID .HTMLBody = Replace(corps_mail, "

", "

") ' si vous mélangez HTML et texte .Attachments.Add imgPath, 1, 0, "DailySalesImage" ' 1 = olByValue, 0 = position (peut varier) ' Définir l’image en CID Dim f As Object Set f = .Attachments(.Attachments.Count) f.PropertyAccessor.SetProperty "http://schemas.microsoft.com/mapi/proptag/0x3712001F", "DailySalesImage" .Display End With Set OutMail = Nothing Set OutApp = Nothing Notes et remarques: - Cette méthode crée une image du tableau et l insère dans le corps via HTML en utilisant un CID (Content-ID). Outlook peut nécessiter des manipulations supplémentaires selon la version. - Le code ci-dessus peut nécessiter des ajustements pour enregistrer correctement le tableau comme image et pour définir le CID. Une méthode alternative consiste à copier-coller le tableau directement dans le corps en tant qu’image via les méthodes HTML/Image d’Outlook, mais cela dépend des possibilités d’Outlook et d’Excel sur votre système. - Assurez-vous que le chemin imgPath est accessible et que les permissions d’écriture/exportation sont autorisées. - Cette approche suppose que le fichier est ouvert et que l’onglet Daily sales est actif; si vous souhaitez automatiser sans activer, vous pouvez vous référer explicitement à la feuille et scanner la plage. Option 2: insérer l’image en tant que fichier joint et afficher une miniature dans le corps (liens inline simples) - Enregistrer l’image comme DailySales.png - Insérer une balise dans le HTMLBody - Note: certains clients Outlook bloquent les images locales; l’utilisation de CID (comme ci-dessus) est préférable. Si vous préférez, je peux vous proposer une version plus simplifiée et testée étape par étape adaptée exactement à votre modèle de code (garde de la chaîne corps_mail, gestion des sauts de ligne, et insertion de l’image). Dites-moi quelle approche vous convient le mieux (CID dans HTMLBody, ou image jointe avec lien local).

6 respuestas

  1. Normad Mensajes publicados 112 Fecha de registro   Estado Miembro Última intervención   40
     
    Hola,
    Una solución parcial, añade la copia como imagen en el código

    Range("B2:X53").CopyPicture xlScreen, xlBitmap

    Luego haz un Ctrl+V en la ubicación deseada en el cuerpo del correo de Outlook.
    1
  2. fabkiller78 Mensajes publicados 11 Estado Miembro
     
    Hola,

    Me gustaría que todo sea automático.

    He probado vuestra solución integrando en CorpsMail una "selection.paste", pero la macro falla en esa línea. Después de varias búsquedas y pruebas me pregunto si no sería más sencillo pasar por Word o PowerPoint en la macro? Es decir, hacer una copia de imagen hacia Word y recuperar esta imagen de Word para incluirla en el cuerpo del correo.
    0
  3. Normad Mensajes publicados 112 Fecha de registro   Estado Miembro Última intervención   40
     
    En este caso, creo que hay que hacer el mensaje en formato HTML en el que se puede insertar una imagen mediante código.
    Gran día de bondad, después de algunos ensayos, aquí está el código adaptado:


    Dim Img As String, Plage As Range, PathTmp As String
    PathTmp = Environ$("temp") & ""
    Img = "Image.jpg"
    Set Plage = Range("B2:X53")

    'Creación de un archivo de imagen en el directorio temporal
    Plage.CopyPicture
    With ActiveSheet.ChartObjects.Add(0, 0, Plage.Width, Plage.Height)
    .Activate
    .Chart.Paste
    .Chart.Export PathTmp & Img, "JPG"
    End With

    ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count).Delete

    Set OutApp = CreateObject("outlook.application")
    Set OutMail = OutApp.CreateItem(olMailItem)

    With OutMail
    .TO = "ventesjour"
    '.CC = ""
    '.BCC = ""
    .Subject = "Ventes jour au " & Format(JourJ, "dd/mm/yyyy")
    .Attachments.Add PathTmp & Img, olByValue, 0
    .HTMLBody = "<span LANG=FR><p class=style2>" _
    & "<font FACE=Calibri SIZE=3>Bonjour,<br><br>" _
    & "Veuillez trouver ci-dessous les ventes jour au " _
    & Format(JourJ, "dd/mm/yyyy") & "<br><br>" _
    & "Bien cordialement<br><br>" _
    & "<img src='cid:" & Img & "'</font></span>"

    .Display
    End With

    On Error GoTo 0
    Set OutMail = Nothing
    Set OutApp = Nothing
    Kill PathTmp & Img
    0
  4. fabkiller78 Mensajes publicados 11 Estado Miembro
     
    Hola Normad,

    Gracias por esta solución, creo que vamos en la dirección correcta.
    Me aparece una imagen vacía en el cuerpo del correo con el siguiente mensaje:

    "imposible de mostrar la imagen vinculada. El archivo puede haber sido movido, renombrado o eliminado. Verifica que la liga apunte al archivo y a la ubicación correcta"

    Intento modificar el código pero hasta ahora en vano.
    0
  5. Normad Mensajes publicados 112 Fecha de registro   Estado Miembro Última intervención   40
     
    Hola,
    En casa funciona perfectamente.

    ¿Qué intentaste modificar?

    Viendo el mensaje de error, empezaría por eliminar la
    última línea:
    Kill PathTmp & Img
    (Esta línea borra la imagen creada en tu carpeta temporal).

    Si tras la eliminación funciona, habrá que borrar el archivo que puede existir ya al inicio del procedimiento, justo después de las líneas:

    Dim Img As String, Plage As Range, PathTmp As String
    PathTmp = Environ$("temp") & ""
    Img = "Image.jpg"

    añadir esta línea:
    If Dir(PathTmp & Img) <> "" Then Kill PathTmp & Img

    Si no, pon el código completo del procedimiento.
    0
    1. pijaku Mensajes publicados 13513 Fecha de registro   Estado Moderador Última intervención   2 773
       
      Hola, @Normad: El problema está relacionado con un fallo conocido en CCM... Tu línea de código: PathTmp = Environ$("temp") & "\"" fue transformada por las etiquetas de código del sitio commentçamarche.net, quedando como PathTmp = Environ$("temp") & """ Por lo tanto, no puede funcionar. @fabkiller78: así que reemplaza PathTmp = Environ$("temp") & "" por PathTmp = Environ$("temp") & "\"
      0
  6. fabkiller78 Mensajes publicados 11 Estado Miembro
     
    Muchas gracias a ustedes dos
    De hecho bastaba con modificar la línea PatchTmp para que funcionara
    Mi problema está resuelto
    0