niedziela, 16 czerwca 2013

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

Pierwszy merytoryczny post:)

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ć:


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:

ten kod wyśle aktywny skoroszyt (plik)

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

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


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

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


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


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

%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

7 komentarzy:

  1. witam,
    a co z dynamiczną listą adresów e-mail?
    Tzn. w excelu dzisiaj mam 10 nazwisk i na nie wysylam maila, a jutro mam tych nazwisk tylko 8.
    Po nazwisku w w drugiej kolumnie mam adres mailowy.
    Da się? :-)

    OdpowiedzUsuń
  2. Cześć!
    Oczywiście da się. Zakładam, że chcesz do każdej osoby wysłać oddzielnego maila.
    Powiedzmy, że w kolumnie A są maile od A1 do A20 (lub A245333)

    procedura poniżej:

    sub wyslijDoWszystkich
    dim x as long
    x = 1
    While cells(x,1) <> ""
    Call ActiveWorkbook.SendMail(cells(x,1), "Temat") ' albo jakiś inny sposób wysyłki
    x = x + 1
    wend
    end sub

    OdpowiedzUsuń
  3. Dziekuje za pomoc :-)
    Sprawdze jak to działa.

    OdpowiedzUsuń
  4. Cześć, polecenie SendMail wysyła automatycznie maila z Outlooka nie dając możliwości poprawienia go, bądź dopisania treści czy czegokolwiek. Czego zatem uzyć, aby przygotował maile, ale nie wysyłał z automatu? Czy jest to może kwestia ustawień Outlooka 2013?
    Obecnie robi to u mnie:
    AdresEmail = Range("A2").Value 'Na jaki adres wysłany mail
    Application.DisplayAlerts = True
    Temat = "Problem z odczytem kodu [WAŻNE]" 'Tytuł mejla
    'ActiveWorkbook.SendMail Recipients:=AdresEmail, Subject:=Temat

    Pozdrawiam, Ania

    OdpowiedzUsuń
  5. Cześć!

    Jeśli masz Outlooka i potrzebujesz przygotować maila do wysyłki, to możesz użyć poniższego kodu:
    Sub wyslijOutlookiem()

    Dim outlook
    Dim mail
    Set outlook = CreateObject("Outlook.Application")
    Set mail = outlook.createItem(0)

    mail.to = "piotrmarczewski@gmail.com"
    ' mail.cc = "pole kopia do"
    ' mail.bcc = "pole ukryta kopia do"

    mail.Subject = "Przykładowy temat"
    mail.htmlbody = "treść maila"
    mail.display ' wyświetl maila

    Set mail = Nothing
    Set outlook = Nothing

    End Sub

    OdpowiedzUsuń
  6. Cześć, super to rozpisałeś , ale mam jeszcze pytanie co zrobić kiedy każdy arkusz z danego pliku ma być wysłany na inny adres mail? Przykładowo Arkusz1 na adres mail1@mail.pl; Arkusz2 na adres mail2@@mail.pl, itd

    OdpowiedzUsuń
  7. czesc, mam pytanie, jezeli chce wyslac maila z komorkami excela A1,H10 jakie ma byc .body?

    OdpowiedzUsuń