◆概要ActiveXテクノロジとオブジェクト指向がMicrosoftの各アプリケーションに取り入れられてから、複数のアプリケーション間で一つのデータを使いまわすことが、かなりのレベルでできるようになりました。VBAのコードの中でWordを操作して印刷させたり、データベースのデータをExcelに落として加工し、Outlookで配信するという、ひとつの処理に複数のアプリケーションを介在させて業務を処理してゆくことが可能になっています。本資料では、Officeアプリケーションの操作やデータ交換にどのような方法があるかを整理してみました。これからOfficeアプリケーションを組み合わせて業務を処理してみようとお考えの方は参考にしてください。◆他のOfficeアプリケーションを利用するExcelから他のOfficeアプリケーションを操作するには、いくつかの方法が用意されています。対象アプリケーションを起動し操作する:CreateObuject関数を使う直接データファイルを操作する:GetObject関数を使うNewキーワードでオブジェクトのインスタンスを作成し操作するいずれの方法も、生成したオブジェクトのインスタンスを使用するために、オブジェクト変数を利用します。この場合、変数宣言時にオブジェクトに合わせたデータ型を指定しますが、この操作を有効にするために、プロジェクトにアプリケーションへの参照設定を行う手続きが必要になります。◆操作対象のアプリケーションを起動して、保有するオブジェクトを操作する操作対象のアプリケーションを起動して保有するオブジェクトを操作したい場合は、CreateObject関数で、そのアプリケーションのインスタンスを生成し、使用します。CreateObject関数は、生成するオブジェクトのクラス名を表1の文字列で引数に指定します。InternetExplorer.Applicationクラス名が利用できるのはActiveXオブジェクトのみで、それ以外のアプリケーションはインスタンスを生成することはできません。引数にセットするオブジェクトのクラス名が設定されていないアプリケーションもインスタンスを生成できません。CreateObject関数がインスタンスの生成に成功すると、そのオブジェクトへの参照を返してくるので、これをSetステートメントでオブジェクト型に宣言した変数に格納します。リスト1は、WordのインスタンスをCreateObject関数で作成するプロシージャです。Subアプリケーション固有のオブジェクト変数を宣言した場合は、プロジェクトにそのアプリケーションへの参照設定を行う必要があります。VBAでは「Word.Application」というオブジェクト型のデータ型は存在しません。これをそのまま実行すると、VBAは「ユーザー定義型は定義されていません。」というメッセージを表示し、エラーで実行を停止します。◆CreateObject関数でアプリケーションのインスタンスを生成CreateObject関数でアプリケーションのインスタンスを生成すると、その時点からオブジェクトをコードで自由に操作することができるようになります。そのオブジェクトのプロパティを使って「可視」状態にしないと、アプリケーションが起動しているかどうかを見ることができません。リスト1の例でも、ApplicationオブジェクトのVisibleプロパティをTrueにセットして、Wordを表示しています。Wordを非表示にしたまま処理を完結させたいときは、非表示状態で使えばよいわけです。リスト2は、Wordのインスタンスを生成して新規文書を追加し、その中に「Hello!」という文字を挿入します。TrueWordやExcelなどは、一度にインスタンスをいくつでも作成できます。そのため、このようにアプリケーション内の各オブジェクトへの参照を行う場合は、CreateObject関数が返してきたオブジェクトへの参照を使用し、そのアプリケーションオブジェクトに対する操作なのかを明示的に指定する必要があります。起動したアプリケーションを終了させるには、ApplicationオブジェクトのQuitメソッドを実行します。文書を保存しないでアプリケーションを終了しようとすると、文書保存を確認するメッセージボックスが表示されますので、リスト3では文書を保存せずにアプリケーションを閉じるようにしています。"Wordを終了します。Explorerなども、同様の方法でインスタンスを生成することができます。リスト4は、PowerPointを起動し、新規プレゼンテーションを追加し、空のスライドを1枚追加します。Explorerのインスタンスを3つ起動して閉じます。複数のインスタンスを作成した場合は、インスタンス一つひとつを操作対象のオブジェクトに指定し、プロパティやメソッドを実行します。Sub◆Word文書やExcelワークシートのオブジェクトを生成して利用Wordの文書(Documentオブジェクト)や、Excelのワークシート(Sheeetオブジェクト、Chartオブジェクト)は、CreateObject関数の引数に指定できるクラス名を持っていますので、直接これらのオブジェクトを生成して利用することもできます。リスト6は、Wordの新規文書を生成し、「Hello!」という文字を入力します。実際に文書ができているかどうかを確認するために、Wordを表示状態にします。Subリスト6の場合、Word自身を参照するオブジェクト変数を持っていないので、Wordに対する操作は、DocumentオブジェクトがもつApplicationプロパティを使って、親のオブジェクト(Wordオブジェクト)を操作するようになります。これは、ExcelのSheetオブジェクトをCreateObject関数で作成した場合も同様です。◆アプリケーションのデータファイルを直接開く操作を行う今度は、ブックや文書など、アプリケーションのデータファイルを直接開く操作を行う方法です。この場合は、GetObject関数を使用し、引数にデータファイル名をフルパスで記述します。GetObject関数は、引数に指定したファイルに関連付けられているアプリケーションを起動し、そのファイルを開いてオブジェクトへの参照を返してきます。フォルダ内のデータファイルをダブルクリックすると、アプリケーションが起動しファイルが表示されるのと同じ処理を行うことになります。VBAのコード内でWordの文書をいきなり開こうとしても、実行時エラーになってしまいます。Wordへの参照設定をしても、起動に失敗します。Subこのような場合は、GetObject関数で直接文書を指定して開きます(リスト7)。Subこのとき、関連付けられているアプリケーションが起動していれば、GetObject関数は新しいアプリケーションインスタンスを作成しません。アプリケーションが起動していなければ、起動してから文書を表示します。いずれの場合も、GetObject関数は開いた文書をオブジェクトとした参照を返してきます。この場合も、親のアプリケーションをオブジェクトとして捜査する場合は、子オブジェクトにあるApplicationプロパティを使って、操作対象のオブジェクトとして指定します。◆リモートで操作するアプリケーションがOutlookの場合リモートで操作するアプリケーションがOutlookの場合は、やや勝手が違います。Outlookは、ひとつのアプリケーションにスケジューラやメールの受信フォルダなどをもっていますから、どの機能にアクセスするのかを指定する処理などが必要になってきます。これまで説明してきたOfficeアプリケーションのように、ApplicationオブジェクトにVisibleプロパティが設定されていませんので、このプロパティを使ってOutlookを表示することができないのです。VBAからOutlookを起動し、受信トレイを表示します。CreateObject関数の引数に「Outlook.Application」を指定し、実行します。Outlookも他のOfficeアプリケーションと同様、複数のインスタンスを生成できますから、CreateObject関数が返すOutlookオブジェクトへの参照をSetステートメントでオブジェクト変数に格納し、この変数で各下層のオブジェクトにアクセスします。"Outlookを終了します。Sub受信トレイを開く場合は、GetNameSpaceメソッドを使用し、引数に「"MAPI"」を指定します。これで、ユーザーのメッセージフォルダに格納されたすべてのOutlookデータへアクセスできるようになります。NS=OL.GetNamespace("MAPI")受信トレイを含め、Outlookの各項目はMAPIFolderオブジェクトとして扱われます。GetDefaultFolderメソッドを使用すると、Outlookに設定されている既定の機能の対応するフォルダを取得できます。受信トレイは「olFolderInbox」になります。受信トレイを表示するには、MAPIFolderオブジェクトのDisplayメソッドを実行します。NS.GetDefaultFolder(olFolderInbox).Display現在設定されている「現在のビュー」の状態で、受信トレイが表示されます。Outlookをコードから終了するには、他のアプリケーションと同じように、ApplicationオブジェクトのQuitメソッドを使います。Newキーワードを使っても、アプリケーションオブジェクトのインスタンスを作成できます。その場合は、Dimステートメントでオブジェクト変数を宣言する際にキーワードNewを記述し、そのあとにクラス名を記述します(リスト9)。Subインスタンスを作成するアプリケーションへの参照設定を行っていれば、自動的にそのクラス名が抗k歩に表示されます。オブジェクト変数の宣言と同時にクラスのインスタンス作成を行っているので、あとはオブジェクト変数を使用し、作成したインスタンスへの参照を行います。