Share via


Outlook 2010 VBA の基礎知識

概要: この記事では、プログラマ以外の読者を対象に、Visual Basic for Applications (VBA) を使用して Microsoft Outlook 2010 の機能を拡張する方法を紹介します。このトピックでは、VBA 言語の概要、Outlook 2010 で VBA を使用する手順、Outlook VBA プログラミングの実践的問題に対する詳細な解決策、およびプログラミングとデバッグのヒントを説明します。

適用対象: Office 2010 | Outlook 2010 | VBA

この記事の内容
Outlook 2010 の VBA プログラミング
VBA プログラミングの基礎
マクロと Visual Basic Editor
マクロを使いやすくする
連絡先を編集するマクロ
コードの配布
まとめ
参考資料

目次

  • Outlook 2010 の VBA プログラミング

  • VBA プログラミングの基礎

  • マクロと Visual Basic Editor

  • 連絡先を編集するマクロ

  • コードの配布

  • まとめ

  • 参考資料

Outlook 2010 の VBA プログラミング

Outlook 2010 で複数の連絡先を繰り返しクリーンアップしていませんか。電子メールの大量の添付ファイルを 1 つずつハード ディスクに保存する作業が負担になっていませんか。特定の電子メール メッセージから自動的に予定表アイテムが作成されるようにできたらいいと思いませんか。Microsoft Outlook 2010 の連絡先を Microsoft Excel 2010 のスプレッドシートに効率よく転記する方法を求めてはいませんか。

このような作業やさらに多くのことを、Visual Basic for Applications (VBA) で実現できます。シンプルでありながら強力なプログラミング言語である VBA を利用すると、Office 2010 アプリケーションを拡張して新しい機能を追加したり、頻繁に行う作業を自動化したりできます。

この記事は、これから VBA について学んだり、プログラミングを活用して Outlook 2010 を各自のニーズに合うように調整する方法を探したりしている Outlook 熟練ユーザーを対象としています。

この記事を読む前に、VBA プログラミングの基本情報をより詳しく解説している「Office 2010 VBA の基礎知識」を参照することをお勧めします。

Office 2010 の 強力な VBA プログラミング機能を利用すると、マウス、キーボード、またはダイアログ ボックスから実行できるほぼすべての操作を VBA からも実行できます。また、一度 VBA から実行できるようにした操作は、100 回でも 1000 回でも繰り返し実行できます (実際、繰り返し作業の自動化は Office で VBA を使用する主要な用途の 1 つです)。

VBA では、日常的作業を効率化するだけでなく、Office 2010 アプリケーションに新しい機能を追加したり、それぞれのビジネス ニーズに合わせた方法でドキュメントのユーザーに操作を促したりユーザーと対話したりすることもできます。たとえば、Outlook 2010 で VBA を使用すると、標準のユーザー インターフェイスにはない方法で、連絡先、電子メール、予定表アイテム、または仕事の並べ替え、エクスポート、および変更を行うこともできます。

この記事のチュートリアルでは、VBA を使用して Outlook を自動化します。実践例を使用して、Outlook 熟練ユーザーが活用できるプログラミング、VBA、および開発ツールについて説明します。

アプローチの選択

VBA プログラミングは強力なソリューションですが、常に最適なアプローチであるとは限りません。目的によっては、別の手段を選択するほうが適切な場合もあります。

まず、もっと簡単な方法がないかを確認します。VBA プロジェクトを開始する前に、組み込みのツールや標準機能で実現できないか検討してください。たとえば、Outlook で時間のかかる作業が発生している場合、ルールを使って解決できないか検討します。最初の一回だけその操作を行って、Ctrl + Y キー (やり直し) でその操作を繰り返すという方法も検討してみてください。

Outlook 2010 は強力なアプリケーションなので、必要な解決策が既に用意されている可能性があります。プログラミングを始める前に、まず、Outlook 2010 の機能を十分確認してください。

VBA プロジェクトを開始する前に、VBA の作業に必要な時間を確保してください。プログラミングには作業に専念できる時間が必要となり、その作業にかかる時間数は予測できないこともあります。特に初心者の場合は、注意深く作業できる時間を確保せずにプログラミングを始めることはしないようにしてください。期限が迫っているときに、"間に合わせのスクリプト" を記述して問題を解決しようとすると、深刻な状況に陥ることがあります。時間がないときは、単調で繰り返しが多いとしても標準的な手段を利用してください。

