初心者のためのExcelマクロ超入門(絶対できるVBA開発)

マクロがまったくわからない人のためにエクセルマクロやVBAについてできるだけわかりやすく書いています。Twitter:@shuhhohhey

メールを送信する-上級者のためのExcel エクセルマクロVBA

f:id:drumer2sh:20140521112635j:plain

え?エクセルからメールも送れるの?

今回は上級者用です。少なくともメールが送られるざっくりとした仕組みくらいは理解している前提でブログを進めます。っていうかここでSMTPとかPOP3とかメールヘッダがどうだのメールサーバがどうだのいうと、エクセルとは全く違ったお話になりますので、今回はこのあたりの仕組みもちゃんと理解しているという前提。初心者置き去りですが、そんな回もまぁ、あるさね。

メールを送るためのVBA側の処理

今回はメーラーが立ち上がってメールが送れるではなく、エクセルそのものがメールを送ります。エクセルでメールを送るにはいくつか方法があるのですが、今回はCDOを使ってメールを送る方法を紹介します。実はもう1つBASP21というDLLがありそれを使ってもメール送信は可能ですが、それはまたの機会に。

CDOMicrosoft Collaboration Data Objects)


参考となるMicrosoftのページです。

http://msdn.microsoft.com/ja-jp/library/cc420644.aspx
http://msdn.microsoft.com/ja-jp/library/ms978698.aspx

このページのCDOの概要にはこうあります。

CDOの概要
Collaboration Data Objectsは、Microsoft Windows(r)製品群に組み込まれている電子メール システムに簡単にアクセスできるようにする上位レベルのCOMオブジェクトのセットです。

まぁ、要するにメール送信するためのメソッドやプロパティを持ったオブジェクトのセットですよ。ってことです。このオブジェクトのセットっというのは、いくつかのオブジェクトをまとめたもの。という意味です。どんなオブジェクトが入っているかというと。。

  • Session
  • MessageCollection
  • Message
  • InboxFolder
  • OutBoxFolder

などがあるようです。

CDOオブジェクトセットのインストール


は、特に説明しません。なぜなら、大体最初から入っているからです。よっぽどのことがない限り手動でインストールすることはないと思ってください。

CDOの使い方

では、いよいよ使い方です。使い方は2通りあります。参照設定を行う方法とオブジェクトを直接バインディングする方法です。今回はオブジェクトをバインディングする方法を紹介します。
上級編なのでいきなりコード。

Public Type MailSendingConfig
    SMTPServer As String
    SMTPPort As Integer
End Type

Public Type MailSendInfo
    From As String
    ToCSV As String
    subject As String
    text As String
End Type

Public Function SendMail(ByRef shcemaInfo As MailSchemaInfo, _
                         ByRef sendInfo As MailSendInfo)

    Dim objMail As Object
    Set objMaii = CreateObject("CDO.Message")
    
    Dim cdoConfigPrefix As String
    cdoConfigPrefix = "http://schemas.microsoft.com/cdo/configuration/"

    // メール送信設定を行う。
    With objMail
        .From = sendInfo.From
        .To = sendInfo.ToCSV
        .Cc = ""
        .Bcc = ""
        .subject = sendInfo.subject
        .TextBody = Replace(sendInfo.text, vbLf, vbCrLf)
        .TextBody = Replace(.TextBody, vbCr, vbCrLf)
        .TextBodyPart.Charset = "ISO-2022-JP"
        .Configuration.Fields.Item(cdoConfigPrefix & "sendusing") = 2
        .Configuration.Fields.Item(cdoConfigPrefix & "smtpconnectiontimeout") = 30
        .Configuration.Fields.Item(cdoConfigPrefix & "smtpserver") = shcemaInfo.SMTPServer
        .Configuration.Fields.Item(cdoConfigPrefix & "smtpserverport") = shcemaInfo.SMTPPort
    End With
    
    // 設定をバインド
    Call objMail.Configuration.Fields.Update

    // メール送信
    Call objMail.Send

End Function

これで送信メソッドは完成です。With Mailの中で送信に必要なプロパティを設定しています。後はバインドして、Sendメソッドを実行するだけです。このメソッドを呼ぶ側で、MailSendingConfigとMailSendInfoの変数を宣言し、必要な情報を入れて、SendMailメソッドを実行するだけです。

簡単ですね。エクセル内のセルの内容を送るので、LF改行コードをCRLF改行コードに変換したりもしています。CCやBCCが必要な場合もここに値を入れるだけです。

CDOのMessageオブジェクト


CDOのMessageオブジェクトはメールを送信や受信するためのオブジェクトです。各種プロパティとメソッドについては、マニュアルとか見てもらえればいいですが、smtp系のサーバー名やポート番号、タイムアウトの秒数、sendusingなどは知っておくといいと思います。ちなみにsendusingについては英語ですが、

http://msdn.microsoft.com/en-us/library/ms873037(v=exchg.65).aspx

に説明があり、参照設定をしていると、このページにある定数が使えます。まぁSMTPでポート指定で送るので通常は2です。


今日はここまで!

かしこ