Office VBAのCreateObjectで別アプリを安全に自動化する

VBA・Officeカテゴリを表すパンダのイラスト VBA・Office

本記事はAIを利用して作成した技術解説・実装例です。掲載するコードや手順は一次情報を基に構成していますが、筆者による実機での動作確認は行っていません。環境やバージョンによって動作が異なる場合があります。

Office VBAにおける CreateObject 関数は、ActiveXオブジェクトへの参照を作成して返すために利用されます。WordやExcelをはじめとする、自動化をサポートするアプリケーションをVBAから操作するための基本的な仕組みとして公式仕様に位置づけられています。 、一次情報をもとに CreateObject 関数の構文、引数の詳細、オブジェクトの生成から解放までの流れ、および関連する仕様を整理します。


CreateObject関数の構文と引数

一次情報によると、CreateObject 関数の構文は次のとおりです。

CreateObject(class, [servername])

引数には classservername が用意されています。それぞれの役割について確認します。

  • class(必須 / Variant(String)): 作成するオブジェクトのアプリケーション名とクラスを指定します。

  • servername(省略可能 / Variant(String)): オブジェクトを作成するネットワークサーバーの名前を指定します。空の文字列("")を指定した場合は、ローカルマシンが使用されます。

また、class 引数は appname.objecttype という形式で構成されます。

  • appname: オブジェクトを提供するアプリケーション名。

  • objecttype: 作成するオブジェクトの種類またはクラス。


オブジェクト変数の宣言と遅延バインディング

自動化対象のアプリケーションからオブジェクトを取得するには、CreateObject が返す参照をオブジェクト変数に代入します。

一次情報では、As Object 節を使用してオブジェクト変数を宣言する方法が解説されています。この宣言方法を用いると、変数はあらゆるタイプのオブジェクト参照を保持できるようになります。

' 【Windows環境で確認予定】
Dim ExcelSheet As Object
Set ExcelSheet = CreateObject("Excel.Sheet")

このように As Object で宣言した場合、アクセスは遅延バインディング(レイトバインディング)となります。つまり、プログラムの実行時にバインディングが行われます。

オブジェクト変数に参照を代入した後は、アプリケーションオブジェクトやコレクションなどのプロパティやメソッドにアクセスできます。一次情報では、Excelを可視化してセルに文字を入力し、保存して終了する一連の流れが示されています。

' 【Windows環境で確認予定】
ExcelSheet.Application.Visible = True
ExcelSheet.Application.Cells(1, 1).Value = "This is column A, row 1"
ExcelSheet.SaveAs "C:\TEST.XLS"
ExcelSheet.Application.Quit
Set ExcelSheet = Nothing

処理の最後には Set ExcelSheet = Nothing を実行し、オブジェクト変数を確実に解放することが重要です。


早期バインディングによる実装の構成

一次情報では、遅延バインディングだけでなく、特定のクラスIDを指定して早期バインディング(コンパイル時バインディング)を行う方法についても言及されています。

特定の型を明示して変数を宣言することで、パフォーマンスの向上が期待できますが、宣言時に指定したクラスの参照しか保持できなくなります。

' 【Windows環境で確認予定】
Dim xlApp As Excel.Application 
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.WorkSheet

Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)

この構成では、アプリケーション、ワークブック、ワークシートの各オブジェクトをそれぞれの型に沿って扱います。


ネットワーク上のリモートコンピューターでのオブジェクト作成

CreateObject 関数では、第2引数である servername を利用して、ネットワーク上のリモートコンピューター上にオブジェクトを作成することも可能です。

共有名のマシン名部分に相当する文字列を引数に渡します。例えば、共有名が \MyServer\Public である場合、サーバー名は "MyServer" となります。

一次情報に記載されているリモート実行の例を確認します。

' 【Windows環境で確認予定】
Dim xlApp As Object
Set xlApp = CreateObject("Excel.Application", "MyServer")
Debug.Print xlApp.Version

なお、指定したリモートサーバーが存在しない場合や利用できない状態である場合には、実行時エラーが発生することが一次情報で説明されています。


処理フローの全体像

ここまで解説した CreateObject を用いたオブジェクト生成から解放、さらにリモート参照までの仕組みをMermaidのフローチャートで整理します。

flowchart TD
    A["VBAコード実行"] --> B{"servernameの指定は?"}
    B -- ローカル ("") または省略 --> C[CreateObject("appname.objecttype")]
    B -- リモートサーバー名 --> D["CreateObject(\"appname.objecttype\", \"ServerName\")"]
    C --> E["オブジェクト変数へ代入"]
    D --> E
    E --> F["プロパティ操作 / メソッド実行"]
    F --> G["Quitメソッド等でアプリケーション終了"]
    G --> H["Set変数 = Nothing で解放"]

CreateObject利用時の注意点

一次情報には、CreateObject を利用する際の重要な注意点がいくつか記載されています。

  1. 新規インスタンスの起動 オブジェクトの現在実行中のインスタンスが存在しない場合に CreateObject を使用します。すでにインスタンスが実行されている場合でも、新しくインスタンスが起動され、指定した型のオブジェクトが作成されます。

  2. 既存インスタンスの扱いとGetObject すでに実行中のインスタンスを利用したい場合や、アプリケーションを起動してファイルを読み込ませたい場合には、CreateObject ではなく GetObject 関数を使用するように案内されています。

  3. シングルインスタンスオブジェクト オブジェクトが単一インスタンスオブジェクトとして自己登録している場合、CreateObject が何回実行されても作成されるインスタンスは1つのみとなります。


参考情報

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

タイトルとURLをコピーしました