VBA プログラミングの基礎

コードを使用してアプリケーションに処理を実行させる

コードを記述することは謎の多い難解な作業に思われることもありますが、その基本原理は日常的論理に基づいていて理解しやすいものです。Office 2010 アプリケーションは "オブジェクト" という概念を公開するように開発されており、各オブジェクトは命令を受け取ることができます。これは、電話機にボタンがあり、ボタンを介して電話機に操作を伝えるのと似ています。あるボタンを押すと電話機は命令を認識し、ダイヤルする番号を順序に従って受け取ります。プログラミングの世界では、アプリケーションとやり取りするためにそのアプリケーションに含まれる各種 "オブジェクト" に命令を送ります。さまざまなオブジェクトが用意されていますが、それぞれに制約があります。各オブジェクトはデザインされている機能だけを実行でき、命令されたことだけを実行します。

たとえば、ユーザーが Outlook で電子メール メッセージを作成し、宛先を選択し、メッセージの件名を入力し、[送信] をクリックする場合について考えてみます。VBA プログラミングの観点では、Outlook は MailItem というオブジェクトを公開しています。VBA コードを使用すると、この MailItem オブジェクトに件名と本文を設定し、保存するか送信するか指示できます。この記事では、このようなオブジェクトについてさらに詳しく解説し、オブジェクトがどのように編成されており、それらをどのように記述して操作するかを説明します。

オブジェクト、メソッド、およびプロパティ

プログラミング オブジェクトは階層構造で開発され、そのような階層をアプリケーションの "オブジェクト モデル" といいます。たとえば、Outlook の受信トレイは、Outlook の Namespace オブジェクト内に含まれている Folder オブジェクトの 1 つです。その Folder オブジェクトにはさらに MailItem オブジェクトが含まれ、このように階層構造が続きます。オブジェクト モデルは、視覚的なユーザー インターフェイスとほぼ対応しています。オブジェクト モデルはアプリケーションとその機能の概念マップです。プログラミング上は、Folder オブジェクトにはどんな種類のアイテム オブジェクトも含めることができますが、Outlook ユーザー インターフェイスの各フォルダーに通常含まれるのは、主に特定の種類のアイテム オブジェクトになります。たとえば、Outlook ユーザー インターフェイスにある連絡先フォルダーには、主に ContactItem オブジェクトが含まれ、予定表フォルダーには、主に AppointmentItem オブジェクトと MeetingItem オブジェクトが含まれます。

各オブジェクトを定義するものを "クラス" といいます。そのため、オブジェクトとクラスという 2 つの用語が同じ意味で使用されているように見えることがあります。厳密には、クラスは実際のオブジェクトを作成 ("インスタンス化") するために使用する定義またはテンプレートです。

オブジェクトを作成した後は、そのオブジェクトの "プロパティ" を設定したり、そのオブジェクトの "メソッド" を呼び出したりすることによって、オブジェクトを操作できます。オブジェクトが名詞だとすると、プロパティはその名詞を修飾する形容詞、メソッドはその名詞の述語となる動詞です。プロパティを変更すると、オブジェクトの外観や動作が変わります。オブジェクトのメソッドを呼び出すと、オブジェクトにアクションを実行させることができます。

Outlook のオブジェクト モデルの基本レイアウトと、現在の状態にアクセスするための Application、Explorer、Folder の各オブジェクトの主要プロパティを理解しておくと、VBA を使用した Outlook の拡張と操作を開始できます。

マクロと Visual Basic Editor

Outlook 2010 アプリケーションからオブジェクト モデルが公開されていることがわかったので、今度は、オブジェクトのメソッドを呼び出したり、オブジェクトのプロパティを設定したり、オブジェクトのイベントに応答したりすることを試したくなります。これを行うには、Office で認識できる場所と方法でコードを記述する必要があります。これには、通常、Visual Basic Editor を使用します。Visual Basic Editor は既定でインストールされますが、リボンで使用できるようになっていないと、多くのユーザーはこれを使用できることに気付きません。

