1. Jak wysłać e-mail z VBA Excel?
W tym artykule dowiesz się, w jaki sposób wysyłać e-maile z użyciem VBA w Excelu. VBA ma wiele sposobów na to, wysłać e-mail z Excela przy użyciu Outlooka. W tym artykule przedstawię jeden z nich. W jaki sposób połączyć wysyłkę maili Outlook z VBA w Excelu? Możemy m.in:
- Wysyłać zwykłe maile do odbiorców np znajdujących się w komórkach arkusza
- Możemy wysłać aktualnie obsługiwany plik Excel
- Możemy wysłać dowolny załącznik
- Możemy wysłać e-mail html bezpośrednio z Excel VBA
Jeśli jesteś zainteresowany wysyłaniem e-maila z programu Access, opisywałem to w tym artykule: Mail z Access VBA. Instrukcja wysyłki wiadomości e-mail z Excel VBA opisana jest w punktach zamieszczonych poniżej.
2. Mail z Excel VBA – składnia i instrukcja
Kod służący do wysyłania e-maila z VBA Excel jest stosunkowo prosty. Jedyne, co powinniśmy zrobić, to upewnić się, że mamy prawidłowo skonfigurowany i działający program Outlook. Jeśli tak jest, VBA wyśle maila. Najprostszy kod do wysłania maila za pomocą VBA z Excel wygląda następująco:
'tomaszkenig.pl Sub MailExcelVbaOutlook() Dim OutApp As Object Dim OutMail As Object Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0) With OutMail .To = "example@example.com" 'odbiorca .CC = "" 'odbiorca do wiadomości .BCC = "" 'odbiorca do ukrytej wiadomości .Subject = "Przykładowy temat" 'temat e-maila .Body = "Testowa treść wiadomości" ' treść emaila '.Attachments.Add ("C:\plik.txt") 'jeśli chcemy dodać załącznik .Send 'lub .Display 'informacja o tym, czy chcemy obejrzeć e-mail przed wysłaniem End With Set OutMail = Nothing Set OutApp = Nothing End Sub
Opis kodu, który wypełniamy w edytorze VisualBasic zamieszczam poniżej:
- .To – odbiorca wiadomości. Jeśli chcemy do wiadomości dodać więcej niż jednego adresata, wystarczy wprowadzić adresy e-mail oddzielone średnikiem. np .To = „example@example.com;example2@example2.com”
- .CC – odbiorca do wiadomości
- .BCC – odbiorca do ukrytej wiadomości
- .Subject – temat e-maila, który chcemy wysłać z Outlook
- .Body – Treść e-maila, którą chcemy wysłać
- .Attachments.Add („C:\test.txt”) – opcjonalna ścieżka załącznika, jeśli chcemy wysłać maila z VBA Excel z załącznikiem
- .Send lub Display – informacja o tym, czy chcemy obejrzeć e-mail przed wysłaniem. Send wyśle e-mail automatycznie. Display wyświetli e-mail przed wysłaniem.
3. Mail z VBA Excel – wiele linii tekstu
W jaki sposób rozwiązać problem umieszczenia wielu linii tekstu w mailu wysyłanym z VBA? Kolejne linie tekstu należy oddzielić od siebie elementem vbCrLf oraz znakiem „_”. Znak fraza vbCrLf oznacza przejście do kolejnego wiersza. Znak „_” umożliwia w VBA odczyt kodu zapisanego w wielu liniach. Umieszczanie znaku „_” nie jest konieczne, ale znacząco zwiększa nam czytelność kodu VB. Elementy we wszystkich liniach treści maila łączymy operatorem konkatenacji &. Poniżej przykład programu z takim rozwiązaniem:

'tomaszkenig.pl 'wiele linii tekstu w treści Sub MailExcelVbaOutlook2() Dim OutApp As Object Dim OutMail As Object Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0) With OutMail .To = "example@example.com;example2@example.pl" 'odbiorca .CC = "" 'odbiorca do wiadomości .BCC = "" 'odbiorca do ukrytej wiadomości .Subject = "Przykładowy temat" .Body = "Testowa treść wiadomości" & vbCrLf & _ "Kolejna linia tekstu" & vbCrLf & _ "Kolejna linia tekstu" ' treść emaila '.Attachments.Add ("C:\test.txt") 'jeśli chcemy dodać załącznik .Send 'lub .Display 'informacja o tym, czy chcemy obejrzeć e-mail przed wysłaniem End With Set OutMail = Nothing Set OutApp = Nothing End Sub
4. Jak wysłać e-mail z Outlook automatycznie z użyciem Excel VBA?
Jeśli chcesz wysyłać takie e-maile automatycznie, warto jest do tego wykorzystać kod VBS, który prezentowałem w tym artykule: Automatyczne uruchamianie makra Excel i Access z VBA. Jedyne, co powinieneś zrobić to przygotować pusty plik tekstowy i uzupełnić go poniższym kodem. Uzupełnij w nim jedynie ścieżkę do pliku i nazwę makra. Zapisz plik np jako automat.vbs. Całość możesz podpiąć pod harmonogram zadań. W ten sposób e-maile będą wysyłane automatycznie zgodnie z ustalonym przez Ciebie harmonogramem.
'tomaszkenig.pl Option Explicit on error resume next Dim xlApp, xlBook Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open("D:\NAZWA_PLIKU_EXCEL.xlsm", 0, True) 'Lokalizacja pliku EXcel xlApp.Run "Makro1" 'Nazwa makra do uruchomienia xlBook.Close xlApp.Quit Set xlBook = Nothing Set xlApp = Nothing WScript.Quit

