Wysyłanie e-maila z VBA Excel – Instrukcja 17


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:

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:

Excel VBA - e-mail z Excel VBA

Excel VBA – e-mail z Excel VBA


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.

Excel VBA - Wysyłanie e-maila z VBA Excel z wieloma liniami tekstu

Excel VBA – Wysyłanie e-maila z VBA Excel z wieloma liniami tekstu

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


Dodaj komentarz

Twój adres email nie zostanie opublikowany.

17 komentarzy do “Wysyłanie e-maila z VBA Excel – Instrukcja

  • AnOrl

    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.

  • Pitusi

    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,

  • Kasia

    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?

     

    • Tomasz Kenig Autor wpisu

      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.

    • Tomasz Kenig Autor wpisu

      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

  • szablon maila

    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.

     

     

  • dl-_-lb

    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

  • Jacek konik

    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

  • Artur

    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.

     

  • Artur

    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.

  • Artur

    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

  • Anonim

    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