返信メッセージで表示名をアドレス帳のものに置き換えるマクロ


自分から送信するメッセージの場合、アドレス帳からあて先や CC に追加することで表示名を自分で登録したものにできます。しかし、受信したメッセージに返信した場合、あて先や CC のアドレスの表示名は元のメッセージのものが使われてしまいます。
これは、相手が指定してきた表示名を尊重するという意味があるのだと思うのですが、返信メッセージについてもアドレス帳に登録された表示名を使いたいという要望が多いようなので、そのようなことを可能にするマクロを作ってみました。

以下のマクロは現在開いているメッセージの返信を作成し、そのあて先の中でアドレス帳に存在するものはアドレス帳の表示名に置き換えるというものです。返信ボタンをクリックする代わりにこのマクロを呼び出してください。なお、開いているメッセージではなく、メッセージ一覧で選択しているメッセージについて返信したい場合には、ActiveInspector.CurrentItem を ActiveExplorer.Selection.Item(1) に変更します。


'
' ここをトリプルクリックでマクロ全体を選択できます。
'
Public Sub ReplyWithAddressBookName()
    Dim objReply As MailItem
    Dim objRecip As Recipient
    Dim objContact As ContactItem
    Dim objAddrList As AddressList
    Dim i As Integer
    Dim objAddrEntry As AddressEntry
    Dim bFound As Boolean
    Dim cRecips As Integer
    Dim colAddress() As String
    Dim colName() As String
    Dim colType() As Integer
    '
    Set objReply = ActiveInspector.CurrentItem.ReplyAll
    cRecips = objReply.Recipients.Count
    ReDim colAddress(cRecips) As String
    ReDim colName(cRecips) As String
    ReDim colType(cRecips) As Integer
    For i = cRecips To 1 Step -1
        Set objRecip = objReply.Recipients.Item(i)
        colAddress(i) = objRecip.Address
        colName(i) = objRecip.Name
        colType(i) = objRecip.Type
        objReply.Recipients.Remove i
    Next
    '
    For i = 1 To cRecips
        Set objRecip = Nothing
        For Each objAddrList In Session.AddressLists
            If objAddrList.AddressListType = olOutlookAddressList Then ' Outlook 2003 の場合はこの行をコメントアウトし、下の1行を有効にする
            'If objAddrList.Name = "連絡先" Then
                For Each objAddrEntry In objAddrList.AddressEntries
                    If objAddrEntry.Address = colAddress(i) Then
                        Set objRecip = objReply.Recipients.Add(colAddress(i))
                        Set objRecip.AddressEntry = objAddrEntry
                        objRecip.Type = colType(i)
                        Exit For
                    End If
                Next
                If Not objRecip Is Nothing Then
                    Exit For
                End If
            End If
        Next
        If objRecip Is Nothing Then
            Set objRecip = objReply.Recipients.Add(colName(i) & "<" & colAddress(i) & ">")
            objRecip.Type = colType(i)
        End If
    Next
    objReply.Display
End Sub


マクロの登録方法やメニューへの追加について

2011/1/31 変更: Exchange 環境および複数の連絡先フォルダがある状況に対応しました。

2011/2/1 変更: Outlook 2003 に対応しました。なお、Outlook 2003 では複数の連絡先フォルダには対応していません。

2011/8/25 変更: 宛先や Cc の並び順を維持するように修正しました。

2013/7/12 変更: 連絡先フォルダーにない受信者が宛先に変更される不具合を修正しました。

広告

