次の方法で共有


オブジェクトへの参照を取得する

Microsoft Office 2000/Visual Basic プログラマーズ ガイド   

オブジェクトを使用する場合は、まずオブジェクトへの参照を取得する必要があります。そのためには、オブジェクト モデルのオブジェクトにアクセスする式を作成し、プロパティまたはメソッドを使用して、上または下のオブジェクト階層に移動し、作業するオブジェクトに到達する必要があります。開始したオブジェクトを返す場合、およびオブジェクト間を移動する場合に使用するプロパティおよびメソッドは、"オブジェクト アクセサ" または単に "アクセサ" と呼ばれます。通常、アクセサには、アクセス時にそのアクセサを使用するオブジェクトと同じ名前が付けられています。たとえば、Word の Documents プロパティは Documents コレクションへのアクセスとして使用されます。アクセサは通常はプロパティですが、オブジェクト モデルによってはメソッドである場合があります。

Application オブジェクト

通常、オブジェクト モデルへのアクセスを取得する場所は最上位の階層のオブジェクトです。Office アプリケーションおよび VBA をサポートするほとんどのアプリケーションでは、最上位の階層のオブジェクトは Application オブジェクトです。ただし、アプリケーションやコンポーネントによっては、最上位の階層のオブジェクトが異なる場合があります。たとえば、Microsoft Visual Basic for Applications Extensibility 5.3 ライブラリへの参照を使用して Visual Basic Editor でプログラミングを行っている場合、最上位の階層のオブジェクトは VBE オブジェクトになります。

Application プロパティを使用して Application オブジェクトへの参照を取得します。次のコードは Application オブジェクトへの参照を取得し、スクロール バー、画面に表示されるヒント、およびステータス バーを表示するプロパティを設定します。

  Dim wdApp As Application
Set wdApp = Application
With wdApp
   .DisplayScrollBars = True
   .DisplayScreenTips = True
   .DisplayStatusBar = True
End With

Application オブジェクトが含まれる複数のタイプ ライブラリへの参照を確立した場合、Application プロパティでは常にホスト アプリケーションの Application オブジェクトを返します。また、参照される複数のタイプ ライブラリで同じ名前を持つオブジェクトの場合、アクセサ プロパティまたはメソッドは、[ツール] メニューから開く [参照設定] ダイアログ ボックスの [参照可能なライブラリ ファイル] ボックスで参照されている最初のタイプ ライブラリからオブジェクトを返します。たとえば、ActiveX データ オブジェクト (ADO) およびデータ アクセス オブジェクト (DAO) タイプ ライブラリには、Recordset オブジェクトがあります。DAO タイプ ライブラリの前に ADO タイプ ライブラリへの参照がある場合、次のような宣言は常に ADO の Recordset オブジェクトを返します。

  Dim rstNew As Recordset

これを修正するには、[参照設定] ダイアログ ボックスで参照の優先度を調整する方法がありますが、規則に従った、オブジェクトの "クラス名" を使用してオブジェクト変数を宣言すると、混乱とエラーを回避することができます。クラス名は "プログラム識別子" または "ProgID" と呼ばれます。この操作を行うには、オブジェクトが含まれるアプリケーションまたはコンポーネントの名前 (オブジェクト ブラウザの [プロジェクト/ライブラリ] ボックスに表示されるとおりに表記します) とそのオブジェクトの名前を組み合わせ、ドット (.) で区切ります。

たとえば、Word の Application オブジェクトと共に実行される、ほかのアプリケーションのオブジェクト変数は、次のように宣言します。

  Dim wdApp As Word.Application

同様に、ADO および DAO タイプ ライブラリの両方がプロジェクト内で参照される場合、Recordset オブジェクトを使用するには、オブジェクト変数を次のように宣言する必要があります。

  Dim rstADO As ADODB.Recordset
Dim rstDAO As DAO.Recordset

メモ   コンピュータにインストールされたすべてのアプリケーションおよびコンポーネントの ProgID を表示するには、レジストリ エディタを起動して \HKEY_CLASSES_ROOT\CLSID サブキー下を表示します。

