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