返信メッセージで表示名をアドレス帳のものに置き換えるマクロ」への38件のフィードバック

  1. コメントありがとうございます。
    コピーしやすい形式というのはマクロのテキストのことでしょうか?
    マクロの先頭からドラッグすると記事全体が選択されてしまうことがあるようですが、End Sub の直後から上のほうにドラッグするとマクロのテキストだけを選択できます。 

  2. 返信ありがとうございます。コードをVBAのエディタに実際に貼り付けていただくとお分かりいただけるかと思います。

  3. すみません。どうやら PRE タグを使うと、コピーしたときに改行が抜けてしまうようですね。失礼しました。CODE タグを使ってみました。これでどうでしょうか? 

  4. ありがとうございます。
    簡単にコピーできるようになりました。
    これからも参考にさせていただきます。

  5. 有り難く利用させていただいていたのですが、
    ある時からマクロを実行するとエラーでOUTLOOKごと落ちるようになりました。
    是非とも再び利用したいのでご確認をお願いいたします。

    デバックすると

    objRecipInAB.Type = objRecip.Type

    この辺りで落ちます。VBAのコーディングには無知なので、
    何が悪さをしているか、サッパリです。。。
    筐体を変えても同様なので、Office Updateなどでの
    パッチとの互換性でしょうか?

  6. […] マクロを使えば Outlook でも返信時に受信者の表示名を変更することは可能です。以前、返信メッセージで表示名をアドレス帳のものに置き換えるマクロは作りましたが、単に表示名を削除するだけでよいのであれば、下記のようなマクロになります。このマクロは現在開いているメッセージの返信を作成し、そのあて先や Cc の表示名を削除するというものです。返信ボタンをクリックする代わりにこのマクロを呼び出してください。なお、開いているメッセージではなく、メッセージ一覧で選択しているメッセージについて返信したい場合には、ActiveInspector.CurrentItem を ActiveExplorer.Selection.Item(1) に変更します。 ' ここをトリプルクリックでマクロ全体を選択できます。 Public Sub ReplyWithNoDisplayName()     Dim objReply As MailItem     Dim objRecip As Recipient     Dim objNewRecip As Recipient     Dim i As Integer     '     Set objReply = ActiveInspector.CurrentItem.ReplyAll()     For i = objReply.Recipients.Count To 1 Step -1         Set objRecip = objReply.Recipients.Item(i)         Set objNewRecip = objReply.Recipients.Add(objRecip.Address)         objNewRecip.Type = objRecip.Type         objNewRecip.Resolve         objReply.Recipients.Remove i     Next     objReply.Display End Sub […]

  7. おそらく最初の質問コメントを出したものです。
    マクロが全く無知で、、、申し訳ありません。

    実行時エラー’91’
    オブジェクト変数またはWithブロック変数が設定されていません。

    ネットでは
    このエラーを解決するには
    オブジェクト変数が有効なオブジェクトを参照していることを確認し、問題があればオブジェクトに対する参照を指定し直します。

    Nothing に設定されたオブジェクト変数を使用していないことを確認します。

    オブジェクトが記述されているオブジェクト ライブラリが [Add References] ダイアログ ボックスで選択されていることを確認します。

    With ブロックが With ステートメントのエントリ ポイントを実行して初期化されていることを確認します。

    全くわかりません。
    ただコピーするだけでは駄目なのですね。

    • メッセージをダブルクリックで開いてから実行していますでしょうか?
      このマクロは別ウィンドウで表示したメッセージの返信を行うものです。
      メッセージ一覧で選択しているメッセージについて返信したい場合には、ActiveInspector.CurrentItem を ActiveExplorer.Selection.Item(1) に変更してください。

  8. はじめまして。

    会社のメールシステムがExchage+Outlookに変更されてしまい、Outlookの使い勝手を向上させようとして、このサイトににたどり着きました。

    そこで、本マクロを使用してみようとしたのですが動作せず、自分なりに勉強してみたのですが、どうも、本マクロは”アドレス帳”を参照し、わが社の環境では”連絡先”ににしか、アドレス登録ができないことが原因のように思われます。

    そこで、本マクロの”連絡先”対応版をリリースいただくことはできないでしょうか?

    ちなみに、”連絡先をマクロで活用する”の”受信したメールの差出人を連絡先から検索する”については活用させていただいています。

    以上、よろしくお願いします。

    • 確かにこのマクロは Exchange 環境は想定していませんでした。
      Exchange 環境用のマクロを別途作成しますので、しばらくお待ちください。

      • こちらのマクロは連絡先フォルダが複数ある場合も想定していなかったため、Exchange 環境への対応と複数の連絡先フォルダへの対応もこちらのマクロで行うよう修正しました。

  9. 早速の対応ありがとうございます。

    実行してみたところ、

    ”オブジェクトは、このプロパティまたはメソッドをサポートしていません。”

    というエラーが出てしまいます。
    メールをダブルクリックで開いてから実行しています。

    私のマクロの導入の仕方が悪いのかもしれませんが、助言いただければと思います。

    なお、当方の環境をお伝えしわすれていましたが、以下のとおりです。
    OS:XP SP3
    outlook:OUTLOOK2003 SP3

    以上、よろしくお願いします。

    • すみません。Outlook 2003 でサポートされていないプロパティを使用していました。
      Outlook 2003 では、以下の記述を変更してください。

      変更前:

      If objAddrList.AddressListType = olOutlookAddressList Then

      変更後:

      If objAddrList.Name = "連絡先" Then

      • 迅速な対応ありがとうございました。
        おかげさんで、希望している動作ができるようになりました。

  10. こんにちは。

    いつも便利に使わせていただいております。
    このマクロは2010でも動作しますか? 私の環境だとうまく動作していません。
    でご質問ですが、
    ・2010でも動作しますか?
    ・アドレス帳に存在するアドレスと存在しないアドレスが混在しいるメールを受信して、それに返信
     する場合、どのようになりますか?
    ・BCM(BusinessContactManager:Outlookのアドイン)を利用している場合、BCMのビジネス用連絡先
     も対象にできますか?

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

    • いただいたそれぞれの質問に回答します。
      1. Outlook 2010 でも動作します。うまく動作しないというのはエラーが発生するということでしょうか? それとも名前が置き換わらないということでしょうか?
      2. アドレス帳に存在するアドレスと存在しないアドレスが混在した場合、存在するアドレスだけが置き換わります。
      3. BCM のビジネス用連絡先が Outlook のアドレス帳として表示されているなら、それも対象にできるはずです。

  11. はじめまして。
    社内のメールクライアントソフトがOutlook2003に統一され、
    以前のメールソフト(秀丸メール)のマクロが使用できなくなり、困っておりましたが、
    本サイトのマクロを知り、便利に使用させて頂き、助かっております。
    ありがとうございます。

    本マクロについても使用しているのですが、宛先の順序が逆順になってしまいます。
    別のマクロ「返信時に表示名を削除するマクロ」では宛先の順番が維持されるようなので、
    自力で同じように直そうとしたのですが、うまく行きません・・・。
    もし可能なら、対応して頂けるとうれしいです。

    修正方法のヒントを頂くだけでも助かります。

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

      • こんにちは。
        御礼が遅れてすみません。
        宛先順の維持するマクロ変更のご対応ありがとうございました。
        非常に助かります。
        また、何かありましたらよろしくお願い致します。

  12. >3. BCM のビジネス用連絡先が Outlook のアドレス帳として表示されているなら、それも対象にできるはずです。

    これはOutlook のアドレス帳と同期をかけた場合という条件付きだと思いますが、同期をかけない場合は、マクロ上どのように指定すれは良いのでしょうか。

    よろしくお願いします。

  13. はじめまして。今まですごく便利に使用させていただきましたが、会社のメールがExchangeとなり、offline global address listが参照されて、自分で登録したアドレス帳が反映しなくなりました。登録したアドレス帳で置き換え出来る対応は可能でしょうか?
    よろしくお願いします。

  14. 日頃お世話になっております。
    「特定の受信者に送信する際に自動的に送信アカウントを変更するマクロ」
    をExchange環境で使用すると、以下のエラーが返ってきます。

    実行時エラー’91′
    オブジェクト変数またはWithブロック変数が設定されていません。

    サンプルをそのまま使用しても同じエラーが返ってきて、VBAの編集画面を
    開くと以下の行が黄色くハイライトされています。

    If Item.SendUsingAccount.DisplayName SECOND_ACCOUNT Then

    エラーメッセージの意味を色々調べても、どこを直せば良いのかいまいち分かり
    ません。問題の解決方法をご存知でしたら、教えていただけると幸いです。

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

    • あれからいろいろ調べまして、Exchangeの環境で送信アカウントをチェック
      する際に二つの問題が生じることが分かりました。一つ目は、差出人が
      “Microsoft Exchange”と認識されてしまうことと、二つ目は、他の方も仰って
      いましたが、下書きフォルダに保存されてしまうと、メール送信時に実行時
      エラー’91’が返ってくるということです。

      以下のようなのもあることが分かり、試してみたところ、何とか目的を果たすことができました。

      Application.GetNamespace(“MAPI”).CurrentUser

      お騒がせしましたが、以上、ご報告まで。

      • すみません、実行時エラー’91’自体は、エラー発生時にOn Error GoToでSendUsingAccountに”Microsoft Exchange”と代入する処理を行うことで解決しましたが、Exchange環境で自動的に送信アカウントを変更するマクロはできておらず、現在模索中です。また、投稿するページが間違っていたので、次は「特定の受信者に送信する際に自動的に送信アカウントを変更するマクロ」に投稿させていただきます。失礼いたしました。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中