VBAで、ExcelからLotusNotesのメールを自動作成する

LotusNotesで送るメールの自動作成

メール作成・送信を自動化するマクロ

職場では、IBMのLotusNotesというグループウェアを使っています。とはいえ、ほとんど活用されていなくて、日常的にはせいぜいメールの送受信ぐらいにしか使われていない。私も、なんとなく非常に高機能なものなんだろうなあとは思いつつ、ほとんど活用していないw

ほとんど単なるメーラーと化しているNotes。全く同じメールを一斉送信するだけならいいんだけど、あっちこっちにちょっとづつ文面や添付ファイルが異なるメールを送らなきゃならん、ということになると非常にメンドクサイ。

「新規文書としてコピー」だかなんだかの機能(すまん、職場にしかNotesがないから確認できん)を使って一部を変えては送信、というやり方も2通や3通ならポチポチできようが、20通とか50通とか100通とかになってくると、もはや拷問のような業務になるし、添付ファイルの取り違えや宛先(メールアドレス)と本文内の宛名が一致しない、なんていうミスも起こりやすくなる。

ただでさえ砂を噛むような苦痛でしかない業務なのに、その上ミスが出て謝りまくるというのはあまりにも精神衛生上よろしくない。

なんとかならないものなのか、とggりまくって見つけたのがコチラのページ。

f:id:akashi_keirin:20170226073412j:plain

コードを引用する。割とあちこちで引用(っていうか転載?)されているので、「VBA ノーツ メール」とかでggったら、一番よくヒットするコードかも知れない。

'「Notesでメールを送信する」
'Excel97でNotes4.6用に作ったものだが、多分 どのバージョンでも動くと思います。

Const EMBED_ATTACHMENT As Integer = 1454                             '……(1)

Public Sub SendNotesMail()
    Dim wkNSes As Object    ' lotus.NOTESSESSION                     '……(2)
    Dim wkNDB As Object     ' lotus.NOTESDATABASE                    '……(3)
    Dim wkNDoc As Object    ' lotus.NOTESDOCUMENT                    '……(4)
    Dim wkNRtItem As Object ' lotus.NOTESRICHTEXTITEM                '……(5)
    Dim wkNAtt As Object    ' lotus.NOTESEMBEDDEDOBJECT              '……(6)
    Dim AttFName As String  ' 添付ファイル名(フルパス)

    ' Notesのセッションを起動する                                    '……(7)
    Set wkNSes = CreateObject("Notes.NotesSession") 
    ' NotesDatabaseオブジェクトを作成し、そのデータベースを開く      '……(8)
    Set wkNDB = wkNSes.GETDATABASE("", "")  
    ' NotesDBをユーザーのメールDBに割り当てた後に開く                '……(9)
    wkNDB.OpenMail

    ' NotesDBに文書を作成し、新規文書をオブジェクト変数にセットする  '……(10)
    Set wkNDoc = wkNDB.CREATEDOCUMENT()
    ' 件名をセットする                                               '……(11)
    wkNDoc.Subject = "テスト(タイトル)"
    ' 宛先をセットする
    wkNDoc.SendTo = Array("belie.kondo@mbh.nifty.com")
    'wkNDoc.CopyTo = Array("xxx@xxx")
    'wkNDoc.blindCopyTo = Array("xxx@xxx")

    ' 文書にリッチテキストアイテムを作成する
    Set wkNRtItem = wkNDoc.CreateRichTextItem("BODY")                '……(12)
    ' 本文をセットする
    With wkNRtItem
        .APPENDTEXT "本文(1行目)"                                 '……(13)
        .ADDNEWLINE 1                                                '……(14)
        .APPENDTEXT "本文(2行目)"                                 
        .ADDNEWLINE 2
        ' 添付ファイル名をセットする
        AttFName = "D:\TEST\Book1.xls"
        ' ファイルを添付する
        Set wkNAtt = .EmbedObject(EMBED_ATTACHMENT ,"" ,AttFName)    '……(15)
        .ADDTAB 1
        .ADDNEWLINE 1
    End With

    ' メールを送信する
    wkNDoc.Send False                                                '……(16)

    ' オブジェクト変数を解放する
    Set wkNAtt = Nothing
    Set wkNRtItem = Nothing
    Set wkNDoc = Nothing
    Set wkNDB = Nothing
    Set wkNSes = Nothing

    MsgBox "メール発信", vbOKOnly + vbInformation
