パソコンスキルの教科書

パソコンスキルの教科書

東京大学大学院卒。博士課程に進学を志すも、担当教授と折が合わず、無職になる。医者を目指すも結局断念。田舎で派遣社員として働く。「スキルがなければ、仕事ももらえない」と悟り、ビジネススキルを学ぶ。プログラミング、英語を学び、一部上場企業へ転職。年間100時間以上の業務効率化を行い、社内講師に抜擢。海外の案件を担当し、数億円のプロジェクトに携わる。個人の事業でも、月売上100万を達成。現在は、自分の価値を高めるためのスキル向上支援を行う

VBAでGmail送信!CDOを活用してメールを操作する方法

VBAを使えば、Gmailを操作してメールを自動送信することができます。この方法を使えば、Outlookがなくても、エクセルから自動でメールを送ることができます。

たとえば、プログラムを設定しておけば、ボタン一つでメールを送ることができます。

f:id:gene320:20171125010615p:plain

ここでは、VBAを使ってGmailを送る方法を紹介します。基本操作から、メール書式変更やリンクを付ける方法といった上級テクニックまで解説します。

CDOを活用してVBAでGmailのメールを送信!準備しておくこと

エクセルVBAを使ってGmailを送信する前に準備しておくことがあります。

準備|Gmailセキュリティ「安定性の低いアプリを許可」を有効に

事前準備として、送信に使いたいGmailアドレスについて、「安定性の低いアプリを許可」を有効にしておく必要があります。

設定方法は、こちらのサイトから、Gmailセキュリティを「安定性の低いアプリを許可」を有効にしておきます。

このとき、送信に使いたいGmailアドレスでログインをしておく必要がありますので、注意してください。

f:id:gene320:20171122234332p:plain

上記の部分をクリックすると、以下のように変更されます。

f:id:gene320:20171122234405p:plain

もしかすると、「安定性の低いアプリを許可」と聞くと、不安に思うかもしれません。しかし、私がこれまで数年使ってきましたが、これといった不具合はありません。

「安定性の低いアプリを許可」しても問題なく利用できるはずです。これでメールを送る準備整いました。

VBAからGmailでメールを新規作成して送信!コードを徹底解説

ここからは、VBAを使ってGmailを操作して、メールを送信するプログラムを紹介します。

サンプルコードはこちら!コピペして活用しよう

Option Explicit
Sub Gmail_send_textmail()
    
    '''コード1|変数設定
    Dim cdoMsg, cdoconf As Object
    Dim strbody, kenmei, honbun, credit, tenpu As String
    Dim cdoFlds As Variant
    Dim k As Long
    
    '''コード2|CDOを利用して作成
    Set cdoMsg = CreateObject("CDO.Message")
    Set cdoconf = CreateObject("CDO.Configuration")
    
    cdoconf.Load -1
    
    With cdoconf.Fields
        .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com"
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = "465"
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = True
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
        .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = Range("D2").Value
        .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = Range("D3").Value
        .Update
    End With
    
    '''コード3|重要度を変更
    cdoMsg.Fields.Item("urn:schemas:mailheader:X-Priority") = 1
    cdoMsg.Fields.Update
    
    '''コード4|複数の添付ファイル
    For k = 13 To 15
        If Range("D" & k).Value <> "" Then
            tenpu = Range("D" & k).Value
            cdoMsg.AddAttachment tenpu
        Else
            Exit For
        End If
    Next

    If tenpu <> "" Then
        tenpu = Right(tenpu, Len(tenpu) - 1)
    End If

    '''コード5|件名、本文、署名の設定
    kenmei = Range("D10").Value
    strbody = Range("D11").Value
    credit = Range("D12").Value
    
    With cdoMsg
        Set .Configuration = cdoconf
        .From = Range("D5").Value
        .To = Range("D6").Value
        .CC = Range("D7").Value
        .BCC = Range("D8").Value
        .MDNRequested = True
        .subject = kenmei
        .TextBody = strbody
        .send
    End With

    '''コード6|送信日時を取得
    Range("D16").Value = Now

End Sub

それでは、コードを解説していきます。

コード1|変数設定

Option Explicit
Sub Gmail_send_textmail()
    
    '''コード1|変数設定
    Dim cdoMsg, cdoconf As Object
    Dim strbody, kenmei, honbun, credit, tenpu As String
    Dim cdoFlds As Variant
    Dim k As Long

ここは、変数の設定です。とくに解説する部分はありません。

コード2|CDOを利用して作成

    '''コード2|CDOを利用して作成
    Set cdoMsg = CreateObject("CDO.Message")
    Set cdoconf = CreateObject("CDO.Configuration")
    
    cdoconf.Load -1
    
    With cdoconf.Fields
        .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com"
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = "465"
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = True
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
        .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = Range("D2").Value
        .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = Range("D3").Value
        .Update
    End With

セルD2にGmailのUserID
セルD3にGmailのパスワード
この2つは、あなたが使うGmailの設定を入力しておきます。

f:id:gene320:20171125001218p:plain