[開発] タブを開く

すべての Office 2010 アプリケーションではリボンを使用しています。このリボンにある [開発] タブから、Visual Basic Editor とその他の開発者ツールを使用できます。既定では、Office 2010 に [開発] タブは表示されないので、以下の手順でこれを有効にする必要があります。

[開発] タブを有効にするには

  1. [ファイル] タブの [オプション] を選択して [Outlook のオプション] ダイアログ ボックスを表示します。

  2. ダイアログ ボックスの左側にある [リボンのユーザー設定] をクリックします。

  3. ダイアログ ボックスの左側にある [コマンドの選択] で、[基本的なコマンド] を選択します。

  4. ダイアログ ボックスの右側にある [リボンのユーザー設定] で、[メイン タブ] を選択し、次に [開発] チェック ボックスをオンにします。

  5. [OK] をクリックします。

注意

Office 2007 では、[開発] タブを表示するには、Office ボタンをクリックし、[オプション] をクリックし、次に [オプション] ダイアログ ボックスの [基本設定] カテゴリで [[開発] タブをリボンに表示する] チェック ボックスをオンにしていました。

[開発] タブを有効にすると、そこに [Visual Basic] ボタンと [マクロ] ボタンがあることもすぐにわかります。

図 1. Outlook 2010 の [開発] タブ

Outlook 2010 の [開発] タブ

セキュリティの問題

既定では、ウイルスやその他の悪意のあるコードから保護するために、Outlook の VBA マクロは無効になっています。マクロを有効にするには、以下の手順を使用します。

マクロを有効にするには

  1. [ファイル] タブの [Outlook のオプション] を選択して [Outlook のオプション] ダイアログ ボックスを開き、[セキュリティ センター] をクリックします。

  2. [セキュリティ センターの設定] をクリックし、次に左側にある [マクロの設定] オプションをクリックします。

  3. [すべてのマクロに対して警告を表示する] を選択し、[OK] をクリックします。このオプションを選択すると、Outlook でマクロを実行できるようになりますが、マクロを実行する前に、そのマクロを実行するかどうかを確認するメッセージが表示されます。

  4. 設定の変更を有効にするために、Outlook を再起動します。

Visual Basic Editor

[開発] タブを表示したら、そこから Visual Basic Editor を開くことができます。Visual Basic Editor は、Outlook の VBA コードを記述したり編集したりするために使用する組み込みのツールです。以下の手順で Visual Basic Editor を開きます。

Visual Basic Editor を開くには

  1. [開発] タブの [マクロ] をクリックします。

  2. 表示される [マクロ] ダイアログ ボックスで、[マクロ名] に「Test」と入力します。

  3. [作成] をクリックすると、Visual Basic Editor が開き、そこに新しいマクロのアウトラインが既に入力されています。

Visual Basic Editor には、以下のコードが含まれます。

    Sub Test()
    End Sub

Sub は "サブルーチン" を表し、ここではこれを "マクロ" として定義できます。Test マクロを実行すると、Sub Test() と End Sub の間に記述されたコードが実行されます。

以下のコードのように、このマクロを編集します。

    Sub Test()
       MsgBox("Hello world")
    End Sub

図 2. Visual Basic Editor 内の Test マクロ

Visual Basic Editor でのマクロのテスト

Visual Basic Editor の左側にある作業ウィンドウに注目してください。Test マクロは、Project1 の Module1 内にあります。各プロジェクトには複数のモジュールが含まれ、各モジュールには複数の VBA コードが含まれ、各 VBA コードは .bas ファイルとしてインポートまたはエクスポートできます。

オブジェクトが作成された後は、そのオブジェクトの "プロパティ" を設定したり、"メソッド" を呼び出したりすることによって、オブジェクトを操作できます。この例で編集したサブルーチンにはメソッドが 1 つ含まれており、そのコードによってアクションが実行されます。このサブルーチン内の Test() メソッドは、オブジェクト Project1 のメンバーになります。

注意

他の Office アプリケーションでは、Visual Basic Editor に複数のプロジェクトが表示されることもありますが、Outlook VBA で表示されるプロジェクトは 1 つだけであり、常に Project1 という名前が付いています。