End Sub

'Notesが起動していることが前提。

これを使い始めたきっかけは、

150件以上の宛先に、それぞれ全て異なる添付ファイルを添付してメールを送る

という、アホとしか思えない業務があったからだった。

聞けば、これまでの担当者は、それを休日に職場に出て行って、半日がかりでやっていたらしい。

私は、「バカヤロウ、そんなことができるか! 第一、休日の間に送ったメールでミスがあったら、週明けは苦情電話祭りになるじゃんか……」と思ったので、必死でそんなアホなことに陥らないようにggりまくりましたよ。良かった、インターネッツのある時代で。

まあ、そんなわけで、上掲のコードには非常にお世話になりましたよ。150件超のそれぞれ添付ファイルの異なるメールを、ちゃーんと本文内の宛名もその人に合わせて、10分ほどで送信完了できたわけですからね。

当時は、コードの意味なんてほとんど分からないまま使っていましたが、少しは分かるようになってきているので、確認も兼ねて説明してみよう。所詮素人のやることなので、間違えていたら優しく教えてください。

  • (1)は、後の(15)、EmbedObject関数(?)の引数にするための定数。
  • (2)~(6)では、VBAでNotesの各オブジェクトを操作するために、Notesの各オブジェクトを格納する変数を宣言している。
  • (2)は、Notesのセッションそのもの。……と書いている自分でもいまいち意味がよく分かっていないw
  • (3)は、Notesのデータベース。
  • (4)は、Notesのドキュメント。たぶん、メール全体を指すのだと思う。
  • (5)は、Notesのリッチテキストアイテム。たぶん、メールの中の、本文をはじめとする「目に見えている部分」を表しているのだと思う。
  • (6)は、Notesの埋め込みオブジェクト。たぶん、添付ファイルなどの、メールに埋め込まれるものを表しているのだと思う。

たかがメール1本に、これだけたくさんのオブジェクトが関わっとるんですなあ。

  • (7)では、VBAのCreateObject関数を用いて"Notes.NotesSession"クラスのインスタンスを生成して変数にセットしている。以後、この変数を使ってNotesのセッションを操作できるということ。以下同じ。
  • (8)では、(7)でインスタンス化したNotesSessionクラスのgetDatabaseメソッドを使ってNotesDatabaseクラスのインスタンスを生成し、変数にセットしている。
  • (9)では、(8)でインスタンス化したNotesDatabaseクラスのopenMailメソッドを用いて……何してるんだろ???
  • (10)では、(8)でインスタンス化したNotesDatabaseクラスのcreateDocumentメソッドを用いてNotesDocumentクラスのインスタンスを生成し、変数にせっとしている。
  • (11)以下のところでは、(10)でインスタンス化したNotesDocumentクラスのそれぞれのフィールドに値をセットしている。これはまあ、見たらだいたい初心者でも何やってるかは分かると思う。
  • (12)では、NotesDocumentクラスのcreateRichTextItemメソッドを用いて、NotesRichTextItemクラスのインスタンスを生成し、変数にセットしている。

さあ、いよいよここからがメール本体の部分だ。

  • (13)は、NotesRichTextItemクラスのappendTextメソッド。引数に指定したテキストを本文に追加する。
  • (14)は、NotesRichTextItemクラスのaddNewLineメソッド。引数で指定した行数の新しい行を追加する。
  • (15)は、NotesRichTextItemクラスのembedObjectメソッドを用いて添付ファイルをNotesEmbededObjectクラスのインスタンスとして生成しているのだと思う。そうした上で変数にセットしているのだろう。
  • (16)でメールを送信。

あとは、オブジェクト変数を解放し、メッセージを表示しておしまい、ということ。

このコードには本当に非常にお世話になった。このコードのおかげで何度救われたことか……。

ただ、二つかなり困ることがあった。

  • メールがいきなり送られてしまうこと。
  • 送信履歴が残らないこと。

特に、2点目は困る。仕方がないので、常に自分自身にBCCで送るようにして擬似的に送信履歴が残るようにしていた。ただ、このやり方だと、受信リスト上で選ぶたびに「このメールには非表示の写しが」でんでんうんぬんといちいち出てきてうっとうしいことこの上ない。

