E-mail küldés automatikusan, néhány soros VBA-kód segítségével

Nem kell hozzá segítség sem, csináljunk meg saját magunk!

2015. október 25. - Office Guru

Saját véleményem szerint az egyszerűbb kis VBA-kódok használati rangsorában egyértelműen előkelő helyen találhatóak az e-mail küldő makrók, főként vállalati környezetben, ahol esetenként 10-20-100 levelet kell ugyanazzal a szöveggel, más-más címezetteknek elküldeni valamilyen csatolmánnyal - magam is legalább tíz különféle verziójú mailküldő makrót láttam már Outlookra optimalizálva, úgyhogy a mostani posztban egy ilyen megoldás igen leegyszerűsített verzióját fogom bemutatni VBA-ban. Hangsúlyozom előzetesen, hogy rendkívül sokrétű, sokféle módon elkészíthető makrós megoldásról van szó, az Excelben külön felhasználói felületet építhetünk gombokkal, mezőkkel, színes, csilli-villi cuccokkal, én most azonban kizárólag az alapokra fogok koncentrálni, aki elég elhivatott vagy lelkes, az innen már úgyis könnyen tovább tud lépni (megjegyzés: a korábban itt már bemutatott dolgokat fel fogjuk használni, úgyhogy időnként már csak hivatkozom arra a megszerzett tudásunkra).

Első lépésként készítsünk valami hasonló kis táblát az Excelben (vagy amilyen formában, kinézettel akarjuk), innen fogja majd a kis programunk felvenni az értékeket az e-mailhez:

310.jpgEzután szépen ALT+F11 lenyomásával sétáljunk át a VBA editorba, ahol lássunk neki az aprócska makró összeállításának, méghozzá kezdjük kapásból azzal, hogy létrehozunk két objektumot, az egyiket az Outlook elindítására, a másikat pedig az E-mail létrehozására, hiszen ezzel férünk majd hozzá az Outlook összes tulajdonságához, metódusaihoz (követve a mintát, amelyet a Microsoft hivatalos leírásában is találjuk):

311.jpgAz objektumok tehát már megvannak, most töltsük is fel őket, az Outlookprogi objektumunk maga az Outlook program lesz, tehát hozzuk létre:

CreateObject("Outlook.Application")

Értelemszerűen ha mondjuk a WORD-öt akarjuk meghívni, akkor Word.Applicationt használunk.

E-mail objektumunkat pedig ebből következően már az előbb feltöltött Outlookprogi objektum egyik tulajdonságával töltjük fel, azaz a CreateItemmel, hiszen ez fog létrehozni nekünk egy új levelet az Outlook programjában (értelemszerűen egyéb utasításokat is használhatunk más célokra, más programokban is):

Outlookprogi.CreateItem(0)

312.jpgMiután már megvan az Email nevű objektumunk, használhatjuk annak tulajdonságait is, azaz hozzáférünk a To, a CC vagy akár a csatolmány tulajdonságokhoz is, azaz ezt most úgy képzeljük el, hogy van már egy üresen megnyitott levelünk Outlookban, amelyet fel kell töltenünk tartalommal.

Ahogy megismertük már, a With...End With parancs a közötte felsorolt utasításokat hajtja végre ugyanarra az objektumra vonatkozóan, tehát jelentős mennyiségű gépelést megspórol nekünk, amit pedig itt is fogunk hasznosítani, hiszen Email objektumunk tulajdonságait fogjuk módosítani a következő módon:

313.jpgAhogy látható a To értéket az első sheetünk első sorának második oszlopából vesszük fel, CC-t most üresen hagyjuk (de azért idetettem, hiszen ez általában fontos opció szokott lenni), hiszen nem várunk ilyen értéket, BCC-be célszerű valamilyen közös postafiókot, vagy saját e-mail címünket megadnunk, a működés biztosítása érdekében, Subjectbe meghívjuk az első sheetről a megfelelő cellát megint, ahogy tesszük ezt az e-mailünk szövegével is, plusz szépen hozzácsatolunk egy fájlt is a saját meghajtónkról. Fontos, hogy a .Display utasítással nem küldjük még el az e-mailt, hanem megnézhetjük a Send gombra kattintás előtt, ha ezt nem akarjuk megtenni, akkor simán használjunk helyette .Send utasítást és akkor nem is zavar minket semmilyen felugró ablak.

