Outlook VBAをはじめよう!初心者向け手引き

会社でメールをやり取りする際にOutlookをメーラに採用している企業は多いのではないでしょうか。

Microsoft365を導入している企業であれば必須アプリですね。

そんなOutlookですが、Excelと同じようにマクロのVBAが扱えるんです!

タカヒロ
タカヒロ
Outlook VBAをうまく扱えば、メール作成、送信、予定表出力、登録、連絡表更新などあらゆる操作がカンタンに自動化できて本当に便利です。

今回は、

・Outlook VBAのメリットと注意点
・Outlook VBAの実装手順やエラー対処法
・Outlook VBAでメール、連絡先、予定表、会議予約などを扱う方法

についてまとめます!

Outlook VBAのメリット

Outlook VBAのメリットその一

Outlook VBAのメリットその一は
OutlookはすでにVBAが実行できる環境が整っている
というためです。
Outlookは開発専用のアプリケーションを追加インストールする必要なく
開発タブの追加だけで、開発できる環境ができてしまうのです。

多くの企業で採用されているOutlookですが、導入許可やコストをかけることなく、
効率化や自動化ができるということで、利用しない手はないですね!

Outlook VBAのメリットその二

Outlook VBAのメリットその二は、ほとんどの方が手動でおこなう部分をカンタンに自動化できるという点です。

業務において、
・タスク開始のトリガーと終了の報告はメールでおこなう
・会議や予定はOutlookの予定表で集中管理している
ということが多いかと思いますが、
これらすべて手動で行っていないでしょうか。

例えば、日報、週報、月次報告、見積や請求書送付、各種申請、承認依頼、関係者確認依頼、スケジュール調整、作業依頼、内部共有会議コールなどなどです。

これがワンクリックで、部署内のだれよりも早く、正確にできたらうれしいですよね。

特に毎日のルーチンワークが自動化できた場合、短期では短くても長期的に見れば膨大な時間が節約できるという訳です。

タカヒロ
タカヒロ
日報作成を自動化したら、手動で作成することに戻れなくなりますね…

Outlook VBAのメリットその三

Outlook VBAのメリットその三はOutlook VBAの習得は実はカンタンであるという点です。

Outlook VBAが難しく感じる理由は、Outlook VBAに関する文献が絶望的に少ないからです。

さらにネットで検索すればOutlook VBAの記事はありますが、どれも専門的過ぎてわかりにくいですよね。

タカヒロ
タカヒロ
Outlook VBA習い始めのときは、理解するのに本当に苦労しました。

Outlook VBAを理解しようにも関連する情報や具体例がないために難しく感じているというだけなのです。

エク短ではそんなOutlook VBAをわかりやすく、かつ即実務へ活かせるような形で伝えていき、
Outlook VBAによる実務力アップの手助けができればと思っています。

Outlook VBAを扱う上での注意点

Outlook VBAを利用する価値があることは理解いただけたかと思いますが、

よい話ばかりではないということもお伝えしなければなりません。

それは、セキュリティーポリシーから制限がかけられてきた歴史があるのです。

メールを受信したらマクロ実行

このパターンってワームの機能に似ていますよね…

Outlook2013以降はルールによるスクリプト実行も廃止され、

ますます制限がかけられている状況です。

エク短におけるOutlook VBAは、そんなリスクを軽減するために、

メール送信や一括更新などの処理をする場合には注意喚起とメッセージを出すよう工夫をしていきます。

問題発生の機会をなるべく少なくし、総合的に時短につながればよいと思っています。

Outlook VBAを実行するための下準備をする

まずははじめの第一歩。

リボンメニューへ 開発 タブを追加しましょう。

※デフォルトでは 開発 タブは非表示となっています。

1.リボンのユーザー設定 をクリックします。

2.右の リボンのユーザ設定 のボックスのリストメニュー 開発へチェックを入れOK をクリックします。

3.リボンメニューに 開発タブが表示されたら完成です。

Outlook VBAコードの配置場所について

VBAコードを配置する場所について説明します。
1. 開発タブをクリックし、Visual Basicボタンをクリックします。

2. Visual Basicアプリケーションの左メニューに表示されているProjectをクリックしながら展開し、
最後に表示されるThisOutlookSessionをクリックします。

