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 :

Envoi d'une plage par mail [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 138
    Points : 9 972
    Points
    9 972
    Billets dans le blog
    5
    Par défaut Envoi d'une plage par mail
    Bonjour à tous,

    je cherche à envoyer par mail une plage excel.

    ma macro plante à la ligne 17 ci-dessous, lorsqu'il faut générer le corps du mail.

    J'obtiens un message "La limite inférieure de la matrice doit être égale à zéro"

    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
    Sub EnvoiMail_Outlook()
    
    Dim OutApp As Object
    Dim OutMail As Object
    Dim RepDate As String
    
    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)
    
    RepDate = InputBox("Quelle est la date de votre indicateur (par défaut, date du jour) ?", "Date de l'indicateur", Format(Date, "dd/mm/yyyy", vbMonday, vbFirstFourDays))
    
    
    With OutMail
    
    .Subject = "Indicateurs arrêtés au " & RepDate
    .Body = ThisWorkbook.Sheets("ARDOISE").Range("TabIndic")
    
    .Display
    
    Set OutApp = Nothing
    Set OutMail = Nothing
    
    End With
    End Sub
    Cette plage (qui est un tableau) est composée de 9 lignes sur 3 colonnes

    J'ai tenté (en vain) de modifier ma méthode :

    - en utilisant un .copy et un .paste
    - en utilisant une plage fixe plutôt qu'une plage nommée


    Quelqu'un a une idée de ce qui coince ?

    Merci par avance.

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut heu
    Bonjour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Body = ThisWorkbook.Sheets("ARDOISE").Range("TabIndic")
    je n'ai jamais utiliser outlook mais
    peut etre parceque tu essaie d'envoyer un objet ( range) plutot que son contenu

    mais de cela je n'en suis pas sur

  3. #3
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Points : 2 553
    Points
    2 553
    Par défaut
    mets dans ton body
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Set rng = ThisWorkbook.Sheets("ARDOISE").Range("TabIndic")
        With OutMail
            .To = ""
            .CC = ""
            .BCC = ""
            .Subject = "Indicateurs arrêtés au " & RepDate
            .HTMLBody = RangetoHTML(rng)
                ' In place of the following statement, you can use ".Display" to
                ' display the e-mail message.
            .Send 
        End 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
    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
    Function RangetoHTML(rng As Range)
        Dim fso As Object
        Dim ts As Object
        Dim TempFile As String
        Dim TempWB As Workbook
     
        TempFile = Environ$("temp") & "/" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
     
        ' Copy the range and create a workbook to receive the data.
        rng.Copy
        Set TempWB = Workbooks.Add(1)
        With TempWB.Sheets(1)
            .Cells(1).PasteSpecial Paste:=8
            .Cells(1).PasteSpecial xlPasteValues, , False, False
            .Cells(1).PasteSpecial xlPasteFormats, , False, False
            .Cells(1).Select
            Application.CutCopyMode = False
            On Error Resume Next
            .DrawingObjects.Visible = True
            .DrawingObjects.Delete
            On Error GoTo 0
        End With
     
        ' Publish the sheet to an .htm file.
        With TempWB.PublishObjects.Add( _
             SourceType:=xlSourceRange, _
             Filename:=TempFile, _
             Sheet:=TempWB.Sheets(1).Name, _
             Source:=TempWB.Sheets(1).UsedRange.Address, _
             HtmlType:=xlHtmlStatic)
            .Publish (True)
        End With
     
        ' Read all data from the .htm file into the RangetoHTML subroutine.
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
        RangetoHTML = ts.ReadAll
        ts.Close
        RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
                              "align=left x:publishsource=")
     
        ' Close TempWB.
        TempWB.Close savechanges:=False
     
        ' Delete the htm file.
        Kill TempFile
     
        Set ts = Nothing
        Set fso = Nothing
        Set TempWB = Nothing
    End Function

  4. #4
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 138
    Points : 9 972
    Points
    9 972
    Billets dans le blog
    5
    Par défaut
    Re bonjour,

    merci aux contributeurs de ce fil.

    @patricktoulon : je pense que la propriété du range reste "value" par défaut

    @EngueEngue : j'avais peur d'avoir l'obligation de passer par un HTML, je pense que c'est confirmé

    J'ai intégré ton aménagement de code dans le mien, ainsi que la fonction RangetoHTML.

    J'ai un message d'erreur à la ligne suivant de la macro (pas la fonction) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .HTMLBody = RangetoHTML(rng)
    de mémoire (je n'ai pas le fichier sous la main avant demain matin), le message est "type d'arguments ByRef incompatible"

    Alors là, j'ai toujours eu du mal à manipuler les ByVal et ByRef, c'est le moment de s'y mettre sérieusement, en me lançant à l'eau....sans savoir nager !

    Pensez-vous que la solution passe par une modification de l'option "By" de l'argument rng ? Car il me semble que par défaut on est sur du ByRef ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Function RangetoHTML(ByVal rng As Range)
    Allez, me jetez pas des tomates, je cherche

  5. #5
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 138
    Points : 9 972
    Points
    9 972
    Billets dans le blog
    5
    Par défaut
    Bonjour aux contributeurs et lecteurs.

    Le problème venait bien de ByRef !

    il faut donc modifier la ligne initiale de EngueEngue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Function RangetoHTML(rng As Range)
    afin de passer l'argument par Valeur (et non Référence) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Function RangetoHTML(ByVal rng As Range)

    Problème résolu, merci aux aides

  6. #6
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Points : 2 553
    Points
    2 553
    Par défaut
    Je suis étonné puisque le byref marche très bien chez moi. Tu as du l'appeller de façon bizarre...

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

Discussions similaires

  1. Amélioration du code de l'envoi d'une feuille par mail via LotusNotes
    Par alex830001 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 03/11/2008, 14h39
  2. Envois d'une plage de cellules fixe par mail en vba
    Par dguff dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/09/2007, 12h49
  3. Envoi d'une feuille par mail
    Par yjouin dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/07/2007, 10h37
  4. [Mail] Envoi d'une recherche par e-mail
    Par vinchenze42 dans le forum Langage
    Réponses: 4
    Dernier message: 17/12/2006, 15h51
  5. Réponses: 1
    Dernier message: 15/07/2005, 11h21

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