Még egy lépésünk van hátra az alapkódban (ezt mindenképpen célszerű megtenni), ez pedig az, hogy ürítsük ki két változóként deklarált objektumunkat, hogy az újabb használatnál a korábbi adatok már ne zavarjanak be a történetbe, plusz az sem mindig garantált, hogy az applikációt nem változtatjuk meg.

314.jpgAzaz ez az egész kódunk:

315.jpgDobjunk hozzá össze egy apró kis gombot a Ribbonunk Developer füle alatt található Controls szekcióba lévő Insert felhasználásával, majd a gombunk kattintás eseményéhez rendeljük hozzá a fenti makrót, így mostantól már gombkattintsára generálódik az e-mail:

316.jpg

317.jpg

A bejegyzés trackback címe:

https://officeguru.blog.hu/api/trackback/id/tr128019649

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Paul 2015.10.26. 09:23:16

Szia! Hogy lehetne ezt megcsinálni Thunderbird-höz?
Köszönöm válaszod előre is!

Office Guru 2015.10.26. 10:01:21

@Paul: Persze, ez bármire ráhúzható, ha a következőket használod, akkor minden applikációra működhet, elsőként amikor az objektumokat feltöltöd:

Set Uzenet = CreateObject("CDO.Message")
Set Konfiguracio = CreateObject("CDO.Configuration")

Illetve, amikor feltöltöd a mailt:

With Uzenet
Set .Configuration = Konfiguracio
.To = "feelthesunshineforever@gmail.com"
.CC = ""
.BCC = ""
.Subject = "Jelentés hétvégére"
.TextBody = "Szia, íme a jelentés! Üdv, OfficeGuru
.Send

Szép napot!

Paul 2015.10.27. 13:23:08

@Office Guru: Köszönöm! Ez így működik is! (még hozzá kellett adni némi CDO konfigurálást.)

