Microsoft Excel VBA - ExcelからOfficeアプリケーションを操作する方法

◆概要


 ActiveXテクノロジとオブジェクト指向がMicrosoftの各アプリケーションに取り入れられてから、複数のアプリケーション間で一つのデータを使いまわすことが、かなりのレベルでできるようになりました。


 アプリケーション自身もオブジェクトとしてコードから操作できるため、たとえばExcel VBAのコードの中でWordを操作して印刷させたり、データベースのデータをExcelに落として加工し、Outlookで配信するという、ひとつの処理に複数のアプリケーションを介在させて業務を処理してゆくことが可能になっています。


本資料では、Officeアプリケーションの操作やデータ交換にどのような方法があるかを整理してみました。これからOfficeアプリケーションを組み合わせて業務を処理してみようとお考えの方は参考にしてください。

◆他のOfficeアプリケーションを利用する


 Excelから他のOfficeアプリケーションを操作するには、いくつかの方法が用意されています。

  1. 対象アプリケーションを起動し操作する:CreateObuject関数を使う
  2. 直接データファイルを操作する:GetObject関数を使う
  3. Newキーワードでオブジェクトのインスタンスを作成し操作する

 いずれの方法も、生成したオブジェクトのインスタンスを使用するために、オブジェクト変数を利用します。この場合、変数宣言時にオブジェクトに合わせたデータ型を指定しますが、この操作を有効にするために、プロジェクトにアプリケーションへの参照設定を行う手続きが必要になります。

◆操作対象のアプリケーションを起動して、保有するオブジェクトを操作する


 操作対象のアプリケーションを起動して保有するオブジェクトを操作したい場合は、CreateObject関数で、そのアプリケーションのインスタンスを生成し、使用します。


 CreateObject関数は、生成するオブジェクトのクラス名を表1の文字列で引数に指定します。

表1:CreateObject関数で引数に指定するオブジェクトのクラス名
オブジェクト クラス名
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

 アプリケーション固有のオブジェクト変数を宣言した場合は、プロジェクトにそのアプリケーションへの参照設定を行う必要があります。

 通常、Excel VBAでは「Word.Application」というオブジェクト型のデータ型は存在しません。これをそのまま実行すると、VBAは「ユーザー定義型は定義されていません。」というメッセージを表示し、エラーで実行を停止します。

◆CreateObject関数でアプリケーションのインスタンスを生成


 CreateObject関数でアプリケーションのインスタンスを生成すると、その時点からオブジェクトをコードで自由に操作することができるようになります。

 ただし、そのオブジェクトのプロパティを使って「可視」状態にしないと、アプリケーションが起動しているかどうかを見ることができません。

 リスト1の例でも、ApplicationオブジェクトのVisibleプロパティをTrueにセットして、Wordを表示しています。もちろん、Wordを非表示にしたまま処理を完結させたいときは、非表示状態で使えばよいわけです。


 リスト2は、Wordのインスタンスを生成して新規文書を追加し、その中に「Hello!」という文字を挿入します。

リスト2:Wordのインスタンスを生成して新規文書を追加
    ' 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

 WordやExcelなどは、一度にインスタンスをいくつでも作成できます。

 そのため、このようにアプリケーション内の各オブジェクトへの参照を行う場合は、CreateObject関数が返してきたオブジェクトへの参照を使用し、そのアプリケーションオブジェクトに対する操作なのかを明示的に指定する必要があります。


 起動したアプリケーションを終了させるには、ApplicationオブジェクトのQuitメソッドを実行します。文書を保存しないでアプリケーションを終了しようとすると、文書保存を確認するメッセージボックスが表示されますので、リスト3では文書を保存せずにアプリケーションを閉じるようにしています。

リスト3:Wordを起動し、新規文書を追加して文字を挿入した後、文書を保存せずにWordを終了
    ' 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


▼ページトップへ

◆PowerPintやInternet Explorerなどのインスタンスを生成


 PowerPointやInternet Explorerなども、同様の方法でインスタンスを生成することができます。

 リスト4は、PowerPointを起動し、新規プレゼンテーションを追加し、空のスライドを1枚追加します。

リスト4:PowerPointを起動して新規プレゼンテーションを追加
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

 リスト5ではInternet Explorerのインスタンスを3つ起動して閉じます。複数のインスタンスを作成した場合は、インスタンス一つひとつを操作対象のオブジェクトに指定し、プロパティやメソッドを実行します。