コード2では、CDOを利用して、Gmailを送信できるように設定をします。セルD2とD3以外は、上記の設定を変更する必要はありません。

なお、設定そのものは、おまじないのようなものなので、メールを送りたいだけなら、覚える必要はありません。

コード3|重要度を変更

    '''コード3|重要度を変更
    cdoMsg.Fields.Item("urn:schemas:mailheader:X-Priority") = 1
    cdoMsg.Fields.Update

重要度は、上記の設定を行えば、設定可能です。

コード4|複数の添付ファイル

    '''コード4|複数の添付ファイル
    For k = 13 To 15
        If Range("D" & k).Value <> "" Then
            tenpu = Range("D" & k).Value
            cdoMsg.AddAttachment tenpu
        Else
            Exit For
        End If
    Next

    If tenpu <> "" Then
        tenpu = Right(tenpu, Len(tenpu) - 1)
    End If

このプログラムでは、以下の画像のとおり

f:id:gene320:20171125010655p:plain

セルD13~D15までに添付ファイルのファイルパスを入力します。

ファイルパスとは、以下の手順で確認できます。
[1] ファイルを右クリック
[2] プロパティをクリック
[3] セキュリティタブをクリック
[4] オブジェクト名 ←これが、ファイルパスを指しています。

f:id:gene320:20171125001804p:plain

f:id:gene320:20171125002242p:plain

このプログラムでは、最大3つまでファイルを添付できるようにしています。なお、すべて空欄の場合は、ファイルは添付されません。

コード5|件名、本文、署名の設定

    '''コード5|件名、本文、署名の設定
    kenmei = Range("D10").Value
    strbody = Range("D11").Value
    credit = Range("D12").Value
    
    With cdoMsg
        Set .Configuration = cdoconf
        .From = Range("D5").Value
        .To = Range("D6").Value
        .CC = Range("D7").Value
        .BCC = Range("D8").Value
        .MDNRequested = True
        .subject = kenmei
        .TextBody = strbody
        .send
    End With

セルD5:メールの送信元
セルD6:メールの宛先(To)
セルD7:メールの宛先(CC)
セルD8:メールの宛先(BCC)

セルD10:メールの件名
セルD11:メールの本文
セルD12:署名

f:id:gene320:20171125002432p:plain

cc、bccは空欄でもメール送信可能です。

12行目以降について、説明すると、
12行目の.MDNRequested = True は、開封通知
13行目の.TextBody は、メール本文をテキスト型で作成するという意味です。テキスト型なので、文字装飾ができません。文字装飾とは、赤文字にしたり、フォントサイズを変更したりです。
14行目の.send は、メール送信

コード6|送信日時を取得

    '''コード6|送信日時を取得
    Range("D16").Value = Now

セルD8に送信日時を出力します。現在時刻を取得することで、送信時刻をみなしています。

メールの書式設定、書式変更(フォント、サイズ、文字の色)をしたいなら

Option Explicit
Sub Gmail_send_htmlmail()
    
    '''コード1|変数設定
    Dim cdoMsg, cdoconf As Object
    Dim strbody, kenmei, honbun, credit, tenpu As String
    Dim cdoFlds As Variant
    Dim k As Long
    
    '''コード2|CDOを利用して作成
    Set cdoMsg = CreateObject("CDO.Message")
    Set cdoconf = CreateObject("CDO.Configuration")
    
    cdoconf.Load -1
    
    With cdoconf.Fields
        .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com"
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = "465"
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = True
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
        .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = Range("D2").Value
        .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = Range("D3").Value
        .Update
    End With
    
    '''コード3|重要度を変更
    cdoMsg.Fields.Item("urn:schemas:mailheader:X-Priority") = 1
    cdoMsg.Fields.Update
    
    '''コード4|複数の添付ファイル
    For k = 13 To 15
        If Range("D" & k).Value <> "" Then
            tenpu = Range("D" & k).Value
            cdoMsg.AddAttachment tenpu
        Else
            Exit For
        End If
    Next

    If tenpu <> "" Then
        tenpu = Right(tenpu, Len(tenpu) - 1)
    End If

    '''コード5|件名、本文、署名の設定
    kenmei = Range("D10").Value ' 件名作成
    strbody = Replace(Range("D21").Value, vbLf, "<br>") ' メール本文作成
    credit = Range("D12").Value ' メール本文作成
    
    With cdoMsg
        Set .Configuration = cdoconf
        .From = Range("D5").Value
        .To = Range("D18").Value & "," & Range("D19").Value & "," & Range("D20").Value
        .CC = Range("D7").Value
        .BCC = Range("D8").Value
        .MDNRequested = True
        .subject = kenmei
        .htmlbody = strbody
        .send
    End With

    '''コード6|送信日時を取得
    Range("D16").Value = Now

End Sub

コード5でHTMLメールに設定する