W ten sposób jak widzisz możesz wysłać każdy e-mail z Excel VBA. Plik z omawianym kodem VBA przykładu zamieszczam pod tym linkiem:
excel_vba_mail_z_excel_vba.xlsm
Źródło: Microsoft
Podobne przykłady praktycznego użycia języka VBA w Excelu zamieszczam na tej stronie: VBA Przykłady. Przy okazji zapraszam do przejścia kursu VBA mojego autorstwa, znajdziesz go pod tym linkiem: VBA
17 komentarzy “Wysyłanie e-maila z VBA Excel – Instrukcja”
Dzień dobry Panie Tomaszu,przedstawione przez Pana VBA – permutacje elementów bez powtórzeń, https://tomaszkenig.pl/…/jak-zwrocic-w-vba-permutacje-elem…/ uwzględniają 100% elementów zbiorów, co przy dużej ilości elementów(np.dla 6 z 49 szt.) daje przeogromną ilość rozwiązań. Mając jakąś tam „wizję” zapewne można radykalnie zmniejszyć ilość permutacji wprowadzając pewną( w dowolnej ilości) liczbę ograniczeń. Np. ograniczenie typu by w danej permutacji nie brały udziału np. elementy : n1, n7, n12,… nn by program ” widział je oznaczone np „-1” i je pomijał w tworzonej tablicy. Inne ograniczenie np. by program dobierał nie więcej jak 4 liczby parzyste(4 nieparzyste). Gdzie i jak umieścić w marko takie i podobne ograniczenia. Czy można prosić o podpowiedź? Andrzej.
Witam,
Wysyłanie maili z Excel jest bardzo przydatne.
Dobrze jednak by było aby do tego maila wstawić tabelę z tego Excel’a – bo przecież po to robimy to spod Excel 🙂
Nigdzie jednak nie mogę znaleźć jak to zrobić.
Aby konkretną tabelę / zakres tabeli (skopiowany do schowka przykładowo) wstawić w treść maila (.Body).
Czy może Pan Panie Tomaszu ma jakiś pomysł / wiedzę w tym temacie?
Pozdrawiam,
Ja tez prosze
Cześć!
Jak adaptować podane makro, żeby wysyłać pliki z folderu różnym odbiorcam?
Na przykład :
Folder zawiera 3 plika.
Odbiorca 1 dostaje 1 plik;
Odbiorca 2 dostaje 2 plik i tak daej.
Oprócz tego odbiorcy i dw to kilka różnych osób?
Cześć, do takich zadań polecam aplikację FLOW w Office 365, w VBA za dużo z tym zabawy, a gdy odbiorcy się zmienią musimy poprawiać automat. Jeśli jednak chcesz wybrać do tego zadania VBA, stwórz w tym celu kilka osobnych programów – tak będzie najłatwiej.
czy można wybrać załącznik z odebranego maila?
W VBA Outlook jak najbardziej. Do takich zadań polecam jednak aplikację FLOW w Office 365.
Cześć, czy istnieje możliwość w treści wiadomości dodania ścieżki dostępu do pliku jako hiperłącza?
Jak najbardziej. ścieżka powinna mieć tagi html, email też powinien być w formacie HTML. Można to też zrobić prościej. Jeśli korzystasz z office 365, sprawdź aplikację FLOW
Panie Tomaszu,
W jaki sposob moge uzyc konkretnego szablonu maila, chodzi mi o podanie lokalizacji do pliku *.msg, a nastepnie dodanie do niego zalacznika. Mail musi miec okreslona forme, nie moze wyjsc pusty.
Pytanko jak zmienić ten kod
…
Sub MailExcelVbaOutlook()
Dim OutApp As Object
Dim OutMail As Object
Set OutApp = CreateObject(„Outlook.Application”)
Set OutMail = OutApp.CreateItem(0)
With OutMail
.To = „example@example.com” ’odbiorca
.CC = „” ’odbiorca do wiadomości
.BCC = „” ’odbiorca do ukrytej wiadomości
.Subject = „Przykładowy temat” ’temat e-maila
.Body = „Testowa treść wiadomości” ’ treść emaila
’.Attachments.Add („C:\plik.txt”) 'jeśli chcemy dodać załącznik
.Send ’lub .Display 'informacja o tym, czy chcemy obejrzeć e-mail przed wysłaniem
End With
Set OutMail = Nothing
Set OutApp = Nothing
End Sub
Tak żeby wysłać email z otwartego Arkusza w którym jest makro jaka komendę tu wpisać – zastąpić?
Bo tu wskazujesz konkretny plik a ja bym chciał wysłać ten właśnie otwarty plik jako załącznik
Witam,
Potrzebuje znaleźć kod do następującej czynności:
wysyłanie widomości mailowej automatycznie w akrkusza excel w którym znajdują sie daty upływu badań lekarskich.
Widomość ta miałby być przypomnieniem że np za 30 dni danemu procownikowi kończą się badania I trzeba wystwić skierowanie.
czy do tej czynności konieczne bedzie otwierania pliku I uruchomienie macra czy mail bedzie wysyłał sie automatycznie bez żadnej ingerencji?
Z gory dziękuję za pomoc I odpowiedzi.
Bardzo prosze jeśli jest taka możliwość o odpowiedź na maila: jacek.konik@europoolsystem.com
Pozdrawiam,
Jacek Konik
Witam, skorzystałem z Pana makra i działa super jako jedno z nielicznych, ale w outlook’u mam kilka kont, czy ma Pan może sprawdzony sposób na wysyłanie z konkretnego konta a nie tylko z domyślnego? Znalazłem kilka makr, które to robią ale po uruchomieniu wyskakują błędy.
Jeśli temat aktualny to musiała byś stworzyć tabelę w której napiszesz który odbiorca dostaje który plik. Powyższe makro zapętlić i pobierać z tabeli komu i co wysłać.
np:
A B
1 Kowalski@wp.pl c:\p1.txt
2 Nowak@wp.pl c:\p2.txt
3 Ziel@wp.pl c:\p3.txt
4 us2@wp.pl c:\p2.txt
5 user3@wp.pl c:\p3.txt
…..
W kolumnie A adresy email
w kolumnie B musisz wpisać pełną ścieżkę do plików
Sub email()
k = 1
t = Worksheets(„Arkusz1”).Range(„A” & k).Value
Do While t <> „”
t = Worksheets(„Arkusz1”).Range(„A” & k).Value
Dim OutApp As Object
Dim OutMail As Object
Set OutApp = CreateObject(„Outlook.Application”)
Set OutMail = OutApp.CreateItem(0)
With OutMail
.To = t 'odbiorca
.CC = „” 'odbiorca do wiadomości DW
.BCC = „” 'odbiorca do ukrytej wiadomości UDW
.Subject = ” ” 'temat e-maila
.Body = ” ” ’ treść emaila
.Attachments.Add (Worksheets(„Arkusz1”).Range(„B” & k).Value) 'jeśli chcemy dodać załącznik
.Send 'lub .Display 'informacja o tym, czy chcemy obejrzeć e-mail przed wysłaniem
End With
Set OutMail = Nothing
Set OutApp = Nothing
k = k + 1
Loop
End Sub
Przepraszam że bez deklaracji zmiennych ale to tak na szybko.
Przed wysłaniem zapisz ten plik pod jakąś nazwą:
plik=”c:\nazwa pliku.xlm”
ActiveWorkbook.Saveas(plik)
a potem wpisz nazwę pliku jako załącznik
.Attachments.Add (plik)
Sub MailExcelVbaOutlook()
plik=”c:\nazwa pliku.xlm”
ActiveWorkbook.Saveas(plik)
Dim OutApp As Object
Dim OutMail As Object
Set OutApp = CreateObject(“Outlook.Application”)
Set OutMail = OutApp.CreateItem(0)
With OutMail
.To = “example@example.com” ‘odbiorca
.CC = “” ‘odbiorca do wiadomości
.BCC = “” ‘odbiorca do ukrytej wiadomości
.Subject = “Przykładowy temat” ‘temat e-maila
.Body = “Testowa treść wiadomości” ‘ treść emaila
.Attachments.Add (plik) ‘jeśli chcemy dodać załącznik
.Send ‘lub .Display ‘informacja o tym, czy chcemy obejrzeć e-mail przed wysłaniem
End With
Set OutMail = Nothing
Set OutApp = Nothing
End Sub
Gdy przed wysłaniem chcę obejrzeć generowaną automatycznie wiadomość, używam .Display. Jednak wiadomość zostaje w skrzynce, dopiero ponowne uruchomienie Outlooka(nie jest domyślny) automatycznie wysyła plik. W opcjach zaawansowanych zaznaczone: automatycznie wysyłaj(czy coś takiego). Dlaczego tak się dzieje
Witam,
Po wyświetleniu email musisz nacisnąć przycisk wyślij.
pozdrawiam