次の方法で共有


Office Space: 連絡先情報を Microsoft Excel にエクスポートする

Office Space

Office Space へようこそ。Office Space は、Microsoft® Office アプリケーションのスクリプト作成に関するヒントとテクニックを紹介する新しいコラムです。毎週火曜日と木曜日に新しいヒントを掲載します。過去のヒントについては、「Office Space アーカイブ」を参照してください。Microsoft Office でのスクリプト作成について質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

連絡先情報を Microsoft Excel にエクスポートする

Microsoft Outlook は、送信、整理など、電子メールの処理で必要なことは何でも実行するすばらしいプログラムであるばかりでなく、連絡先情報を格納するための便利な場所でもあります。Outlook では、"vCard" として送信された連絡先情報をインポートしたり、連絡先をソートおよび検索することができます。適切なハードウェアをお持ちの場合は、あなたに代わって電話をかけることもできます。Outlook で作業している限り、そのすべては本当にすばらしいものです。しかし、Outlook 以外で連絡先情報を扱いたい場合はどうでしょうか。Microsoft Excel や他のプログラムへ、連絡先情報をすばやくしかも簡単にエクスポートする方法はありますか。そのプロセスの "スクリプト" を作成する方法はありますか。

近日中にそのような質問を投げかけると、"いいえ" と答えるでしょう。そして、コラムはその瞬間にその場で終わりです。しかし、今日はついています。それどころか、今日の答えは "いいえ" ではありません。"もちろん"。手っ取り早い方法があるのです。そして、ここでその方法をお見せします。

四六時中、答え不要のわかりきった問いかけで飽きてこないでしょうか。気分転換に、何か違うことをやってみましょうか。きっと、そのほうがよくないですね。仕事に戻りましょう。いいですか。

連絡先情報を Excel にエクスポートする秘訣は、まず連絡先情報を取得することにあります。一度それを手に入れれば、実際、後は非常に簡単です。そのような理由から、最初に Outlook から連絡先情報を抽出する方法を見つけ出します。そのタスクを習得した後で、その情報を Excel ワークシートに書き込む方法についてお話しましょう。

: また、今日のコラムの内容を簡単にしておいたことも述べておいた方がよいでしょう。本日使用するスクリプトでは、主な連絡先フォルダで見つかった連絡先だけを取り出します。連絡先フォルダにサブフォルダがある場合はどうでしょうか。今日のスクリプトでは、それらを無視します。連絡先フォルダに配布リストがある場合はどうでしょうか。今日のスクリプトは、それらも無視します。あえてその配布リストから名前をすべて抽出することもしません。いずれも便利なタスクですが、当分は、連絡先リストから情報を取り込むことの背後にある基本原則に集中して取り組みます。他のタスクについては、近い将来に扱います。

以下は、Outlook アドレス帳にある連絡先すべての FullName プロパティおよび BusinessTelephoneNumber プロパティを取得するスクリプトです。

On Error Resume Next

Const olFolderContacts = 10

Set objOutlook = CreateObject("Outlook.Application")
Set objNamespace = objOutlook.GetNamespace("MAPI")

Set colContacts = objNamespace.GetDefaultFolder(olFolderContacts).Items

For Each objContact In colContacts
    Wscript.Echo objContact.FullName, objContact.BusinessTelephoneNumber
Next

このスクリプトでは、最初に定数 olFolderContacts を定義し、値を 10 に設定します。この定数を使用し Outlook の連絡先フォルダから情報を取得するようにスクリプトに指示します。続いて、以下のコード行を使用して、Outlook の現在のインスタンスにバインドします (このスクリプトでは、Outlook がすでに実行中であると仮定しています)。

Set objOutlook = CreateObject("Outlook.Application")

Outlook との接続を確立すると、GetNamespace メソッドを使用して MAPI 名前空間にバインドします。この名前空間 (実際、バインド "可能" な唯一の名前空間です) によって、フォルダ オブジェクトなど、Outlook にあるさまざまなオブジェクトを操作できます。実のところ、連絡先フォルダにあるすべての連絡先のリストを取得するためにしなければならないことは、次のコード行を使用することだけです。

Set colContacts = objNamespace.GetDefaultFolder(olFolderContacts).Items

ここでは連絡先のコレクションを返し、そのコレクションを定数 colContacts に格納しています。お分かりのように、GetDefaultFolder メソッドを呼び出し、最初に定義した値 olFolderContacts を渡します。同時に Items プロパティを要求します。これは、単に指定したフォルダにあるアイテムすべてのリストです。連絡先フォルダに接続中のため、Items プロパティは連絡先のコレクションから成り立っています。

後は簡単です。For Each ループを作成してコレクションを繰り返し、この場合は、連絡先の FullName と BusinessTelephoneNumber をエコーします。そして、この処理を行うと次のような情報を取得します。

