Wysyłanie maila z Excela przy użyciu VBA. cz1

Na początku muszę powiedzieć, że jest kilka sposobów wysyłania maili z poziomu VBA.

Tutaj omówimy 2:

  • Pierwszy to użycie mechanizmu Excela i domyślnego klienta pocztowego.
    Minusem tego rozwiązania jest to, że mail który wysyłamy jest zawsze z załącznikiem ( w tym załączniku jest jakiś plik Excela). I niestety nie można dodać treści maila
  • Drugim sposobem jest wywołanie odpowiedniego polecenia Windowsa za pomocą VBA.
    Tutaj niestety nie wyślemy załącznika, ale za to mamy wpływ na treść i temat
  • Sposób trzeci to użycie programu MS Outlook.
    Tym sposobem możemy zrobić wszystko, a minusem jest niestety posiadanie takowego programu.

W tym poście zajmiemy się pierwszymi dwoma

Przykład 1.
Chcemy napisać makro, który wyśle nam cały plik pod konkretny adres mailowy.

Sprawa jest prosta, wystarczy napisać:

Call ThisWorkbook.SendMail("jakis_adres@gmail.com", "Bardzo ważny plik")

Powyższy kod wysyła maila pod wskazany adres o temacie „Bardzo ważny plik”.
Treść maila jest pusta, a w załączniku znajduje się plik w którym jest napisane makro.

Jeśli chcemy wysłać inny plik, to:

Call ActiveWorkbook.SendMail("jakis_adres@gmail.com", "Bardzo ważny plik")

ten kod wyśle aktywny skoroszyt (plik)

a ten kod wyśle plik o nazwie Warszawa.xls pod wskazany adres:

Call Workbooks("Warszawa.xls").SendMail("jakis_adres@gmail.com", "Bardzo ważny plik")

Uwaga, aby odwołać się do skoroszytu poprzez obiekt Workbook plik musi być wcześniej otwarty, a po wysłaniu najlepiej go zamknąć.

Call Workbooks.Open("C:\Warszawa.xls")
Call Workbooks("Warszawa.xls").SendMail("jakis_adres@gmail.com", "Bardzo ważny plik")
Call Workbooks("Warszawa.xls").Close(false)

Parametr

false

metody Close mówi, żeby nie zapisywać zmian.

true

wymusiłoby zapisanie zmian
A metoda bez argumentu sprawi, że Excel zapyta użytkownika czy zapisać zmiany.

Przykład 2.
Wysyłamy jeden arkusz na adres „jakis_adres@gmail.com”

Przyjmijmy, że arkusz do wysłania nosi nazwę kalkulator i znajduje się on w pliku Warszawa.xls który to plik jest otwarty.
W tym przypadku musimy skopiować arkusz „kalkulator” do nowego pliku.
Wysłać mailem nowy plik
zamknąć nowy plik bez zapisywania
dim nazwaPliku as String
nazwaPliku = „Warszawa.xls”

Call Workbooks(nazwaPliku).Sheets("kalkulator").Copy   ' kopiuje arkusz kalkulator do nowego skoroszytu (nie posiada on jeszcze nazwy)
Call ActiveWorkbook.SendMail("jakis_adres@gmail.com", "Wysyłam Arkusz")  'aktywny skoroszyt wysyłamy mailem. (aktywnym arkuszem jest nasz nowo utworzony)
Call ActiveWorkbook.Close(false)                       ' zamykamy nowy skoroszyt bez zapisywania zmian

Przykład 3.
Tak jak w przykładzie 2, ale chcemy, żeby plik nazywał się „raport.xls”

Musimy zapisać plik na dysku. (Użyję do tego katalogu C:\tmp\)
wysłać maila
skasować plik

dim nazwaPliku as String
dim plikTmp as string

nazwaPliku = "Warszawa.xls"
plikTmp = "C:\tmp\raport.xls"

Call Workbooks(nazwaPliku).Sheets("kalkulator").Copy
Call ActiveWorkbook.saveAs (plikTmp)     ' zapisujemy plik pod daną nazwą
Call ActiveWorkbook.SendMail("jakis_adres@gmail.com", "Wysyłam Arkusz")
Call ActiveWorkbook.Close(false)
Call kill (plikTmp)                      ' usunięcie pliku

Przykład 4.
Wysyłanie maila bez załącznika

Na górze modułu umieszczamy import z biblioteki shell32.dll
Dokumentację tej funkcji możecie znaleźć tutaj ShellExecute

Private Declare Function uruchomPolecenie Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, _
        ByVal lpFile As String, ByVal lpParameters As String, _
        ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Korzystamy z mechanizmu, który został wymyślony w celu łatwego umieszczenia hiperłącza do wysłania maila.

uruchomPolecenie (0, "Open", _
   "mailto:adres@gdziestam.pl?Subject=Ważny mail&Body=To jest treść%0aNie ma załącznika", _
   &O0, &O0, 2)

%0a to kod ASCII nr 10, który umieści zrobi nam enter(linuksowy) w miejscu gdzie go urzyjemy
czyli „Nie ma załącznika” wyświetli się w drugiej linii

Tworzymy również raporty w Power BI.
Jeśli jesteś zainteresowany pracą u nas to poszukujemy osoby na stanowisko Power BI – Młodszy programista/developer Business Intelligence