Outlook の [開発] タブに戻り、もう一度 [マクロ] をクリックします。表示される一覧から Project1.Test マクロを選択し、[実行] をクリックすると、"Hello, world!" というテキストが含まれる小さなメッセージ ボックスが表示されます。

成功です。これで、Outlook にカスタム VBA コードを作成して実装することができました。[OK] をクリックすると、メッセージ ボックスが閉じてマクロの実行が完了します。

メッセージ ボックスが表示されない場合は、マクロのセキュリティの設定を確認してから Outlook を再起動してください。

マクロを使いやすくする

頻繁に使用するマクロは、キーボード ショートカットまたはクイック アクセス ツール バーのボタンから実行できるようにすると便利です。

クイック アクセス ツール バーTest マクロのボタンを作成するには、以下の手順を使用します。

クイック アクセス ツール バーにマクロのボタンを作成するには

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

  2. [オプション] をクリックして [Outlook のオプション] ダイアログ ボックスを表示し、次に [クイック アクセス ツール バー] をクリックします。

  3. [コマンドの選択] の一覧から [マクロ] を選択します。表示される一覧で Project1.Module1.Test というテキストを探し、そのテキストを選択します。

  4. [追加 >>] をクリックしてマクロを右側の一覧に追加し、次に [変更…] をクリックして、このマクロと関連付けるボタン イメージを選択します。

  5. [OK] をクリックします。[ファイル] タブの上のクイック アクセス ツール バーに新しいボタンが表示されます。

これで、[開発] タブを使用しなくても、作成したマクロをいつでもすぐに実行できるようになりました。試してみてください。

図 3. クイック アクセス ツール バーにマクロを追加する

クイック アクセス ツール バーへのマクロの割り当て

連絡先を編集するマクロ

仮に、Example Systems という会社に複数の連絡先があり、それぞれの連絡先に @example.com ドメインの電子メール アドレスが設定されているとします。この Example Systems 社を Example Networks 社が買収し、全社員の電子メール アドレスが @example.net ドメインに変更されました。Example Systems 社の連絡先が 1 人か 2 人ならアドレスを手動で簡単に変更できます。しかし、20 人や 50 人、100 人の場合には、このような繰り返し作業を自動化することも Office VBA の一般的な用途の 1 つです。

この記事では、Outlook で VBA を使用してこのような連絡先を変更する方法を説明し、VBA の概念についても解説します。

連絡先フォルダーにアクセスする

Test マクロを作成したときと同じ手順で、CompanyChange という新しいマクロを作成し、Visual Basic Editor で開きます。

まず、Outlook の連絡先フォルダー オブジェクトにアクセスし、そのオブジェクトへの参照を変数に格納します。

プログラミングの "変数" とは、値またはオブジェクトへの参照を一時的に保持する名前付きオブジェクトです。以下のサンプル コードでは、ContactsFolder という変数を使用します。このコードは、Folder オブジェクトをこれから使用することを VBA に宣言し、Session オブジェクトの GetDefaultFolder メソッドを実行して Contacts フォルダーを取得し、そのフォルダーへの参照をこの変数に格納します。

