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 bilagaI 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 bilagaDet 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