3.プロジェクトのコードエリアが表示されます。
このエリアにコードを入力することによりOutlook側でマクロとして認識され、マクロが実行できるようになります。

簡単なOutlook VBAを実行してみよう

さっそくお試しでOutlook VBAを実行してみましょう。

1.以下コードををコピーします。

Sub test()
  MsgBox "Hello エク短!"
End Sub

2.プロジェクトのコードエリアにコードをコピペします。

3.上部メニューのをクリックし実行します。

4.メッセージボックスが表示されたら完成です!
正常に機能していることが確認できましたね。

もし機能しなかったら

もし機能しなかったら、
「Microsoft Outlook Object Library」の参照設定がされているか
確認をしましょう。

Visual Basicボタンをクリックし、画面が開いたら、
メニューからツール>参照設定を選択します。

「Microsoft Outlook ** Object Library」にチェックを入れ、
OKをクリックしたら完了です。

それでもできなかったら

それでもできなかったらマクロの起動が無効化されているかもしれません。

その場合はセキュリティセンターからマクロの設定を変更するようにしましょう。

参考:マイクロソフト Office ドキュメントのマクロを有効または無効にする

1.ファイル タブをクリックします。

2.オプション をクリックします。

3.セキュリティ センター をクリックし、セキュリティ センターの設定 をクリックします。

4.セキュリティ センターマクロの設定 をクリックします。

5.セキュリティ センターの マクロの設定 領域ですべてのマクロを有効にするをチェックし、OK をクリックしたら完成です。

タカヒロ
タカヒロ
次にOutlook VBAでどんなことができるか、どんな機能であるか
具体例を交えご紹介します。

Outlook VBAでメールのチェックをしてみる

Outlookのメール送信前のチェックはセキュリティー対策として有効です。
高額なセキュリティ対策ソフトを導入することなく簡単に実現できます。

セキュリティ事故最新事情をまとめてみました。

Outlook VBAのイベント、オブジェクト

Outlook VBAのイベント、オブジェクトです。
はじめは難しいと思いますので、そんなことできるんだぐらいに一度眺めてもらえばと思います。

Outlook VBAで本文中にハイパーリンクを付与する

業務でよく使うハイパーリンクを付与する作業をOutlook VBAで自動化してみました。

 

Outlook VBAで添付ファイルを扱ってみる

メールで扱うことが多い添付ファイル関連の操作についてまとめました。

Outlook VBAで連絡先を扱ってみる

Outlookの連絡先に関する技をまとめました。

Excelから操作しますのでExcel VBAとOutlook VBAが混在する形となります。(ちょっと複雑ですよね…)

Outlook VBAでメモを扱ってみる

Outlookのメモに関する技をまとめました。

連絡表と同じExcelVBAとOutlookVBAの混合型とOutlookVBA単体の説明となっています。

Outlook VBAでタスクを扱ってみる

Outlookのタスクに関する技をまとめました。

連絡表と同じExcelVBAとOutlookVBAの混合型とOutlookVBA単体の説明となっています。

Outlook VBAで予定表や会議予約を扱ってみる

Outlookの予定表に関する技をまとめました。

連絡表と同じくExcelVBAとOutlookVBAの混合型となっています。

タカヒロ
タカヒロ
複数の他人の予定情報を一度に集計できる方法が人気がありますね。
テレワークの普及で見えにくくなっている部下の業務実態がワンクリックで見えてしまいますからね。

Outlook VBAで会議の出欠確認を集計してみる

読者の方から要望があり作成したもので、
複数の会議の出欠状況をExcelにまとめ、確認できるといった内容となっています。

タカヒロ
タカヒロ
出欠情報を得る方法がなく実現するのに苦労しました。
そもそも出欠送らない人がいますし…

 

Outlook VBAでいろいろな種類のメールを作成・送信してみる

日報や障害報告などを例に、Excelでメール情報とメールテンプレートをまとめた上、
Outlook VBAでメールを作成、送信するといった内容となっています。

タカヒロ
タカヒロ
メール誤送信とならないよう十分にテストをすることを推奨します。

Outlook VBAでメールを転送してみる

メール転送する時は宛先を追加したり、本文に一言添えたりすることがありますが、それがワンクリックでできるようになります。
仕訳ルールと併用すると全自動で転送メールを送信することもできます。