Visual Basic Editor には、コード記述を支援する IntelliSense という自動入力機能があります。「Session.GetDefaultFolder」と入力した後、パラメーターを囲むための左かっこ「(」を入力してください。すると、Visual Basic Editor によって選択肢の一覧が自動的に表示されます。下方向キーまたはマウスを使用して、選択できるフォルダーの種類の 1 つ、olFolderContacts を強調表示し、Tab キーでこれを選択します。

図 4. IntelliSense を使用してフォルダーの種類を選択する

Intellisense を使用したフォルダーの種類の選択

コードを記述するとき、誤入力防止のためにコピーと貼り付けを利用するのもよい方法ですが、ここでは Visual Basic Editor に直接コードを入力して、エディターの自動入力機能を体験してみてください。

    Sub CompanyChange()
        Dim ContactsFolder as Folder
        Set ContactsFolder = Session.GetDefaultFolder(olFolderContacts)
    End Sub

もう 1 行追加して、フィードバックを表示して実行中にマクロをテストできるようにします (さらに、「マクロを使いやすくする」セクションの手順と同じ方法で、クイック アクセス ツール バーに CompanyChange マクロのボタンを作成してください)。

    Sub CompanyChange()
        Dim ContactsFolder as Folder
        Set ContactsFolder = Session.GetDefaultFolder(olFolderContacts)
        MsgBox ("Contacts Found: " & ContactsFolder.Items.Count)
    End Sub

Items は Folder オブジェクトのプロパティであり、Count は Items プロパティのプロパティです。

このマクロを実行すると、Outlook 内の連絡先の数がメッセージ ボックスに表示されます。

連絡先フォルダーを開き、架空の Example Systems 社の社員数人の連絡先を作成します (未作成の場合)。これらのサンプル連絡先に会社名「Example Systems」を指定し、それぞれに「someone@example.com」のような個別の電子メール アドレスを設定します。

オブジェクトのコレクション

"コレクション" は、VBA のような現代のプログラミング言語における最も強力な機能の 1 つです。コレクションはオブジェクトの集合であり、1 つのプロパティに格納でき、これを使用すると含まれる各オブジェクトの順次処理が容易になります。この例では、コードで連絡先のコレクション内をループして、Example Systems 社の社員を探します。

前述のとおり、ContactsFolder 変数を使用して、フォルダー内の Items コレクションにアクセスできます。連絡先フォルダー内の Items コレクションからは、ContactItem 型のオブジェクトの集合が返されます。それぞれの ContactItem への参照を格納するために、もう 1 つの変数を作成します。

    Dim Contact As ContactItem

コレクションから返されるオブジェクトの型が不明の場合は、汎用 Object 型を使用することもできます。ただし、オブジェクトの型がわかっている場合は、固有の型を指定するほうが多くの利点があります。

    Dim Contact As Object

ContactItem を取得したら、各連絡先の会社名を検査します。ContactItem オブジェクトには各連絡先の情報が格納されているので会社名用のプロパティもありますが、そのプロパティの名前が不明の場合、以下の 2 つの方法のどちらかを使用して、プロパティの名前を確認する必要があります。

プロパティ名を確認する

VBA でオブジェクトを十分に活用するには、そのオブジェクトのプロパティとメソッドを知っている必要があります。Web に記載されているサンプル コードなどを参考にすることでも多くの操作を実行できますが、使用するオブジェクトについて体系的に調べておくと、選択肢が広がり、デバッグ作業量の軽減と時間の節約にもなります。

たとえば、コード内で ContactItem を選択した状態で F1 キーを押すと、ヘルプが表示され、Outlook 開発者用リファレンス内の ContactItem の情報を参照できます。ヘルプ内で「ContactItem」を検索する方法もあります。各種トピック内のリンクから、関連オブジェクトの情報も調べてください。

開発者用リファレンスは、VBA プログラミングに大きく役立つ資料であり、コードに必要なプロパティを探す手段の 1 つです。ContactItem オブジェクトに関する全般的な説明を参照した後、「ContactItem オブジェクト メンバー」リンクをクリックしてメソッドとプロパティの一覧を確認してください (プロパティとメソッドを総称して "メンバー" といいます)。

このリスト内を探すと、CompanyName というプロパティが見つかります。これが目的のプロパティであると推定できます。

プロパティやメソッドを探すには、Outlook 開発者用リファレンスを参照する方法以外に、Visual Basic Editor で IntelliSense を利用する方法もあります。変数 Contact を ContactItem として定義した後、「Contact」と入力し、続いてピリオド (.) を入力すると、ヘルプに表示されるのと同じメンバーの一覧が表示されます。IntelliSense の入力候補からいずれか 1 つを選択するには、上方向キーと下方向キーまたはマウスを使用して目的のメンバーを強調表示し、次に Tab キーを押してそれを選択します。

IntelliSense ではメンバーの説明は表示されません。したがって、この方法が最も役立つのは、選択するメンバーが明白な状況のとき、またはメンバーの名前はわかっていても正確なスペルを覚えていないときです。メンバー名のスペルを誤って入力するとエラーが発生しますが、そのエラーはマクロを実行するまで Visual Basic Editor では検出されません。

コレクション内をループ処理する

コレクションを取得し、そのコレクションに含まれているオブジェクトの型がわかり、それらのオブジェクトのプロパティのうちどれを使用するかもわかりました。次は、For Each ループを使用して、コレクション内をループし、含まれているオブジェクトを処理します。

以下のような構文で行います。

    For Each [object variable] in [a collection that contains that type of object]
    [do something with] [object variable].Property
    Next

これを実際のコードに書き換えると以下のようになります。MsgBox ステートメントの行を以下のように変更します。

    For Each Contact In ContactsFolder.Items
       Debug.Print Contact.CompanyName
    Next

このマクロを実行する前に、Visual Basic Editor のイミディエイト ウィンドウを開いてください。これを開くには、メニュー バーの [表示] をクリックし、次に [イミディエイト ウィンドウ] をクリックします。ここまでのサンプル コードでは、フィードバックの表示に MsgBox を使用していました。MsgBox も便利ですが、[OK] をクリックしないと、次のメッセージを表示できません。これに対し、Debug.Print は、操作を待つことなく、イミディエイト ウィンドウに 1 行ずつ出力を送ります。作成したスクリプトの実行後には、イミディエイト ウィンドウで会社名の一覧を確認できます。これは開発者用に表示される情報であり、このマクロを配布する先のユーザーには表示されません。

If ステートメントで処理を決定する

目的の作業を達成するには、このマクロで、Example Systems 社の連絡先だけを変更し、それ以外の連絡先はそのままにする必要があります。このような条件依存のロジックこそ、プログラミングの力が発揮される部分です。ここでは、If ステートメントを使用して、指定した条件が真の場合だけ、必要なコードを実行し、それ以外の場合は、End If ステートメントの後のコードへスキップするように VBA に指示します。

    If [some condition is true] Then
    ' do things
    End If
    ' continue on whether or not the condition was true

このサンプルの目的の処理を決定する条件は、現在の ContactItem の CompanyName プロパティに文字列 "Example Systems" が設定されているかどうかです。

以下のコードでは、二重引用符が使用されている点に注目してください。文字列の値 (テキスト値) は、数値とは異なり、常に二重引用符で囲みます。一方、一重引用符はコード作成者や他の開発者用のコメントを表し、VBA では無視されます。

条件を処理するコードを追加して、スクリプト全体が以下のようなコードになるように編集します。

    Sub CompanyChange()
        Dim ContactsFolder As Folder
        Set ContactsFolder = Session.GetDefaultFolder(olFolderContacts)
        MsgBox ("Contacts Found:" & ContactsFolder.Items.Count)
        
        Dim Contact As ContactItem
    
        For Each Contact In ContactsFolder.Items
            If Contact.CompanyName = "Example Systems" Then
                Debug.Print "Found: " & Contact.FullName
            End If
        Next
    End Sub

このコードを実行すると、イミディエイト ウィンドウに Example Systems 社の連絡先の名前の一覧が表示されます。

図 6. イミディエイト ウィンドウに出力を表示する

イミディエイト ウィンドウを使用した出力の表示

ここで使用する Debug.Print でも、前の MsgBox でも、出力をわかりやすくするために、"Found: " のような固定文字列と、プロパティから返される値を連結しています。これを行うには、2 つのテキスト文字列を文字列連結演算子 (&) を使用してつなぎます。

重要

重要: このチュートリアルをこれ以降進めるには、十分注意してください。ここでは、Example Systems 社の架空の連絡先を処理するために、Outlook 内の実際の連絡先を操作することになります。実際に使用している連絡先の会社名を "Example Networks" に変更しないように注意してください。

会社名を変更する

完成まではもう少しです。連絡先を読み込み、それらをループ処理し、Example Systems 社の連絡先を区別できるようになりました。会社名を Example Networks に変更するには、CompanyName プロパティを変更し、Save メソッドを呼び出して変更を確定します。

    If Contact.CompanyName = "Example Systems" Then
        Contact.CompanyName = "Example Networks"
        Contact.Save
        Debug.Print "Changed: " & Contact.FullName
    End If

このマクロを実行し、終了したら、Example Systems 社の連絡先の会社名が Example Networks に変更されていることを確認します。このスクリプトを再度テストする場合は、事前に会社名を Example Systems に戻しておく必要があることに注意してください。これを行うには、手動で変更するか、会社名を元に戻す別のマクロを作成します。

スクリプトの実行上は不要でも、Debug.Print ステートメントは残しておきます。作成者やユーザーにとって、マクロからのフィードバックは多いほど役に立ちます。

電子メール アドレスを変更する

CompanyName プロパティの変更では、単純に文字列全体を変更しました。電子メール アドレスのドメイン名の部分だけを @example.com から @example.net へ変更するには、文字列操作が必要になります。各文字列には組み込みの番号付けシステムがあり、文字列内の各文字は、1 から始まるインデックス番号で識別されます。VBA の各種関数を使用して、文字列の全体または一部を操作できます。文字列操作を学ぶと、VBA プログラマとして対応できる範囲が大きく広がります。プログラミングの多くの状況において、部分文字列を検査したり、文字列の一部を変更したりすることが必要になるからです (Web で "VBA 文字列関数" を検索すると、役立つリストや使用例が多数見つかります)。

Replace 関数を使用すると、部分文字列を単純に置換できます。ただし、文字列操作にもっと複雑なコーディングが必要になる状況も頻繁にあります。Contact.Save を呼び出すコードの直前に、以下のコード行を追加してください。

    Contact.Email1Address = Replace(Contact.Email1Address, "example.com", "example.net")

このコードを左から順に見ていきます。まず、Contact の Email1Address プロパティ (1 番目の電子メール アドレス) に、新しい値が割り当てられます。この新しい値は、Replace 関数を呼び出して取得されます。この関数は、現在の Contact.Email1Address プロパティを調べ、文字列 "example.com" が検出されると、それを "example.net" に置換します。

架空の連絡先の会社名が Example Systems に設定されていることを確認してから、このスクリプトを実行します。該当する全連絡先の電子メール アドレスのドメイン名が @example.net に変更され、会社名が Example Networks に変更されます。

コードを汎用化する

これで十分に役立つマクロが完成しましたが、用途は限定的であり、別の会社名を指定するにはコードを編集することが必要になります。このコードを汎用的に使用できるようにするには、InputBox 関数を使用してユーザーからの入力を受け取るようにします。

完成したコードは以下のようになります。これは 1 つの完成された実用的 Outlook ソリューションです。

    Sub CompanyChange()
        Dim ContactsFolder As Folder
        Set ContactsFolder = Session.GetDefaultFolder(olFolderContacts)
        Dim OldCompanyName As String
        Dim NewCompanyName As String
        Dim OldEmailDomain As String
        Dim NewEmailDomain As String
        Dim ContactsChangedCount As Integer
        
        ' Ask user for inputs
        MsgBox ("This script will change all of your contacts from one company to another.")
        OldCompanyName = InputBox("Under what name are the contacts listed in Outlook now?")
        NewCompanyName = InputBox("What is the new company name to set them to?")
        OldEmailDomain = InputBox("What is the e-mail domain name currently listed after the @ sign? e.g. mycompany.com")
        NewEmailDomain = InputBox("What should the e-mail domain be set to? Leave blank and click OK if no change")
        ContactsChangedCount = 0
        
        Dim Contact As ContactItem
     
        ' loop through Contacts and set those who need it
        For Each Contact In ContactsFolder.Items
            If Contact.CompanyName = OldCompanyName Then
                Contact.CompanyName = NewCompanyName
                If NewEmailDomain <> "" Then
                    Contact.Email1Address = Replace(Contact.Email1Address, OldEmailDomain, NewEmailDomain)
                End If
                Contact.Save
                ContactsChangedCount = ContactsChangedCount + 1
                Debug.Print "Changed: " & Contact.FullName
            End If
        Next
        ' confirm and clean up
        MsgBox (ContactsChangedCount & " contacts were changed from '" & OldCompanyName & "' to '" & NewCompanyName)
        Set Contact = Nothing
        Set ContactsFolder = Nothing
    End Sub

コードの配布

コードの開発に使用したコンピューターから他のコンピューターへコードを移動することを、"展開" といい、これもプログラミング プロジェクトの重要な部分となります。このセクションでは、新しく作成したマクロを他のコンピューターへ移動する方法について説明します。

まず、背景情報を少し説明します。Outlook の Visual Basic for Applications コードは、個人用のマクロ開発環境として開発されたものであり、展開や配布を行うことを前提としていません。したがって、Excel、Word などの他の Office アプリケーションのようにドキュメント内にマクロを保存する方法は、用意されていません。

Outlook の VBA マクロをコンピューター間で移動する方法の 1 つは、移動元のコンピューターでコード モジュールをエクスポートし、移動先のコンピューターでそれをインポートすることです。また、プロジェクトのソース コードをコピーし、移動先のコンピューターで Visual Basic Editor を使用して Project1 に貼り付ける方法もあります。

ある程度の人数のユーザーに配布する目的でソリューションを開発する場合は、Visual Basic for Applications コードを Outlook COM アドインに変換します。ただし、通常、COM アドインを開発するには、短いマクロを作成する場合よりずっと多くのプログラミング知識が必要になります。したがって、Visual Basic for Applications プロジェクトが比較的単純な内容で、それを必要とするユーザーの数が多くない場合には、Visual Basic Editor を開いてコード モジュールを手動でインポートする手順の説明を添えてコードをユーザーに送ってください。

モジュールのインポートとエクスポート

Module1 にある新しいマクロをエクスポートしてインポートしてみます。[プロジェクト] 作業ウィンドウで [Module1] を選択し、Visual Basic Editor の [ファイル] メニューをクリックし、[ファイルのエクスポート] をクリックします。ファイルを Basic ファイル (.bas) として保存するためのダイアログ ボックスが表示されます。Contacts.bas というファイルに保存します (これ以外の拡張子が既定のファイル名拡張子になっている場合は、[Module1] を選択していることを確認してから、[ファイルのエクスポート] ダイアログ ボックスを再度表示します)。

Contacts.bas をメモ帳で開くと、作成したコードの前に、コードをインポートするときに Visual Basic Editor でモジュール名の指定に使用されるヘッダー行が含まれているのがわかります。

    Attribute VB_Name = "Module1"

Module1 は、ローカルで暫定的にスクリプトに使用される名前なので、このモジュール内のマクロを表す名前に変更します。たとえば, .bas ファイル名と揃えて「Contacts」というモジュール名にします。後日、連絡先に関する他の操作を自動化する別のマクロを作成する場合も、このモジュールにコードを追加して、同じ論理グループの複数のマクロを 1 つのモジュールにまとめることもできます。

    Attribute VB_Name = "Contacts"

また Visual Basic Editor に戻ります。[ファイル] をクリックし、[ファイルのインポート] をクリックし、次に Contacts.bas を選択してこのファイルをインポートします。

[プロジェクト] 作業ウィンドウの [Modules] リストに表示される新しい Contacts モジュールをダブルクリックして、コードを表示します。

Outlook で、[開発] タブの [マクロ] ボタンをクリックします。[…Project1.Contacts.CompanyChange] というエントリが表示されます。

これで、マクロ コードを組織内の他のメンバーに配布する最も簡単な手順は完了です。配布先ユーザーが Visual Basic Editor で Contacts.bas をインポートして Contacts モジュールを追加するには、そのユーザーも Outlook 2010 で [開発] タブを有効にする必要があります。ユーザーは、Contacts.bas をインポートした後、[開発] タブからこのマクロを実行できます。また、[Outlook のオプション] を開いて、クイック アクセス ツール バーのボタンやリボン自体にマクロを割り当てることもできます。より複雑な展開方法の詳細については、「参考資料」セクションを参照してください。

まとめ

この記事では、Microsoft Outlook の Visual Basic for Applications (VBA) の機能について解説しました。VBA を使用すると、繰り返し作業を自動化して Outlook 2010 を強化できます。この記事では、VBA プログラミングの実践的サンプルも使用して、[開発] ツール バーを開く方法、マクロを作成する方法、そのマクロを実行、編集、およびデバッグする方法について説明しました。また、VBA の変数、オブジェクト モデル、および If、For Each などの機能についても説明しました。

参考資料

詳細については、次のリソースを参照してください。