[参照設定] ダイアログ ボックスの使用については、この章の「参照の設定とオブジェクト変数での作業」を参照してください。オブジェクト ブラウザの使用については、この章の「オブジェクト ブラウザを使用する」を参照してください。

オブジェクト階層内を移動する

最上位のオブジェクトから任意のオブジェクトに移動するには、アクセサを使用してオブジェクトから別のオブジェクトを返し、階層内のすべてのオブジェクトをステップ実行する必要があります。ブック、ワークシート、文書、プレゼンテーション、スライドなど、多くのオブジェクトは "コレクション" のメンバです。コレクションとは、関連するオブジェクトのグループが含まれるオブジェクトです。コレクションに含まれるオブジェクトでは、個別のエンティティとしてではなく、1 つのグループとして作業を行うことができます。階層内でコレクションは常に個別のオブジェクトより 1 階層上にあるため、一般的にはまずコレクションにアクセスしてからコレクション内のオブジェクトにアクセスする必要があります。コレクション オブジェクトを返すアクセサには、通常、コレクション オブジェクトと同じ名前が付いています。たとえば、Word の Application オブジェクトの Documents プロパティは、開いているすべての文書を表す Documents コレクション オブジェクトを返します。次の式では、Word の Documents コレクション オブジェクトへの参照を取得します。

  Application.Documents

コレクション内のアイテムを参照するには、コレクションでの位置を参照する数値または名前を使用します。たとえば、Report.doc という名前の文書が Documents コレクションで最初に開く文書である場合、次のいずれかの方法で参照することができます。

  Application.Documents(1)

または

  Application.Documents("Report.doc")

さらに下の階層にあるオブジェクトまで移動するには、作業するオブジェクトに移動するまで、式にアクセサおよびオブジェクトを追加します。たとえば、次の式では、最初に開く文書の Paragraphs コレクションにある 2 番目の段落への参照を取得します。

  Application.Documents(1).Paragraphs(2)

コレクション内のオブジェクトを参照する場合、およびコレクション内のオブジェクトで作業する場合の詳細については、この章の「コレクションを使用する」を参照してください。

ショートカット アクセサ

Application オブジェクトから移動せずにモデル内のオブジェクトに直接アクセスするには、ショートカット アクセサを使用します。ショートカットには、Documents、Workbooks、Items、Presentations プロパティなどのアクセサが含まれます。これらのアクセサは単独で使用して、対応するアプリケーションの文書コレクションへの参照を取得できます。たとえば、Word では、次のステートメントのいずれかを使用して MyDoc.doc を開くことができます。

  Application.Documents.Open Filename:="c:\docs\mydoc.doc"

または

  Documents.Open Filename:="c:\docs\mydoc.doc"

その他のショートカット アクセサとして、アプリケーションのアクティブな部分への直接的な参照を取得する ActiveWindow、ActiveDocument、ActiveWorksheet、ActiveCell プロパティなどがあります。次のステートメントでは、開いている Word 文書を閉じます。Application オブジェクトおよび Documents コレクション オブジェクトは明示的には参照されません。

  ActiveDocument.Close

ヒント   オブジェクト ブラウザの [クラス] ボックスで [<グローバル>] が選択されている場合、メンバ ボックスに表示されるアクセサをショートカットとして使用できるため、プロパティまたはメソッドを使用する前にプロパティまたはメソッドが適用されるオブジェクトを取得する必要がありません。これは、VBA が、実行しているコードのコンテキストからその情報を認識することができるためです。

コードが動作中の文書またはブックを参照する

ActiveDocument および ActiveWorkbook アクセサ プロパティを使用している場合、返される参照は、現在使用中の文書またはブック (開いているすべての文書またはブックの一番上にあるウィンドウ) に対するものであることに注意してください。ほとんどの場合、参照しているオブジェクトの上にある階層全体を含めずに、アクティブ オブジェクトを "暗黙的" に参照できます。たとえば、アクティブなブックの Worksheets コレクションへの参照を取得する際に、ActiveWorkbook をコレクションの前に配置したり、Workbooks コレクションに含まれるブックの名前または番号への明示的な参照を作成する必要はありません。

  Worksheets("MySheet")

