Sända e-post från Excel med bilaga 

I detta tips visas hur vi med hjälp av skilda tekniker kan sända e-post direkt från Excel med t ex en arbetsbok som bilaga.

Excel erbjuder denna möjlighet i viss utsträckning via kommandot:
Arkiv | Skicka till | E-post. 

Dock finns det vissa begränsningar, vilket gör att andra alternativ är intressanta.

Exemplena förutsätter att vi har tillgång till MAPI-postsystemet. 


Arbetsbok som bilaga

I det första exemplet visas en generell lösning. Således behöver vi inte ha MS Outlook installerat på datorn.

Proceduren skapar ett nytt postmeddelande med den aktiva arbetsboken som bilaga.

Mottagarna förutsätts finnas i postprogrammets adressbok. 

Det går också lika bra att sända såväl till enstaka e-postmottagare som till en distributionslista.

Sub Sand_Arbetsbok_Epost()
If Application.MailSystem <> xlNoMailSystem Then
       ActiveWorkbook.SendMail _
'Vid flera mottagare krävs en matris.
             Recipients:=Array("Frun", "Dennis", "Team 2000"), _
             Subject:="Ärende: Budgetunderlag"
             Application.MailLogoff

Else
       MsgBox "Inget Microsoft postsystem är installerat.", vbInformation, _
       "Postmeddelande"
End If

End Sub


Vill vi använda oss av Outlooks objektmodell ser lösningen ut enligt proceduren nedan.

Innan proceduren körs måste en referens sättas till Outlooks objektbibliotek. Det sker på följande sätt:

1. Öppna VB-Editorn i Excel.

2. Välj kommandot Verktyg | Referenser...

3. Bocka för Microsoft Outlook x.x Object Library.

Genom att sätta en referens till en specifik version av Outlooks Object Library ställs kravet, vid distribution, på att mottagarna också har tillgång till det. Istället kan en mer generell referens skapas genom att i procedurerna ange följande:

Dim OLObj as Object

Set OLObj = CreateObject("Outlook.Application")

Den mest påtagliga nackdelen är att det inte går lika fort jämfört med ovanstående ansats.

Sub Sand_Arbetsbok_Outlook()

   '© 2000 - 2002 Alla rättigheter XL-Dennis

   'Reviderad 2002-09-29 / 2003-02-25

   Dim olApp As Outlook.Application

   Dim olNewMail As Outlook.MailItem

 

   Set olApp = New Outlook.Application

   Set olNewMail = CreateItem(olMailItem)

 

   With olNewMail

      .Recipients.Add "Dennis"

      .Recipients.Add "Frun"

      .CC = "Team 2000"

      .BCC = "Evaluering"

      .Subject = "Ärende: Programlista"

      .Body = "Underlag enligt ök."

      With .Attachments

         .Add ThisWorkbook.Path & "\" & ThisWorkbook.Name

         .Item(1).DisplayName = "Sända e-post"

      End With

      .Save

      .Display

   End With

 

   Set olNewMail = Nothing

   Set olApp = Nothing

End Sub


Aktivt kalkylblad som bilaga

Det som skiljer förfarandet här från ovanstående är att vi kopierar det aktiva kalkylbladet och stänger den nya arbetsboken utan att spara den. 

Det är alltså en arbetsbok med det önskade kalkylbladet som skapas.

Sub Sand_AktivtKalkylblad_Epost()
If Application.MailSystem <> xlNoMailSystem Then
       ActiveSheet.Copy
       With ActiveWorkbook
             .SendMail _
              Recipients:=Array("Frun", "Dennis", "Team 2000"), _
              Subject:="Ärende: Budgetunderlag"
             .Close SaveChanges:=False
       End With
       Application.MailLogoff
Else
       MsgBox "Inget Microsoft postsystem är installerat.", vbInformation, _
       "Postmeddelande"
End If
End Sub


Vill vi använda oss av Outlooks objektmodell är lösningen som följer: 

Sub Sand_AktivtKalkylblad_Outlook()

   '© 2000-2002 Alla rättigheter XL-Dennis

   'Reviderad 2002-09-29

   Dim olApp As Outlook.Application

   Dim olNewMail As Outlook.MailItem

   Dim stSokVag As String

   Dim stNamn As String

 

   Set olApp = New Outlook.Application

   Set olNewMail = CreateItem(olMailItem)

 

   Application.ScreenUpdating = False

   'Här sker kopiering av aktivt kalkylblad till en temporär ny arbetsbok.

   'Vi sparar såväl namn som sökväg till arbetsboken.

   ActiveSheet.Copy

   ActiveWorkbook.Save

   stSokVag = ActiveWorkbook.Path

   stNamn = ActiveWorkbook.Name

   ActiveWorkbook.Close

 

   'Här skapas postmeddelandet och kontroll av mottagare sker.

   'Ett "vänligt" namn för bilagan skapas också.

   With olNewMail

      With .Recipients.Add("info@xldennis.com")

         .Type = olTo

         If Not .Resolve Then

            MsgBox "Kan inte hitta mottagaren.", vbInformation

            Exit Sub

         End If

      End With

      .Subject = "Ärende: Programlista"

      .Body = "Underlag enligt ök."

      .Attachments.Add stSokVag & "\" & stNamn, olByValue, _

            1, "Programlista"

      .Save

   End With

 

   Set olNewMail = Nothing

   Set olApp = Nothing

 

   Kill stSokVag & "\" & stNamn

    Application.ScreenUpdating = False

 End Sub