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