それでも辛抱して使い続けていたある日、コチラのページに出会ったのでした。

メールを自動作成し、送信直前の状態で表示するマクロ

f:id:akashi_keirin:20170226073420j:plain

ソースコードも引用しておきます。

'*********************************************************************************
'いきなり送りつけずに、編集状態にする様に改造
'一旦確認してから送ると、送信ボックスに残るメリットあり。
'*********************************************************************************

Public Sub makeNotesMail()
    Dim wkNSes As Object    ' lotus.NOTESSESSION
    Dim wkNDB As Object     ' lotus.NOTESDATABASE
    Dim wkNDoc As Object    ' lotus.NOTESDOCUMENT
    Dim wkNRtItem As Object ' lotus.NOTESRICHTEXTITEM
    Dim wkNAtt As Object    ' lotus.NOTESEMBEDDEDOBJECT
    Dim AttFName As String  ' 添付ファイル名(フルパス)
    '追加
    Dim ws As Object 'NotesUIWorkspace
    Dim uidoc As Object
    
    ' Notesのセッションを起動する
    Set wkNSes = CreateObject("Notes.NotesSession")
    '追加
    Set ws = CreateObject("Notes.NotesUIWorkspace")
    
    ' NotesDatabaseオブジェクトを作成し、そのデータベースを開く
    Set wkNDB = wkNSes.GETDATABASE("", "")
    ' NotesDBをユーザーのメールDBに割り当てた後に開く
    wkNDB.OpenMail

    ' NotesDBに文書を作成し、新規文書をオブジェクト変数にセットする
    Set wkNDoc = wkNDB.CREATEDOCUMENT()
    ' 件名をセットする
    wkNDoc.Subject = "テスト(タイトル)"
    ' 宛先をセットする
    wkNDoc.SendTo = Array("abc@def.ghi.com")
    'wkNDoc.CopyTo = Array("xxx@xxx")
    'wkNDoc.blindCopyTo = Array("xxx@xxx")

    ' 文書にリッチテキストアイテムを作成する
    Set wkNRtItem = wkNDoc.CreateRichTextItem("BODY")
    ' 本文をセットする
    ' VBAでやる場合は、普通に文字列bufとかに、vbCrLfを介して文字を入れてやって
    ' wkNRtItem.APPENDTEXT buf で一丁上がり
    
    With wkNRtItem
        .APPENDTEXT "本文(1行目)"
        .ADDNEWLINE 1
        .APPENDTEXT "本文(2行目)"
        .ADDNEWLINE 2
        ' 添付ファイル名をセットする
        AttFName = getDesktopPath & "\Book1.xlsx"
        ' ファイルを添付する
        Set wkNAtt = .EmbedObject(EMBED_ATTACHMENT, "", AttFName)
        .ADDTAB 1
        .ADDNEWLINE 1
    End With
    ' メールを保存する。これをやらないとRichItemの編集が表示されない  '……(*)
    wkNDoc.Save False, False
    ' メールを編集状態にする
    Set uidoc = ws.EDITDOCUMENT(True, wkNDoc, False)

    ' オブジェクト変数を解放する
    Set wkNAtt = Nothing
    Set wkNRtItem = Nothing
    Set wkNDoc = Nothing
    Set uidoc = Nothing
    Set wkNDB = Nothing
    Set wkNSes = Nothing
    Set ws = Nothing

End Sub

ポイントは(*)のところ。何と、たったこれだけで、送信直前の状態で画面表示されます。

しかも、Notesの側で送信アイコンをクリックして送信するので、ちゃんと送信履歴に残るし、(*)の時点でドラフトに保存されているから、送信せずに閉じてもちゃんと残っている。

これは素晴らしい!!!!!!!!!!!

……というわけで、私は、上記2つのコードを参考に、

f:id:akashi_keirin:20170226073430j:plain

f:id:akashi_keirin:20170226073437j:plain

f:id:akashi_keirin:20170226073445j:plain

Excelでご覧のようなシートを作成し、メールを自動作成するマクロを作って大いに活用しています。

そのマクロは、また折を見てご紹介します。今日はもうここまででかなり長くなってしまったので……。

コチラもどうぞ!

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com

@akashi_keirin on Twitter