リスト5:Internet Explorerのインスタンスを3つ起動して閉じる
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文書やExcelワークシートのオブジェクトを生成して利用


 Wordの文書(Documentオブジェクト)や、Excelのワークシート(Sheeetオブジェクト、Chartオブジェクト)は、CreateObject関数の引数に指定できるクラス名を持っていますので、直接これらのオブジェクトを生成して利用することもできます。

 リスト6は、Wordの新規文書を生成し、「Hello!」という文字を入力します。実際に文書ができているかどうかを確認するために、Wordを表示状態にします。

リスト6:新規文書を直接作成
Sub 新規文書を直接作成()
    ' 参照設定は不要
    Set WDoc = CreateObject("Word.Document")
    WDoc.Application.Selection.TypeText Text:="Hello!"
    
    WDoc.Application.Visible = True
End Sub

 リスト6の場合、Word自身を参照するオブジェクト変数を持っていないので、Wordに対する操作は、DocumentオブジェクトがもつApplicationプロパティを使って、親のオブジェクト(Wordオブジェクト)を操作するようになります。これは、ExcelのSheetオブジェクトをCreateObject関数で作成した場合も同様です。

◆アプリケーションのデータファイルを直接開く操作を行う


 今度は、ブックや文書など、アプリケーションのデータファイルを直接開く操作を行う方法です。

 この場合は、GetObject関数を使用し、引数にデータファイル名をフルパスで記述します。

 GetObject関数は、引数に指定したファイルに関連付けられているアプリケーションを起動し、そのファイルを開いてオブジェクトへの参照を返してきます。

 すなわち、フォルダ内のデータファイルをダブルクリックすると、アプリケーションが起動しファイルが表示されるのと同じ処理を行うことになります。


 たとえば、次のようにExcel VBAのコード内でWordの文書をいきなり開こうとしても、実行時エラーになってしまいます。いくらWordへの参照設定をしても、起動に失敗します。


Sub 文書を開く() ' これは失敗する
 Documents.Open "c:\sanple.doc"
End Sub

 このような場合は、GetObject関数で直接文書を指定して開きます(リスト7)。

リスト7:GetObject関数で直接文書を指定して開く
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関数は新しいアプリケーションインスタンスを作成しません。

 アプリケーションが起動していなければ、起動してから文書を表示します。いずれの場合も、GetObject関数は開いた文書をオブジェクトとした参照を返してきます。

 この場合も、親のアプリケーションをオブジェクトとして捜査する場合は、子オブジェクトにあるApplicationプロパティを使って、操作対象のオブジェクトとして指定します。

◆リモートで操作するアプリケーションがOutlookの場合


 リモートで操作するアプリケーションがOutlookの場合は、やや勝手が違います。

 Outlookは、ひとつのアプリケーションにスケジューラやメールの受信フォルダなどをもっていますから、どの機能にアクセスするのかを指定する処理などが必要になってきます。これまで説明してきたOfficeアプリケーションのように、ApplicationオブジェクトにVisibleプロパティが設定されていませんので、このプロパティを使ってOutlookを表示することができないのです。


 リスト8は、Excel VBAからOutlookを起動し、受信トレイを表示します。CreateObject関数の引数に「Outlook.Application」を指定し、実行します。Outlookも他のOfficeアプリケーションと同様、複数のインスタンスを生成できますから、CreateObject関数が返すOutlookオブジェクトへの参照をSetステートメントでオブジェクト変数に格納し、この変数で各下層のオブジェクトにアクセスします。

リスト8:Excel VBAからOutlookを起動して受信トレイを表示
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

 受信トレイを開く場合は、GetNameSpaceメソッドを使用し、引数に「"MAPI"」を指定します。これで、ユーザーのメッセージフォルダに格納されたすべてのOutlookデータへアクセスできるようになります。

Set NS=OL.GetNamespace("MAPI")

 受信トレイを含め、Outlookの各項目はMAPIFolderオブジェクトとして扱われます。そして、GetDefaultFolderメソッドを使用すると、Outlookに設定されている既定の機能の対応するフォルダを取得できます。受信トレイは「olFolderInbox」になります。

 そして、受信トレイを表示するには、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

 インスタンスを作成するアプリケーションへの参照設定を行っていれば、自動的にそのクラス名が抗k歩に表示されます。オブジェクト変数の宣言と同時にクラスのインスタンス作成を行っているので、あとはオブジェクト変数を使用し、作成したインスタンスへの参照を行います。



▼ページトップへ