【Outlook VBA】メール本文から欲しい情報だけを取り出す方法


outlook,メール本文,アイキャッチ

皆様こんにちは、ノグチです。

日々のお仕事に欠かせない、メール。

連絡手段として便利なツールですが、送られる方の日々の業務負担になっていたりすることもあります。

例えば、日々の業務内容と作業時間をメールで報告する、所謂日報、というもの。

この日報の中で勤務開始時間と終了時間を書いて上長に送っているのに、更に勤務表が存在していることが少なくありません。

上長はこの日報と、部下から提出された勤務表を突き合せて勤務表の承認をするなど、業務の負荷になっていることがあるようです。

日報として送信するメールはフォーマットが決まっていることが多いので、フォーマットに従って、見たい情報だけを取り出して、例えばエクセルのシートに書き出すことができれば、確認作業が楽になるかもしれません。

ということで今回は、決まったフォーマットで書かれたOutlookのメール本文から、欲しい文字を取り出す方法をご紹介します!
スポンサーリンク

MailItemオブジェクトのおさらい

さて、メールを操作するには、MailItemオブジェクトを取得する必要があることは以前の記事でお伝えしました。

エクセルVBAでOutlookメールの下書きを作成・表示して送信前に内容チェックする
OutlookのMailItemオブジェクトのDisplayメソッドを使って、VBAで作成したOutlookのメール内容を、メール送信前にチェックする方法をご紹介しています。「VBAでメールを作成するのは便利だけど、内容をチェックしないでメール送信してしまうのは心配...」という方にお勧めです。

メールの本文は、MailItemオブジェクトのBodyプロパティで取得することができるので、メール本文にあった取得方法をコーディングすれば、欲しい情報がメール本文から取り出せるという訳です。

では早速、今ウインドウで開いているメール本文から、欲しい情報を取り出してみましょう!

ちなみに、今開いているメールのウインドウ操作については、下記記事で紹介していますので、併せてご覧くださいね。

【Outlook VBA】今開いているOutlookウインドウを操作しよう!Inspectorオブジェクトの取得
Outlook vbaで、メールの添付ファイルをワンクリックで指定フォルダに保存する方法を複数回記事にわたってご紹介していきます。今回は、ActiveInspectionメソッドで、今開いているOutlookウインドウのInspectorオブジェクトを取得する方法をご紹介しています。

メール本文から目的の情報を取り出してみる

BodyプロパティとMid関数で欲しい情報を取り出す

例えば、下のメールから、作業時間だけを取り出したいとします。

outlook,vba,メール本文,メール

このメールの本文である、MailItemオブジェクトのBodyプロパティを、VBEのウォッチ式で覗いてみると、こんな感じになっています。

outlook,vbe,デバッグ,bodyプロパティ

一見すると1行目と2行目の間にスペースが入っているように見えますが、メール本文上で改行していますので、このスペースには改行コードの「vbCrLf」が存在しています。

“【作業時間】13:00~16:00vbCrLf【作業時間計】5HvbCrLf【作業内容】xxxxxxxxxxxxxxxxxxxxxxxx”

こんな風に書かれているイメージです。

なので、メール本文の作業時間だけを取り出したいならば、メールの先頭から「【作業時間】」の6文字を除いた7文字目から、最初の改行コードまでを取り出せばOK。

コードはこんな風に記述できます。

Mid(MailItemオブジェクト.Body, Len("【作業時間】") + 1, Instr(MailItemオブジェクト.Body, vbCrLf) - Len("【作業時間】") + 1)

Mid関数を使って、メール本文の7文字目から改行コードのある文字列までを取得しています。

メールから欲しい情報を取り出す為のコードのメイン部分はこれだけです。

メール本文から目的の情報を取り出すコード

試しに取得した内容を、メッセージで表示してみましょう。

全体はこんな感じのコードになります。

今開いているメールの、【作業時間】という文字列の次の文字から改行コードまでをの文字列を取得して、メッセージ表示するというものです。

Sub Get_MailBody()
Dim objItem As Object
Dim objIns As Inspector
Dim lngStart As Long
Dim lngEnd As Long

Set objIns = Application.ActiveInspector
Set objItem = objIns.CurrentItem   '今開いているメールオブジェクトを取得

    With objItem
        MsgBox Mid(objItem.Body, Len("【作業時間】") + 1, (InStr(objItem.Body, vbCrLf) - Len("【作業時間】") + 1))
    End With

End Sub

このコードを実行してみると…

outlook,本文,取り出しこの通り、作業時間の時間だけの部分を取り出すことができました。

メール本文は決まったフォーマットで

この記事でご紹介した方法なら、受信メール本文ボックス内のメールを対象にして、複数のメールからまとめて文字を取り出すこともできそうです。

例でご紹介したように、日々の勤怠を日報で上長に送っていて、その報告内容と勤務表やタイムカードと照らし合わせたい…といったとき。

1ヶ月分のメールを対象にしてこの方法で一気に対象の文字をメールから取り出して、エクセルのシートに貼り付けて一覧にしてしまえば、楽に勤務時間や勤務内容を把握することができますね。

しかし、そのためには送信されてくるメール本文が、決まったフォーマットで書かれている必要があります。

【作業時間】xxxxx(改行)【作業内容】xxxxxx

と書いて欲しいのに、

【時間】xxxxx(改行)【作業内容】xxxxx

のように書かれてしまうと、上のコードでは欲しい情報がメール本文から取り出せなくなってしまいます。

なので、そのあたりの運用上のルールも考えておかなければいけません。

最後に

今回は、メールの本文から特定の文字を取り出す方法をご紹介しました。

様々なシステムで勤怠管理ができるようになっている昨今、未だメールでの時間報告をしなければならない職場もあるようです。(筆者の経験より)

メールで報告する方も面倒臭いですが、メールと勤怠表を突き合せたりして面倒くさい!とお嘆きの方は、今回の記事でご紹介した方法を使えば少し楽になるかもしれませんね。

それでは、最後までお読みいただきありがとうございました!

連載目次:Outlook VBAでメールを操作してみよう

メーラーとして名高く、そして便利なOutlook。

Outlookのメールだって、VBAで操作することができますよ。本シリーズでは、Outlookのメールを、VBAで操作する方法をご紹介していきます。

  1. 【Outlook VBA】メールの送信時イベントで確認ダイアログを表示する方法
  2. 【Outlook VBA】UnReadItemCountプロパティで受信フォルダの未読メール件数を取得する方法
  3. 【Outlook VBA】メール本文から欲しい情報だけを取り出す方法
  4. 【Outlook VBA】Application_NewMailExイベントでメール受信時にメッセージを表示する方法

タイトルとURLをコピーしました