
Office Space へようこそ。Office Space は、Microsoft® Office アプリケーションのスクリプト作成に関するヒントとテクニックを紹介する新しいコラムです。毎週火曜日と木曜日に新しいヒントを掲載します。過去のヒントについては、Office Space アーカイブを参照してください。Microsoft Office でのスクリプト作成について質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
先週は、スクリプトを使用して Outlook 連絡先フォルダにある連絡先すべてのリストを取得する方法だけでなく、そのリストを Microsoft Excel にエクスポートする方法をお見せするスクリプトを特集しました。
どうもありがとうございます。しかし、どうか拍手は最後までお待ちください。
とにかく私たちは、そのスクリプトをどちらかと言えば Outlook における連絡先の処理の入門として位置づけましたが、連絡先フォルダにあるサブフォルダから連絡先を取得するようなタスクや、Outlook 配布リストのメンバすべてに関する情報をエコー バックするようなタスクなど、特定のタスクを扱わないことにしました。きっと、あなたはひそかに考えたことでしょう。"なるほど。これは連絡先の処理の入門なのか。ということは、読者の利益を常に最優先に考えている Scripting Guys は、私たちのために内容をずいぶん簡単にしてくれているのだ。すばらしい考えだ。さすが、Scripting Guys。"
ありがとう。あなたの言うとおりです。私たちが実際にそんなことを考えたんだったら、それはすばらしい考えだったでしょう。しかし実を言えば、このコラムを担当している Scripting Guy は、正確には技術の最先端にいるわけではないのです。自分の携帯電話を持っていないし (いいえ。彼の脳がいかれているわけではありません。少なくともそれほどは)、ハイビジョン テレビの何がすごいのかわかりません。さらに、彼の連絡先フォルダにはサブフォルダも配布リストもありません。したがって、見張り役の編集者が彼にがみがみ言い続けるまで、これらのことに全く気付きませんでした。
いや。見張り役の編集者が "なんとか彼らに気付かせてくれるまで" という意味ですよ。
それにもかかわらず、この Scripting Guy は非常に怠惰で先週の記事にあったこの問題に取り組まず、"近い将来に" 対応すると約束してしまったのです。全くのところ、我々も彼のことを信じられませんでした。でも、聞いてください。今日は、Outlook 配布リストのメンバを取得する方法を紹介してくれるというのです。
彼が Outlook 配布リストを作成したらすぐに...もう少し待ってあげましょう。はい、準備ができたようです。
やあ、みなさん。今日のコラムへようこそおいでいただきました。どうやら、Outlook 配布リストのメンバすべてを一覧表示することに関心がおありのようですね。なぜそのように言ってくださらなかったのですか。Outlook の連絡先フォルダにある全配布リストのメンバをすべて報告するスクリプトがあります。スクリプトを確認しながら、どのように動作するかについてお話していきましょう。
Const olFolderContacts = 10
Set objOutlook = CreateObject("Outlook.Application")
Set objNamespace = objOutlook.GetNamespace("MAPI")
Set colContacts = objNamespace.GetDefaultFolder(olFolderContacts).Items
intCount = colContacts.Count
For i = 1 To intCount
If TypeName(colContacts.Item(i)) = "DistListItem" Then
Set objDistList = colContacts.Item(i)
Wscript.Echo objDistList.DLName
For j = 1 To objDistList.MemberCount
Wscript.Echo objDistList.GetMember(j).Name & " -- " & _
objDistList.GetMember(j).Address
Next
Wscript.Echo
End If
Next
ごもっともです。スクリプトはあまり長くありませんが、少し複雑に見えますよね。これは、Outlook に配布リストのコレクションを取り込む簡単な方法 (たとえば、Active Directory を検索して、ユーザーまたはグループのリストを素早く取得するような方法) が用意されていないためです。その代わり、連絡先フォルダのアイテムをどれもこれも調べて、アイテムが配布リストであるかどうかを確認するためにチェックする必要があります。配布リストの場合は、そのアイテム (配布リスト) にバインドし、そのメンバすべてを系統的にエコー バックすることができます。配布リストでない場合は、スキップして連絡先フォルダの次のアイテムをチェックします。古臭くて強引なメソッドですが、これがうまくいくのです。
あ、そんなこと言わないでください。それほど悪くないでしょ。実際、スクリプトは非常に簡単に起動します。まず、定数 olFolderContacts を定義し、値を 10 に設定します。この定数を使用して、どの Outlook フォルダにバインドするかをスクリプトに指示します。続いて、Outlook.Application オブジェクトのインスタンスを作成し、GetNamespace メソッドを使用して MAPI 名前空間にバインドします (ところでこの名前空間は、バインド可能な唯一の名前空間です。いずれにせよ、このコード行をスキップすることはできません。スキップすれば、スクリプトは失敗します)。
MAPI 名前空間への接続を確立した後で、連絡先フォルダにバインドして、そのフォルダに格納されているアイテムすべてのコレクションを取得します。これが、次のコード行で実行していることです。
Set colContacts = objNamespace.GetDefaultFolder(olFolderContacts).Items
コレクションを取得すると、Count プロパティを使用して、フォルダにあるアイテム数を調べます。その理由は? 覚えていますか。各アイテムを個々に調べて、それが配布リストであるかどうかを確認しなければなりません。そのためには、1 からフォルダで見つかったアイテム数だけ実行する For Next ループを設定する必要があります (つまり、連絡先フォルダにアイテムが 69 個ある場合は、ループは 69 回実行されます)。
それでは、アイテムが配布リストであるかどうかはどのように確認しますか。次のコード行を使用します。
If TypeName(colContacts.Item(i)) = "DistListItem" Then
ここでは、VBScript 関数 TypeName を使用して、具体的に何を処理しているかを見つけ出しています。TypeName は、変数情報を返すために使用されます。たとえば、TypeName に文字列変数の名前を渡すと、"String" を返します。Null 変数の名前を渡すと、"Null" を返します。ただし、オブジェクト名を渡すと、そのオブジェクトの名前を返します。Outlook オブジェクト モデルでは、配布リストは、DistItemList オブジェクトのインスタンスです。したがって、アイテムの TypeName が "DistListItem" と等しいかどうかをチェックします。
配布リストが見つかった場合どうしますか。リスト自体にバインドして、DLName (リスト名) をエコー バックします。これには、次の 2 行のコードが必要です。
Set objDistList = colContacts.Item(i) Wscript.Echo objDistList.DLName
続いて 2 つ目の For Next ループを作成します。これは、1 から配布リストに登録されている人数までループします。特定の配布リストの人数はどのようにわかりますか。それは簡単です。MemberCount プロパティの値をチェックするだけです。
For j = 1 To objDistList.MemberCount
リストに登録されているそれぞれの人について、名前および電子メール アドレスをエコー バックします。
Wscript.Echo objDistList.GetMember(j).Name & " -- " & _
objDistList.GetMember(j).Address
GetMember メソッドを使用して、各受信者の Name (名前) と Address (アドレス) を取得します。おそらくお気づきのように、GetMember メソッドは、インデックス番号を渡すと呼び出され、そのインデックス番号の配布リスト メンバの情報を取得します。
このスクリプトを実行すると、次のような出力を取得します。
IT List Ken Myer -- kenmyer@fabrikam.com Pilar Ackerman -- packerman@contoso.com Jonathan Haas -- jhaas@contoso.com
質問が出る前にお答えしますが、会社の電話番号や誕生日などの情報はエコー バックできません。なぜでしょうか。それは簡単です。その情報は、配布リストに含まれているどんな人も利用できないからです。会社電話番号と誕生日は Outlook 連絡先のプロパティですが、配布リストの人々は連絡先ではないからです。その代わり、それらは Recipient オブジェクトのインスタンスです。このオブジェクトには、相対的にほとんどプロパティがありません (完全な一覧については、「Microsoft Outlook VBA Language Reference」(英語) を参照してください)。
もちろん、配布リストに Outlook 連絡先を入れることができます。この場合には、これらの人々に連絡先としてアクセスしたときに限り、その他すべてのプロパティ (会社電話番号と誕生日など) を利用することができます。受信者 (つまり配布リストのメンバ) としてアクセスすると、限定されたプロパティのセットしか動作しなくなります。
すでに述べたように、スクリプトで使用した Address プロパティは、受信者の電子メール アドレスです。電子メール アドレスを処理するため、Outlook のセキュリティに従います。スクリプトを実行すると、次のダイアログ ボックスが画面上に表示されます。

[アクセスを許可する時間] チェック ボックスを選択し、時間を指定して、[はい] をクリックすると、スクリプトは受信者の電子メール情報を取得することができます。
さて、サブフォルダにある連絡先すべてを一覧表示することについてですが...そのとおりですね。1 日では配布リストだけで十分ですね。サブフォルダについては、別の機会にお話しましょう。
では、そのときに。えっ、どこにでも持っていくことができる小さい携帯電話が本当にあるんですか。すばらしい。テレビはカラーで画像を映すって。すごいなあ。