Ken Myer (410) 555-9683
Pilar Ackerman (425) 555-2005
Jonathan Haas (425) 555-5581

なかなか便利ですね。言うまでもなく、FullName と BusinessTelephoneNumber は、連絡先で使用できる唯一のプロパティではありません。完全な一覧については、MSDNの 「Microsoft Outlook VBA Language Reference」 (英語) を参照してください。

OK。これは朗報です。悪い知らせはここからです。前述のスクリプトでエコー バックしたものは、すべて連絡先の名前と電話番号であることに気付いていることでしょう。電子メール以外のプロパティの値をエコーする限り、スクリプトを完全に自動化された方法で実行することができます。しかし、次のようなコードを使用して、連絡先の名前と電子メール アドレスをエコーするとします。

For Each objContact In colContacts
    Wscript.Echo objContact.FullName, objContact.Email1Address
Next

スクリプトでこの処理を行うことはできるのでしょうか。もちろん、可能です。この処理を、完全に自動化された無人の方法で行うことができますか。いいえ、できません。その代わり、スクリプトが Email1Address プロパティにアクセスするとすぐに、次のダイアログが画面上にポップアップします。

Microsoft Outlook

スクリプトを続行するには、このダイアログ ボックスにユーザーが答える必要があります (また For Each ループ内にいるため、"いいえ" と答えるとリストにある連絡先ごとにこのダイアログ ボックスに答える必要があります。"はい" と答えると、全連絡先に対して "はい" であると仮定されます)。答えないとダイアログ ボックスはタイムアウトになり、スクリプトは電子メール アドレスを取得できなくなります。

おそらくあなたが推測したように、これは Outlook に組み込まれたセキュリティ機能です。ウイルスによって、連絡先すべてに電子メールが送信されるのを回避するために用意されています。もちろん、ユーザの操作なしでスクリプトが終わることを確信して、スクリプトを開始してからその場を立ち去ってしまうこともできなくなります (救われるのは、アクセスを許可して [はい] をクリックすると、スクリプトは中断することなく動作することです)。今日は、Outlook セキュリティのいわれのすべてを詳しく調べたりしません。詳細については、「Microsoft Outlook 2003 SDK」(英語) のこの部分を参照してください。電子メール関連のプロパティを取得する場合は、このダイアログ ボックスを処理する必要があることを覚えておいてください。

OK。今度はこの情報を Excel にエクスポートすることについてはどうでしょうか。それは非常に簡単です。今日はスクリプトの Excel 部分については詳細に論じません。Excel ワークシートへのデータの書き込みに関する基本的な情報について知りたい場合は、MSDN の 「Scripting Clinic column」(英語) を参照してください。スクリプトは次のとおりです。Excel ワークシートに FullName と BusinessTelephoneNumber を書き込みます。

On Error Resume Next

Const olFolderContacts = 10

Set objOutlook = CreateObject("Outlook.Application")
Set objNamespace = objOutlook.GetNamespace("MAPI")

Set colContacts = objNamespace.GetDefaultFolder(olFolderContacts).Items

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Add()
Set objWorksheet = objWorkbook.Worksheets(1)

objExcel.Cells(1, 1) = "Name"
objExcel.Cells(1, 2) = "Business Phone"

i = 2

For Each objContact In colContacts
    objExcel.Cells(i, 1).Value = objContact.FullName
    objExcel.Cells(i, 2).Value = objContact.BusinessTelephoneNumber
    i = i + 1
Next

Set objRange = objWorksheet.UsedRange
objRange.EntireColumn.Autofit

FullName と BusinessTelephoneNumber プロパティのみでなく、それ以外のプロパティを追加したい場合はどうでしょう。こちらも非常に簡単です。やることは 2 つです。

最初に、他の列ヘッダーをいくつか作成します。たとえば、CompanyName プロパティと Birthday を追加するとします。この場合、列ヘッダーを構成するコードは次のようになります。

objExcel.Cells(1, 1) = "Name"
objExcel.Cells(1, 2) = "Business Phone"
objExcel.Cells(1, 3) = "Company"
objExcel.Cells(1, 4) = "Birthday"

次に、CompanyName と Birthday を For Each ループに追加する必要があります。ループでは、ワークシートに実際に情報を書き込みます。これは次のようになります。

For Each objContact In colContacts
    objExcel.Cells(i, 1).Value = objContact.FullName
    objExcel.Cells(i, 2).Value = objContact.BusinessTelephoneNumber
    objExcel.Cells(i, 3).Value = objContact.CompanyName
    objExcel.Cells(i, 4).Value = objContact.Birthday
    i = i + 1
Next

スクリプトを実行すると、ワークシートは次のようになります。

Microsoft Outlook

なかなか便利だと思いませんか。

いや。待ってください。これは答え不要の質問ではありません。あなたの答えをぜひ知りたいのです。待ってください。戻ってきてください。ねえ。