Sajnos CDO-hoz nem jár .Display utasítás, csak .Send.. :-(

káposzta 2015.10.29. 23:34:02

Nemrég írtam két viszonylag egyszerű email-küldő makrót a munkahelyemen, azóta úgy néznek rám, mintha valami mágus lennék. Pedig ennél egyszerűbb kód nincs is a világon, nem is értem, miért nem jutott előbb eszébe valakinek, hogy megcsinálja. Ma volt egy meetingünk, ahol több csapatból is megjelentek emberek, és amikor meghallották, hogy az Excel tud automatikusan levelet küldeni, úgy néztek rám, mintha az aranycsinálás titkát osztottam volna meg velük :D

smagz 2015.12.01. 09:52:55

Sziasztok,
Ugyanezt GroupWise e-maillel szeretném, de nem tudom működésre bírni. A kódban nem jelöli a hibát, de indításkor "License information for this component not found" hibát kapom. Feltételezem hogy nem megfelelő a "Groupwise" mint program azonosító a kódban.? Előre is köszönöm

Office Guru 2015.12.01. 17:25:11

@smagz: Szia, szerintem GroupWise esetén át kell alakítani és bővíteni kell a kódot.

GroupwareTypeLibrary.Application és GroupwareTypeLibrary.Account objektumokkal kezdtél? Utána már ezekből meg tudod hívni a megfelelő parancsokat elvileg.

poord 2016.01.01. 13:06:38

Sziasztok!

Azt hogy lehetne megcsinálni, hogy a feladó, a címzett, és a tárgy, a példa szerint fix cellákból, a szöveg pedig az aktív cellából (ahol számadatok és szövegek vannak összefűzve)kerüljön a levélbe?

poord 2016.01.02. 20:57:05

@Atzs: Köszi!
Csak közben rájöttem, hogy nem úgy van ahogy írtam, mert csak a feladó és tárgy van fix helyen, a cím és a hozzá tartozó szöveg azonos sor különböző celláiban vannak, és együtt mozognak másik sorba a táblázat bővülésekor.
Tehát nem egy cellából, hanem egy kijelölt sor 1-1 cellájából kellene a címnek és a szövegnek bekerülni a levélbe.
Ez is megoldható?

Atzs · https://adatrendezo.hu 2016.01.02. 21:02:13

@poord:

subject = ActiveCell.Value
body = ActiveCell.Offset(0, 1).Value

speede85 2016.04.21. 19:55:09

Sziasztok,

Nagyon jó a kódsorozat. Alapként használtam a saját e-mail küldésemhez, de nálam egy kisebb gond lépet fel.
Body részébe nekem egy táblázatot illeszt be, ami egy másik Sheet-ről szedig össze az aktuálisokat.
A gondom annyi, hogy nagyon fontos a táblázat szerkezete, de mikor megkapják a többiek akkor nem azt látják mint amit elküldtem. A táblázat szét van esve, nincsenek keretek csak maga a nyers adatok mennek el. Valamit be kellene állítani valahol még?

Előre is köszönöm

smagz 2016.06.01. 16:04:02

@Office Guru:
Kedves Guru,
Most ismét visszatértem a problémához, de a groupwise megoldásban nem megy a kód, vagy csak nekem nem megy a programozás. Megkérhetlek, hogy a groupwise meghívását helyezd el az eredeti kódban, hogy komplett legyen?
Nagyon sokat segítenél.
Köszönöm.

poord 2017.06.25. 21:24:16

Kedves Guru!

Sokat segített nekem eddig ez a makró, de most több mellékletet kellene csatolni. Ha lehet többet csatolni, akkor hogy néz ki a makró?
Előre is köszönöm a segítséget!

Office Guru 2017.07.01. 10:58:33

@poord:

Szia! Szimplán csak ismételgesd ezt a sort a kódban és kész:
.Attachments.Add "C:\username\0000.txt"
.Attachments.Add "C:\username\0001.txt"

Ha pedig nem konstansként akarod, akkor egy egyszerű ciklussal tudod csatolgatni őket...

Üdv

poord 2017.07.03. 11:05:52

@Office Guru:

Köszönöm szépen! Működik!

Bálintka. 2017.11.07. 14:38:17

Sziasztok. fantasztikus a leírás. Zseniális, mert egy magamfajta hozzá nem értő tag is könnyen megtudta csinálni.
Egy "enter" problémám lenne, illetve "szóköz". Kérdésem.

Az üzenet tartalma több cellából állna. Pl Cells(1, 1) és Cells(1, 2) Szeretném ha egymás alá és egy másik verzióban pedig egymás mellé kerülnének.

Milyen parancssorral fogalmazzam meg?

Érthetőbben:

A1:Bálintka B1:Fázik

.Body = Worksheets("Munka1").Cells(1, 1).Value
?
Worksheets("Munka1").Cells(1, 2).Value

mit írjak a kérdőjel helyére, hogy az eredmény:

Bálintka
Fázik

Illetve mit írjak a kérdőjel helyére, hogy egymás mellé kerüljön:

BálintkaFázik

(direkt írtam egybe, gondolom a szóköz egy harmadik beillesztés lesz, ami a kettő közé kerül " " alakjában.

Bálintka. 2017.11.07. 14:46:05

@Office Guru: Bocsi

A szóköz problémára rájöttem. az az &
és sorba kell írni.

no de mi az új sor parancsa?

Bálintka. 2017.11.07. 16:12:02

Vagy egy táblázat beszúrása
pl a
.Body = Worksheets("Munka1").Range("A1:C3").Select

nem működik. :(