メールの書式設定は、コード5の部分だけが、影響するので、コード5だけを解説します。

    '''コード5|件名、本文、署名の設定
    kenmei = Range("D10").Value ' 件名作成
    strbody = Replace(Range("D21").Value, vbLf, "<br>") ' メール本文作成
    credit = Range("D12").Value ' メール本文作成
    
    With cdoMsg
        Set .Configuration = cdoconf
        .From = Range("D5").Value
        .To = Range("D18").Value & "," & Range("D19").Value & "," & Range("D20").Value
        .CC = Range("D7").Value
        .BCC = Range("D8").Value
        .MDNRequested = True
        .subject = kenmei
        .htmlbody = strbody
        .send
    End With

メールの書式設定は、14行目のhtmlbodyにするのがコツです。これでメールがHTMLを認識してくれます。

f:id:gene320:20171125003653p:plain

HTMLメールを利用すると、ハイパーリンク、フォント変更などの装飾が可能になります。それでは、詳しくみていきます。

本文の中にハイパーリンク設定

ハイパーリンクを設定したい文章に以下のように a hrefを使います。たとえば、ここでは、以下のようにhtmlを書くと、

f:id:gene320:20171125003757p:plain

メールでは、以下のように表示されます。

f:id:gene320:20171125003935p:plain

メール本文を改行する

このプログラムではセルD21の文章をメール本文に設定しています。

しかし、htmlメールにすると、セル内の改行を認識してくれなくなります。何も処理をせずにメールを作成すると、以下のようになってしまいます。

f:id:gene320:20171125004359p:plain

そこで、セル内の改行を認識させるように
を差し込むプログラムを入れます。

3行目:strbody = Replace(Range("D21").Value, vbLf, "<br>") 

とすると、エクセル内の改行をhtmlの改行コード< br >に変更してくれます。

HTMLメールでは、< br >が改行を表すため これでメールが改行されるようになります。

f:id:gene320:20171125004449p:plain

複数の宛先に送る方法

9行目:.To = Range("D18").Value & "," & Range("D19").Value & "," & Range("D20").Value

のように , でつないでやると複数の宛先にメール送信できます。

必要であれば for~nextを入れて、宛先を自動で増減させることも可能です。

f:id:gene320:20171125004645p:plain

文字種類、文字サイズ、色の変更

セルD21にhtmlを利用して、文字の種類、文字サイズ、色を変更できます。

たとえば、以下の文章をセルD21に記入します。

f:id:gene320:20171125010030p:plain

と記載すると、メールでは以下のように表示されます。

f:id:gene320:20171125010204p:plain

CDOを活用してVBAからメール送信!サンプルコードのダウンロードはこちら

今後、要望に応じてエクセルのサンプルコードをダウンロードできるようにします。

OutlookやGmailを操作する方法について知りたいなら

この記事では、Gmailのメール送信の方法を解説しました。しかし、OutlookでもVBAを使ってメール送信が可能です。

こちらの記事で詳しく解説していますので、合わせて読んでみて下さい。

www.fastclassinfo.com

Outlookメールの場合、VBAで時間指定して送信することも可能です。

www.fastclassinfo.com

また、OutlookやGmailで受信したメールをエクセルに一覧にする方法もあります。それは、こちらの記事で紹介しています。

www.fastclassinfo.com

www.fastclassinfo.com

ぜひ読んでみてください。

自分にはレベルが高い…と感じたなら、まずは基礎から学ぼう!

この記事を読んだけど、「よくわからない」、「自分で編集できそうにない」と感じるかもしれません。

もし、そう感じる場合は、基礎を完全に理解できていない可能性があります。マクロの基礎を理解していない場合、メール操作はかなりハードルが高いです。

そのため、「ちょっと自信がないな…」と感じるなら、まずはエクセルマクロの基礎から学ぶことをオススメします。

土台ができていない内に学ぶと、使いこなせるようになる前に挫折にしてしまいます。

もしきちんと学ぶなら、こちらの無料動画がオススメです。基礎を確実に学んでから、トライしてみてください。

この記事を読んだ方へのオススメ

「マクロの力を実感したい」と感じているなら、こちらの記事がオススメです。マクロが入ったエクセルファイルをダウンロードできるようにしています。もし詳細が知りたいなら、以下の記事で紹介していますので、合わせて読んでみてください。

サンプル1|月末処理の自動処理する
サンプル2|エクセルで在庫管理するマクロ
サンプル3|outlookのメールを自動送信する
サンプル4|outlookの受信メールをエクセルに一覧にして、添付ファイルも保管する
サンプル5|エクセルマクロVBAで大量データを比較・照合してマッチングする方法
サンプル6|ヤフオクの情報を自動取得して、エクセルに出力する
サンプル7|エクセルの情報をワードに差し込み、印刷まで行う

ぜひご活用ください。

エクセルマクロでできることを知りたいなら

www.fastclassinfo.com

エクセルマクロを独学で習得したいなら

www.fastclassinfo.com

エクセルマクロとは?もっと詳しく知りたいなら

www.fastclassinfo.com

エクセルマクロの難易度や習得までの期間を知りたいなら

www.fastclassinfo.com