Outlook VBAでメールを返信してみる

メールを返信するパターンはTOのみの返信とCCを含めた全員の返信があります。
それぞれの送信パターンごとに宛先を追加したり、件名や本文に定型文を追加することがワンクリックでできるようになります。

タカヒロ
タカヒロ
読者の方からのご要望により、返信時に自動で本文へ宛名+様/さんを挿入する機能を追加してみました。都度「〇〇さん」とか入力しなくてよいですし、漢字の入力ミスもなくなりますので、多数のメンバーを送らなければならない管理職などの方に最適でしょう。

Outlook VBAでOutlookフォルダ一覧を取得してみる

受信トレイや送信トレイ、予定表や連絡先、そしてオリジナルで作成したフォルダ含めたフォルダ一覧をExcelへ出力することができます。
見失ったフォルダを探したり、Excelでフォルダリストを管理したりいろいろな用途がありそうですね。

Outlook VBAでOutlook受信トレイのメール情報を取得してみる

受信トレイやサブフォルダのメール情報をExcelへ出力することができます。
メールの件名一覧や本文一覧を手っ取り早く収集したいときに有効ですね。

さいごに

いかがでしょうか。

今回は、

・Outlook VBAのメリットと注意点
・Outlook VBAの実装手順やエラー対処法
・Outlook VBAでメール、連絡先、予定表、会議予約などを扱う方法

についてまとめてみました。

マイナーな言語でわかりにくくリスクもあるOutlook VBAですが、

エク短では初心者からベテランまで

誰でも難なく業務に生かせるようわかりやすさ、見やすさを心掛け、

Outlook VBAの良さをお伝えできればと思っています!



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。