ただし、暗黙的な参照や、ActiveDocument または ActiveWorkbook のアクセサ プロパティを使用すると、グローバル テンプレートまたはアドインの開発時に、コードがグローバル テンプレートまたはアドインを参照することを確認する際に問題が発生することがあります。Word および Excel では、VBA コードが実行されている文書またはブックに参照を返す ThisDocument と ThisWorkbook の 2 つの特殊なアクセサ プロパティが用意されています。コードが、実行しているそのコードを含む文書またはブックを参照していることを確認する必要がある場合は、常に ThisDocument または ThisWorkbook プロパティを使用してください。

たとえば、次の Set ステートメントではどちらも "Addin Definition" という名前のワークシートを参照します。最初のステートメントでは、ActiveWorkbook プロパティを使用してアクティブなブックを明示的に参照します。2 番目のステートメントでは暗黙的に参照します。ここでは特定のブックを明示的に参照しないため、参照はアクティブなブックに対するものと認識されます。いずれの場合も、Set ステートメントの参照は、コードが実行される際にアクティブとなるブック内のワークシートに対するものです。

  Set rngMenuDef = ActiveWorkbook.Worksheets("Addin Definition"). _
   Range("MenuDefinition")

Set rngMenuDef = Worksheets("Addin Definition").Range("MenuDefinition")

これらの参照は、アドインまたはテンプレートを作成する際に、コードのテスト中にほかの文書またはブックを開いていない場合、あるいはコードの実行中にアドインまたはテンプレートがアクティブなウィンドウにある場合に正しく機能します。ただし、アドインまたはテンプレートが使用中の場合、この種の参照では問題が発生することがあります。コードが実行中のブックを参照していることを確認するには、次の Set ステートメントにあるように ThisWorkbook プロパティを使用します。

  Set rngMenuDef = ThisWorkbook.Worksheets("Addin Definition"). _
   Range("MenuDefinition")

Parent プロパティ

現在のオブジェクトから、上の階層のオブジェクトにアクセスするには、オブジェクトの Parent プロパティを使用する場合があります。オブジェクトの Parent プロパティを使用すると、現在のオブジェクトが含まれるオブジェクトを参照できます。たとえば、フォームでコントロールを使用するための関数を記述する場合 (関数は Control 型の引数を使用します)、このコントロールの Parent プロパティを使用して、このコントロールが含まれるフォームを参照します。

Parent プロパティは、現在のオブジェクトの 1 つ上の階層にあるオブジェクトを常に返すわけではなく、さらに上のオブジェクトを返す場合があります。これは、特に、現在のオブジェクトの 1 つ上の階層にあるオブジェクトがコレクションの場合に起こります。たとえば、Word の Document オブジェクトの Parent プロパティは、Documents コレクションではなく Application オブジェクトを返します。TypeName 関数を使用すると、任意のオブジェクトの Parent プロパティが参照するオブジェクト型を調べることができます。たとえば、Word では、次のステートメントによって Document オブジェクトの Parent プロパティが参照するオブジェクト型を表示することができます。

  MsgBox TypeName(Documents("Document1").Parent)

ヒント   TypeName 関数を使用すると、Parent プロパティを使用する式だけではなく、さまざまな式によって返されるオブジェクト型を調べることができます。また、TypeName 関数を使用して、バイト型 (Byte)、整数型 (Integer)、長整数型 (Long) など、式が返すデータ型の種類を調べることができます。

埋め込み OLE オブジェクトのアプリケーションにアクセスする

埋め込み OLE オブジェクトから、このオブジェクトが作成されたプログラムの Application オブジェクトに移動する場合に、オブジェクトの Application プロパティを使用することがあります。たとえば PowerPoint では、次の式によって、アクティブなプレゼンテーションの最初のスライドにある 3 番目の図形に埋め込み OLE オブジェクトを作成する際に使用したアプリケーションの Application オブジェクトへの参照を取得できます。

  ActivePresentation.Slides(1).Shapes(3).Object.Application