連絡先の保存の際に件名を自動設定する方法


コメントで以下のようなご要望をいただきました。


最近Outlook 2007の[連絡先の選択]画面で表示されるローカルの連絡先の表示順を変えようと思い調べていると、連絡先の[件名](ContactItem.Subject)を設定すればその順でソートされて表示されることがわかりました。ここに[会社名][部署名][姓][名]などをセットしておけば、[連絡先の選択]画面で同じ会社の人が並んで表示されるのでメールの送信先を選択し易くなります。
ところが、この[件名]フィールドは連絡先をOutlook 2007上でGUIから個別に編集して保存すると、都度[姓][名]の形式で上書きされてしまいます。
現在はOutlook起動時に全連絡先をマクロで書き直していますが、起動に余分な時間がかかりますしできれば連絡先を編集して保存するタイミングでフックできれば一つの連絡先だけを書き直せばよいので助かります。
連絡先の保存をフックする方法はあるのでしょうか?
またGUIでの保存だけをフックしたいのですが、フック処理関数の中でContactItem.Saveを使うと再帰的にフックされてしまうものでしょうか?


このようなご要望を満たす方法としては、連絡先のフォームをカスタマイズし、保存の際に呼び出される Item_Write イベントによって件名を設定するというものが考えられます。

連絡先のフォームをカスタマイズする手順は以下の通りです。

  1. [ツール]-[オプション]-[その他] の [詳細オプション] をクリックし、"[開発] タブをリボンに表示する" をオンにしてから、全てのダイアログを [OK] で閉じます。
  2. [ファイル]-[新規作成]-[連絡先] をクリックし、連絡先の新規作成ウィンドウを表示します。
  3. [開発] リボンの [このフォームのデザイン] をクリックします。
  4. フォームのカスタマイズ画面が表示されますので、[コードの表示] をクリックします。 なお、カスタマイズ画面に含まれるコントロールは変更しないように注意してください。
  5. [スクリプト エディタ] のウィンドウで以下のようなコードを入力します。

    ' ここをトリプルクリックでコード全体を選択できます。
    Function Item_Write()
        Item.Subject = Item.CompanyName & " " & Item.Department & " " & Item.LastName & " " & Item.FirstName
        ' 名前などの並び順を漢字のコード順ではなく、フリガナの順にしたい場合は、下記のコードのコメントを外します。
        ' Item.Subject = Item.YomiCompanyName & " " & Item.Department & " " & Item.YomiLastName & " " & Item.YomiFirstName
    End Function

  6. [スクリプト エディタ] のウィンドウを閉じます。
  7. [開発] リボンの [発行] をクリックし、[フォームの発行] をクリックします。
  8. [フォームの場所] で [Outlook フォルダ] を選択し、[詳細] をクリックして [連絡先] を選択します。(通常なら、連絡先が選択済みです。)
  9. 表示名に任意の名前 (たとえば、"SetSubject" など) を入力し、[発行] をクリックします。
  10. 新規作成のウィンドウを閉じます。
  11. [連絡先] フォルダを右クリックし、[プロパティ] をクリックします。
  12. [全般] タブの [このフォルダに投稿するときに使用するフォーム] で 8.で入力した名前を選択し、[OK] をクリックします。

これにより、新規に作成した連絡先のアイテムについては、そのアイテムの保存の際に自動的に件名に「会社名 部署名 姓 名」という文字列が設定されます。

また、すでに連絡先にあるアイテムでもこのフォームを使う場合には、以下のマクロを一度だけ実行します。

' ここをトリプルクリックでマクロ全体を選択できます。
Public Sub ChangeMessageClassOfAllContacts()
    ' 置き換えるフォームのメッセージ クラスを指定します。
    Const NEW_MESSAGE_CLASS = "IPM.Contact.SetSubject"
    Dim fldContacts 'As MAPIFolder
    Dim objContact 'As ContactItem
    Set fldContacts = Session.GetDefaultFolder(olFolderContacts)
    For Each objContact In fldContacts.Items
        If objContact.MessageClass = "IPM.Contact" Then
            objContact.MessageClass = NEW_MESSAGE_CLASS
            objContact.Save
        End If
    Next
End Sub

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

広告

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中