12 件のコメント

  • タカヒロ@extan様

    お忙しいところご教示ありがとうございました。

    ★1 クリップボードをすべてクリア
    → OutlookでのVBAでは難しそうですね・・・。

    ★2 連続して2つの文字列を順番にコピー
    → 当方の質問の仕方が悪かったのか、質問と答えがかみ合っていないようです。いろいろ挑戦して解決方法が見つかりました。ご面倒をおかけしました。

    ★3 Outlookのクリップボードを表示
    → 頂いた方法で無事解決しました。

  • タカヒロ@extan様

    いつも参考にさせていただいております。Outlook2016環境において、VBAでクリップボードを使いたく、お知恵を拝借したく、ご教示ください。よろしくお願いいたします。

    質問内容
    ★1 クリップボードをすべてクリアにしたいのですがやり方を教えていただけますか。
    ★2 連続して2つの文字列を順番にコピーしようとすると、最後の文字列しかクリップボードにコピーできません。VBEで1行ずつ実行すると2つの文字列がクリップボードに入るため、コード自体は誤りないと思うのですが、処理時間によるエラーなのかと思います。エラーを回避して2つコピーする方法を助言いただけますでしょうか。
    ★3 Outlookのクリップボードを表示させることを今は手動で行っているのですが、マクロで表示させることは可能でしょうか。

    以下が当方作成したマクロです。
     ↓
    Sub 差出人と件名をクリップボードにコピー()
    Dim objItem As Object

    If TypeName(Application.ActiveWindow) = “Inspector” Then
    Set objItem = Application.ActiveInspector.CurrentItem
    Else
    Set objItem = ActiveExplorer.Selection(1)
    End If

    ‘★1 ここでクリップボードをすべてクリアにしたい。

    With CreateObject(“Forms.TextBox.1”)
    .MultiLine = True
    .Text = objItem.SenderEmailAddress
    .SelStart = 0
    .SelLength = .TextLength
    .Copy
    End With ‘差出人をクリップボードにコピー

    ‘★2 VBEで1行ずつ実行(F8)すると差出人と件名どちらもクリップボードにコピーできるが、通常どおり実行(F5)すると件名しかコピーできない。

    ‘   F5で実行する場合、ここにStopを入れないと差出人と件名どちらもコピーできない。Stopを入れるとうまくいくがF5を押す手間が増える。F5を押さなくてもいいように代替案はないか?
    Stop

    With CreateObject(“Forms.TextBox.1”)
    .MultiLine = True
    .Text = objItem.Subject
    .SelStart = 0
    .SelLength = .TextLength
    .Copy
    End With ‘件名をクリップボードにコピー

    ‘★3 ここでクリップボードを表示したい。

    Set objItem = Nothing

    End Sub

    • いつもご利用ありがとうございます。

      以下にご回答申し上げます。

      ★1 クリップボードをすべてクリアにしたいのですがやり方を教えていただけますか。
      ⇒Excel版となりますが、以下の記事に詳細な内容がございますので、よろしければご参考ください。
      64Bit版
      https://extan.jp/?p=3498#%E3%82%AF%E3%83%AA%E3%83%83%E3%83%97%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AE%E5%B1%A5%E6%AD%B4%E3%81%AE%E5%80%A4%E3%82%92%E3%81%99%E3%81%B9%E3%81%A6%E3%82%AF%E3%83%AA%E3%82%A2%E3%81%95%E3%81%9B%E3%82%8BVBA_64bit%E7%89%88
      32Bit版
      https://extan.jp/?p=3498#%E3%82%AF%E3%83%AA%E3%83%83%E3%83%97%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AE%E5%B1%A5%E6%AD%B4%E3%81%AE%E5%80%A4%E3%82%92%E3%81%99%E3%81%B9%E3%81%A6%E3%82%AF%E3%83%AA%E3%82%A2%E3%81%95%E3%81%9B%E3%82%8BVBA_32bit%E7%89%88
      なお、Applicationの指定は開いているウインドウが対象となるので
      Application.ActiveExplorer
      で指定いただければと存じます。
      なお、Application.ClipboardFormatsプロパティはExcelのプロパティとなり、Outlookではエラーとなりますことご了承願います。

      ★2 連続して2つの文字列を順番にコピーしようとすると、最後の文字列しかクリップボードにコピーできません。VBEで1行ずつ実行すると2つの文字列がクリップボードに入るため、コード自体は誤りないと思うのですが、処理時間によるエラーなのかと思います。エラーを回避して2つコピーする方法を助言いただけますでしょうか。
      ⇒GetFromClipboardメソッドなどでクリップボードの値を取得するときは最後の文字列が対象となります。2つ同時という処理はできないので、文字列に区切り文字を入れ、Split関数などで分割する方法が考えられます。

      ★3 Outlookのクリップボードを表示させることを今は手動で行っているのですが、マクロで表示させることは可能でしょうか。
      ⇒Application.ActiveExplorer.CommandBars(“Office Clipboard”).Visible をTrueにすることでできるかと存じます。コードは★1でご案内しました記事内に記載がございます。

      なお、これまでの回答は机上での回答となりますことご了承願います。またもしうまくいきましたらお手数ですが、共有いただけますと幸いです。
      今後Outlookのクリップボード操作に関する記事作成を検討したいと思います。

  • お返事ありがとうございました。
    お陰様でクイック操作も設定できました。
    この度は、見ず知らずの私のために貴重なお時間ありがとうございました。

  • ご親切に恐れ入ります。
    早速メールテンプレートを試したところ上手くできました。
    ただ欲を言えばなのですが、この方法だとテンプレートを出すまでに何ステップか必要ですので、できたらホーム画面で「新しいメール」を押すとテンプレートが出てくるとか、プラス1ステップくらいで出せる方法があると嬉しいのですが、さすがにそこまでは無理でしたら今のままでも助かりましたのでありがとうございました。

    • できたようでよかったです。

      ボタンクリックでテンプレメールを立ち上げる方法はOutlookのクイック操作に登録することで可能となります。

      クイック操作の登録方法は以下の通りです。
      ①「ホーム」タブの「クイック操作」グループにある「新しいクイック操作」をクリックし「新しい電子メール」を選択します。
      ②クイック操作の編集ウイザードでボタン表示となる名前を入力し、「オプション」>「オプションの表示」をクリックします。
      ③件名や宛先など入力をし、「保存」ボタンをクリックして保存します。
      ④クイック操作に登録したボタンをクリックするとテンプレからメールが作成されます。

  • 初めまして。よろしくお願いいたします。

    私は今までWin7のPCでウインドウズライブメールを使っていたのですが、先日win11のPCに買い替えたところライブメールは使えないということでアウトルックに移行しました。
    こちらは会社でもなく、単純に子供たちとの事務連絡レベルのメールで使うくらいですので、あえて件名など入れずにパッパと送りたいのですが、アウトルックになってからは送信時にライブメールでは出てこなかった「このメッセージを件名なしで送信しますか?」という注意が毎回出てきてしまいます。
    これが煩わしいので、送信ボタンを押したら即送信できるような設定ができるようでしたら教えていただけますでしょうか。

    当方パソコンなどに全く詳しくないので、説明や情報が足りなかったら申し訳ありません。
    というか、そもそもこちらで質問しても良かったのかも分かりませんので、もし場違いでしたら失礼をお許しください。

  • はじめまして、いつも勉強させていただいております

    添付ファイルの操作で質問があるのですが
    メールの件名を指定して最新日付の添付ファイルのみ指定フォルダに格納したい場合はどのようにしたらよろしいでしょうか?

    • いつもご利用ありがとうございます。
      メールの件名を指定して最新日付の添付ファイルのみ指定フォルダに格納する方法ですが、
      以下サンプルコードを一部変更することで対応可能となっております。

      https://extan.jp/?p=866#%E3%83%9E%E3%82%AF%E3%83%AD%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B

      ■変更前
      For Each objItem In objFolder.Items
      For i = 1 To objItem.Attachments.Count
      ‘添付ファイルに拡張子がある場合のみ処理します。
      If InStr(objItem.Attachments.Item(i), “.”) 0 Then
      objItem.Attachments.Item(i).SaveAsFile strPath & objItem.Attachments.Item(i)
      End If
      Next i
      Next objItem

      ■変更後
      For Each objItem In objFolder.Items

      ‘メール件名が指定の値と一致した場合のみ処理します。
      If objItem.Subject = “<メール件名を記入>” Then
      For i = 1 To objItem.Attachments.Count

      ‘添付ファイルに拡張子がある場合のみ処理します。
      If InStr(objItem.Attachments.Item(i), “.”) 0 Then

      ‘添付ファイル名に特定の文字がある場合のみ処理します。
      If InStr(objItem.Attachments.Item(i), “<特定文字を記入>”) 0 Then
      objItem.Attachments.Item(i).SaveAsFile strPath & objItem.Attachments.Item(i)
      End If
      End If
      Next i
      End If

      Next objItem

      以下に対象とするメール件名を入力します。
      If objItem.Subject = “<メール件名を記入>” Then

      取得したい添付ファイル名にある日付部分を<特定文字を記入>に入力します。
      例えばファイル名「報告書yyyymmdd.doc」の形式としたら、本日2/18のファイルを指定する場合は「20220218」を入力します。
      If InStr(objItem.Attachments.Item(i), “<特定文字を記入>”) 0 Then
      ※最新日付の定義によって指定内容を変更頂ければと存じます。

      よろしくお願いいたします。

  • お世話になります。
    予定表のVBA操作について、各所拝見し、とても参考になりました。

    ひとつ質問ですが、定期的な予定を一回分だけ変更する手動操作をvba実行可能でしょうか。isrecurring はboolean型で読み込み専用なため難しいと思っています。

    • いつもご利用ありがとうございます。

      VBAで定期的な予定を一回分だけ変更する方法につきまして、
      定期的な予定は開始日、終了日、開催頻度などパターンによる登録であるため、
      定期的な予定の状態(isrecurringがTrue)のまま1回目のみの日程等内容を変更することは難しい状況です。

      ですので、
      定期的な予定の開始日を2回目以降に変更し、1回目を単体の予定(isrecurringがFalse)で新規登録する
      やり方が望ましいと考えます。

      その場合VBAでは、
      対象の定期的な予定の開始日を示すプロパティ「PatternStartDate」を2回目以降に変更し、
      開催頻度や曜日指定の周期の変更があれば以下のDocsを参考に指定します。
      https://docs.microsoft.com/ja-jp/office/vba/api/outlook.recurrencepattern
      そしてSaveメソッドで保存します。
      1回目の予定は記事を参考にプロパティを指定し、同じくSaveメソッドで保存します。

      VBAを組んで検証できたら別記事で公開したいと思います。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です