GetObject関数で外部アプリケーションにアクセスする

 CreateObject関数は、外部アプリケーションの新しいインスタンスを作成する関数でした。したがって、すでにアプリケーションが起動している状態でCreateObject関数を使うと、同一のアプリケーションが次々に起動してしまうことになります。
 一方、GetObject関数は、すでに起動している外部アプリケーションにアクセスする関数になります。したがって、GetObject関数を使えば、同一のアプリケーションが複数起動することはありません。
 GetObject関数は、CreateObject関数とは違って2つの引数をとります。

GetObject(pathname, class)
 引数はいずれも省略可能ですが、ともに省略することはできません。リスト3では、GetObject関数を使ってWordにアクセスしています。すでにWordが起動している場合はそのまま処理を続行しますが、未起動のときには番号429のエラーが発生します。このエラーを検知したときには、CreateObject関数でWordを起動しています。
 実際にリスト3のマクロを実行すると、タスクバーに次々とWordのプログラムボタンが追加されるため、実行が失敗したかのように見えますが、これはWord 2000がSDI(Single Document Interface)対応のアプリケーションとなったためで、Wordが複数起動されているわけではありませんのでご安心を。

リスト3:すでに起動しているWordにアクセスする

 Sub GetWordApp()
     Dim objWord As Word.Application
     Dim myAppOpen As Boolean
 
     On Error GoTo ErrRtn
 
     Set objWord = GetObject(, "Word.Application")
     myAppOpen = True
 
 MacroContinue:
     ' Wordのインスタンスが作成されていなかったら作成する
     If myAppOpen = False Then
         Set objWord = CreateObject("Word.Application")
     End If
 
     ' 新規文書を挿入する
     With objWord
         .Visible = True
         .WindowState = wdWindowStateMinimize
         .Documents.Add
     End With
 
     Set objWord = Nothing
 
     Exit Sub
 
 ErrRtn:
     ' ActiveXコンポーネントはオブジェクトを作成できません 
     If Err.Number = 429 Then
         myAppOpen = False
         Resume MacroContinue
     End If
 End Sub