Access2000VBA・Excel2000VBA独学~用語:「COMオートメーション(OLE?)」、「New」「Add」「Open」、「CreateObject」関数や「GetObject」関数、「参照設定」と「事前バインディング・実行時バインディング」についての一覧表(自信なし)~
※まだ書きかけです。すみません。
※間違ってたらすみません。→間違ってましたので書きなおし中です。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
★ 関連記事
以下の記事は、COMオートメーションとすごく関連が深いので、COMオートメーションがしたいときは必ずご自分でもチェック・テスト等々をしてみてください。
~用語:Setと「New」キーワードのことについて。「New」って何?~
★ 一覧表の閲覧
A4サイズ1枚に印刷できるようにしてありますので、文字は小さいですが、Ctrlキーを押しながらマウスホイールを回してもらうときれいに大きくなります。
bind-createobject-getobject01.pdf
★ もとファイルのダウンロード
注意書きが多すぎるので、注意書きを全部消せるように、上記のPDFのもととなるxlsmファイルを置いておきます。ご自由に使ってください。
bind-createobject-getobject01.zip
Microsoft Office では、「COMオートメーション」とか「OLEオートメーション」と呼ばれる機能を有していまして、たとえば・・・
、
・ExcelVBAからAccessやWordを直接操作したり、その逆、あるいは、
・ExcelVBAからファイルメーカーなどの「COM対応(OLE対応?・ActiveX対応?)」のソフトを直接操作したり
・・・といったことできます。
つまり「COM・OLE・ActiveXのオートメーション」に対応しているソフトウェア同士なら、ソフトメーカが異なっていてもお互いに自動連係ができる、ということです。
ちなみに、ファイルメーカーでは「ActiveX オートメーション」と呼んでいるようです。
(参考:『ActiveX オートメーションの例(Windows)』)
でも、「COM・OLE・ActiveXのオートメーション」、用語を統一してほしいですね。
「VBAエキスパート」のサイトでは「OLEオートメーション」と書かれていますが、「OLEオートメーション」は別のサイトの情報によると少し古い言い方だそうで、「OLE」という用語に関してだけで言うと、俗にいう「埋め込みオブジェクト」のことをさすことが多いと思います。
ただ、「OLE」に「オートメーション」が付いたら、「COMオートメーション」や「ActiveXオートメーション」などと、まあ、同じ意味・・・、と捉えればよいようです。
Excel2010のヘルプには、「オートメーションの概要」というヘルプページに以下のような記述が見られますのでこちらもご参考にしてみてください。
~以下、ヘルプより~
『オートメーション (以前のバージョンでは OLE オートメーション) は、コンポーネント オブジェクト モデル (COM) の機能で、開発ツール、マクロ言語、およびオートメーションをサポートする他のアプリケーションに対してオブジェクトを公開するために、アプリケーションが使用する業界標準の技術です。たとえば、表計算アプリケーションでは、ワークシート、グラフ、セル、セル範囲などがそれぞれ異なる型のオブジェクトとして公開されます。ワード プロセッサでは、アプリケーション、文書、段落、文、ブックマーク、選択範囲などのオブジェクトが公開されます。
アプリケーションがオートメーションをサポートしている場合、アプリケーションが公開するオブジェクトを Visual Basic で操作できます。Visual Basic でオブジェクトを操作するには、オブジェクトに対してメソッドを使用したり、オブジェクトのプロパティ値の取得または設定を行います。たとえば、MyObj という名前のオートメーション オブジェクトを作成し、次のようなコードでこのオブジェクトを操作することができます。 ~中略~ オートメーション オブジェクトを利用する関数は、次のとおりです。
CreateObject:指定した種類の新しいオブジェクトを作成し(つつ取得し)ます。
GetObject:(既存の)ファイルからオブジェクトを取得します。 』
※「OLE」という用語自体は、Excelのヘルプの中でも、「埋め込みオブジェクト」という意味で使われているページがほとんどでした。
で、このとき、この「COM・OLE・ActiveXのオートメーション」を使うのに、「事前バインディング・実行時バインディング」というものがあります。
「バインディング」には「事前バインディング」と「実行時バインディング」があって、オブジェクト型変数の変数宣言の方法の話です。
「事前バインディング」はオブジェクト型変数の宣言を、「オブジェクトの種類」を明確にして宣言します。たとえば以下の変数宣言の方法は「事前バインディング」になります。
Dim App01 As Excel.Application
Dim App01 As New Excel.Application
多分ですが、次のようなよく書く書き方もそうだと思います。
(違ってたらすみません!)
Dim Wb01 As Workbook
Dim Sht01 As Worksheet
Dim Rng01 As Range
Dim Shp01 As Shape
・
・
・
それに対して、次のように書くと、「実行時バインディング」になります。
Dim App01 As Object
Dim Wb01 As Object
Dim Sht01 As Object
Dim Rng01 As Object
Dim Shp01 As Object
・
・
・
「Object」を「Variant」と書いても、もしかしたら「実行時バインディング」かもしれません。
「事前バインディング」は、変数とオブジェクトとの紐付け準備(バインディング?代入という意味ではなく)が、「コンパイル時(?普通の意味のコンパイルとは微妙に違うようですが)」に行われるようなイメージです。(多分厳密には違う。)
もう少し具体的に言うと、オブジェクト変数の宣言を、オブジェクトの種類を明確にすると、「インテリセンス(自動補完機能)」が働きます。
例えば「Set = ・・・・」をしたあとで、そのオブジェクト変数の次にドットを打った瞬間に、ニョロっと「使えるオブジェクトやメソッドやパウロパティなどのドロップダウンの一覧」が出てくると思いますが、あれが出てきた時点で、もう紐つけ(バインディング)がされている、という感じのようです。
とうわけで、細かいことはともかく、『 プログラムの「実行前」にはすでにバインディングがなされている 』ということになります。(書いている時点で既にそうなるわけなので)
多分ですが、なので、「事前バインディング」と呼ばれているんだと思います。(プログラム実行前のバインディング。)
「実行時バインディング」は、「プログラムが実行されたあと・されたときにはじめて」、変数と実際のオブジェクトが紐付け準備がなされるイメージです。(こちらも多分厳密には違う気がします。あくまでイメージで。なお、こちらも代入と言う意味ではありません。)
なので、変数宣言で「As Object」とか「As Variant」とかを書いた場合は、「Set = ・・・・」をしたあとで、そのオブジェクト変数の次にドットを打っても、インテリセンスのドロップダウンはニョロっと出てきません。
結果、そのような違いがあるため(そのような特質を持つため)、「実行時バインディング」は、「事前バインディング」よりも動作速度がほんの少し遅く、例えば非常に多くのオブジェクトを扱うときは、処理が遅くなるそうです。
(でも、多分ですが、数百のオブジェクトを扱う程度なら、大きな問題にはならないと思います。未検証ですが・・・。ファイルを開くような処理だと数百でも重くなるのかも? もし気になるようでしたら、「遅い」と感じたときだけ事前バインディングに直せばいいと思います。)
それから、ありがちな間違いなのですが(私もこの間違いをしていました)、「事前バインディング」も「実行時バインディング」も、「他のアプリケーションを開くとか、その開いたもののオブジェクトの操作するための方法」・・・ではありませんので、そこは注意が必要です。
他のアプリケーションでも自アプリケーションでも、オブジェクト変数の宣言の違いの話」・「いつの時点で変数がバインディングされるか?の、 ” 時点とその仕組み ”の話 」です。Object型(Variant型)で宣言するか、しないか、の違いです。
「参照設定」は、「事前バインディング」したい場合は必須ですが、細かい明示的な変数設定をできるようにするかどうか(あるいはその恩恵のインテリセンス機能を使えるかどうか)ということだけであって、「Addメソッド、Openメソッド、CreateObject関数、GetObject関数」などをどのように使うか、といったこととは、基本的には「紐付き関係」はありません。(無関係と言ってもいいかもしれません。)
ただ、例えばExcelでWordに参照設定すると「wdWindowStateMinimize」みたいな「組み込み定数」を数字じゃないかたちで使えます。また、ExcelのVBEにて、Wordのオブジェクトブラウザの内容やヘルプの内容も見る・使えるようになります。
このことは「事前バインディングや実行時バインディング」の話とは本来無関係ですが、事前バインディングするときは参照設定しないといけないので、オマケ的にやれるようになります。(「参照設定のメリット」なのに「事前バインディングのメリット」として間違って語られることが多いので注意が必要です。似た例で、本来別の機能のことなのに、さも「事前バインディングや実行時バインディング」の話のように書かれている書籍やWeb記事が多いので、混同しないように注意が必要です。)
なお、「事前バインディング」をしたい場合は、VBE画面にて、「 Microsoft ×× ×× Object Library」に参照設定をする必要があります。
ただ、例えば
Excelを開いたときは「Microsoft Excel 番号 Object Library」に、
Wordを開いたときは「Microsoft Word 番号 Object Library」に、
Accessを開いたときは「Microsoft Access 番号 Object Library」に、
それぞれ最初からチェックマークが入っている=参照設定が事前完了している、ので、つまり、「自ソフト」に関しては、すでに「事前バインディングできる=オブジェクトの種類を明確にした宣言ができる」という認識で多分OKだと思います(自信なし)。
それに対して、他のソフト・・・例えば、WordやAccessなどからExcelのオブジェクトを「事前バインディング=オブジェクトの種類を明確にした変数宣言」をしたいとき、あるいは、「実行時バインディング=Objact型宣言 なんだけれども、Setで、例えば " Set ×××× = New Excel.Application " 」といったような、参照設定が必要な書き方をしたいときは、WordやAccessなどで、「Microsoft Excel 番号 Object Library」に参照設定をする必要があります。
ExcelからWordやAccessのファイルやオブジェクトを操作したい時も同様です。
ExcelのVBEにて、「Microsoft Word 番号 Object Library」や「Microsoft Access 番号 Object Library」に参照設定をしてあげる必要があります。
なお、事前バインディングは、型を明確に決め打ちして書くのが初心者には最初のうちはちょっとむずかしく、また、作ったバージョンとは違うOfficeのバージョンがインストールされているパソコンにそのファイルをコピーすると、バージョンの番号違のために参照設定がはずれてエラーになることが多いです。
それに対して、実行時バインディングはその点は(もしSetで参照設定が必要な書き方をしていなければということ限定ですが)、基本、何も考えなくてもいいのでラクといえばラクかもです。変数も汎用的になるので、最初のうちは初心者にも優しいです。(Officeの複数バージョン混合インストールなどをしていなければ。)
ただ(やっていいのか悪いのかわかりませんが)、Objact型やVariant型の宣言と、例えばExcelならApplication、WorkSheet、Workbook、Range型で宣言するのは、1つのプロシージャのなかで「混合」される可能性もあるので、それを考えると、一概に「どちらを絶対に使うべき」という話ではないと思います。
(Application、WorkSheet、Workbook、Range型が絶対使えるはずなのに、なぜかエラーになってしまい、Objact型の宣言が混ざってしまう、ということも経験しましたので・・・)
また、複数バージョンのOfficeを混合インストールしていると、動作がおかしくなることがあるのは、どちらも同じらしいです。
ここまでの話を少しまとめますと、
(01)「実行時バインディング(As Object や As Variant でのオブジェクト変数の宣言)」
は、参照設定しなくてもOK。また、型を細かく指定しなくていいので汎用性がある。
事前バインディングよりも少し遅いけど、遅いと感じてから直せばいい。
バージョンの番号違いのエラーも基本、考えなくてもいい。
複数バージョンのOfficeを混合インストールしていると、動作がおかしくなることがあるので注意。
事前バインディングできるはずなのにエラーになる、というケースもあるので、その場合は素直に As Object の実行時バインディングに変えて、後で考えるほうが無難です。
(02)「事前バインディング(As Excel.Appliaction や As WorkSheet、As Range 等々でのオブジェクト変数の宣言)」
は、参照設定しないとできない。また、型を細かく指定しないといけない(ローカルウィンドウで確認するなどして)。
作ったバージョンとは違うOfficeのバージョンがインストールされているパソコンにそのファイルをコピーすると、バージョンの番号違いのために参照設定がはずれてエラーになることが多い(解決するには事前にOfficeのバージョンを調べて、VBAで「参照設定したことにするコードを書く、など。)。
複数バージョンのOfficeを混合インストールしていると、動作がおかしくなることがあるので注意。
事前バインディングできるはずなのにエラーになる、というケースもあるので、その場合は素直に As Object の実行時バインディングに変えて、後で考えるほうが無難です。
★ 結局どちらのバインディングが有利か?
結局、「事前バインディングできるはずなのにエラーになる」、というケースもあるので、その場合は素直に As Object の実行時バインディングに変えて、後で考えるほうが無難だもんですから、なんだかんだ言って、結局のところは「両方のやり方を知っておく」必要にせまられます。
どうしても「どっちか」、というなら、
例えば異なるバージョンのOfficeがインストールされたパソコンが多いようなら、「バージョン違いのエラーが出るので参照設定を入れたり変更したりが面倒くさい」という要望が出てきたら、速度の問題がない限りは、「実行時バインディング」のほうがいいかもしれません。
インテリセンスが使えないのは私たち初心者にとっては弱点ですが、どうしてもというなら、最初は事前バインディングで書き進めて、さいごの仕上げの時に、実行時バインディングに書き直せばよいと思います。
そのため、オブジェクト変数やSetの記述を先頭のほうに固めておいたり、New、Add、Open、CreateObject関数、GetObject関数、の使い方を熟知しておく必要があります。
逆に、もし、バージョンの違うOfficeがインストールされたパソコンがたくさんあったとしても、VBAコードでバージョンの違いをチェックして、そのパソコンに適合した参照設定に自動・強制切り替えする、ということができるなら、事前バインディングでも良いと思います。
もちろん、バージョンが統一されているなら、その場合も、事前バインディングでいいと思います。
こちらも、オブジェクト変数やSetの記述を先頭のほうに固めておいたり、New、Add、Open、CreateObject関数、GetObject関数、の使い方を熟知しておく必要があります。
ちまたでは、「事前バインディングが高速だからこっちがいい!」などというWebページもありますが、今のマシンパワーならそんな状況もそう多くはないと思いますので、それは無視して、そのときそのときの都合で変えていけばいいと思います。事前場インディングできるはずがエラーでないきないため実行時バインディングに変えることもあるので。
そのためにも、変数とSET構文は、プログラムの先頭部分に集めおいたほうがいいかもしれません。
★ 「New」「Add」「Open」「CreateObject関数」「GetObject関数」と「事前バインディング・実行時バインディング」との関係について
「CreateObject関数」「GetObject関数」「Add」「Open」は「参照設定」しても・してなくても使えます。また、「事前バインディング・実行時バインディング」のどちらでも使えます。
また、「すでに開いている既存ファイル」をオブジェクトとして取得したい場合は、「GetObject関数」を使います。
既存ファイルは、
「GetObject("フルパス")」と、第一引数だけをフルパスで書くことで、ファイルそのものを(関連付けされたアプリケーションで)開き、その「ファイル」をオブジェクトとしても返してもらえます。(「アプリケーションウィンドウ」の取得があとで必要です。)
また、
「GetObject(,"×××.Application")と、第一引数を省略して第二引数(クラス名)を書くことで、「すでに開いているファイル」の「アプリケーションウィンドウ」が取得できます。(中身のファイルの取得が、あとで必要です。)
▼実行時バインディングの例01
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
' ' 'Excelの既存ファイルを、NewキーワードとOpenメソッドでWordなどから開く例。 '実行時バインディングだけど、また、 '変数設定の場所ではないですが、でも「Excel.Application」という明示的な記述があるため、 '参照設定しないと「Excel.Application」のところでエラーになります。 Sub test04() Dim App As Object Set App = New Excel.Application App.Visible = True App.Workbooks.Open "d:\1\1.xlsx" End Sub ' ' |
▼実行時バインディングの例02
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
' ' 'Excelの既存ファイルを、CreateObject関数とOpenメソッドでWordなどから開く例。 '実行時バインディングです。 'CreateObject関数のところで、「Excel.Application」という記述がありましますが、 'これは「文字列」なので、参照設定しなくても大丈夫です。エラーになりません。 Sub test07() Dim App As Object Set App = CreateObject("Excel.Application") App.Visible = True App.Workbooks.Add End Sub ' ' |
▼実行時バインディングの例03(多分。自信なし。)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
' ' 'アクティブなシートのA1セルをObject型変数に代入する例 Sub test08() Dim Rng01 As Object Set Rng01 = ActiveSheet.Range("A1").Value End Sub ' ' |
▼実行時バインディングの例04(多分。自信なし。)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
' ' 'アクティブなシートのA1セルをVariant型変数に代入する例 Sub test09() Dim Rng01 As Variant Set Rng01 = ActiveSheet.Range("A1").Value End Sub ' ' |
▼事前バインディングの例01
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
' ' 'ヘルプの事前バインディングのコード(参照設定をしないと変数設定の段階でエラー) Sub test03() Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Set xlApp = CreateObject("Excel.Application") xlApp.Visible = True Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) End Sub ' ' |
▼事前バインディングの例02
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
' ' 'Excelの既存ファイルを、CreateObject関数とOpenメソッドでWordなどから開く例。 '事前バインディングです。 '変数設定で「Excel.Application」という明示的な記述があるため、 '参照設定しないと「Excel.Application」のところでエラーになります。 Sub test05() Dim App As Excel.Application Set App = CreateObject("Excel.Application") App.Visible = True App.Workbooks.Open "d:\1\1.xlsx" End Sub ' ' |
▼事前バインディングの例03
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
' ' 'Excelの新規ファイルを、CreateObject関数とAddメソッドでWordなどから作成する例。 '事前バインディング 'ヘルプの例を短くしたもの Sub test0650() Dim App As Excel.Application Set App = CreateObject("Excel.Application") App.Visible = True App.Workbooks.Add End Sub ' ' |
▼事前バインディングの例04(多分。自信なし。)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
' ' 'アクティブなシートのA1セルをRange型の変数に代入する例 Sub test10() Dim Rng01 As Range Set Rng01 = ActiveSheet.Range("A1").Value End Sub ' ' |
また、「実行時バインディング」はその都度その都度の、「一時的なバインディング」ということになります。
ちなみにですが、各バインディングの有効期間(?)としましては・・・、
「事前バインディング」は、プログラムが実行されている間だけでなくファイルを開いているあいだ中ずっと有効です。「常時・長期間」なイメージのバインディングです。
ただし、稀に、バインディング対象のソフトがちゃんとインストールされているにもかかわらず、何かの拍子に勝手にバインディングがはずれて、エラーを出す場合があります。
特に別のPCにファイルをコピペ等したとき、PCやOfficeの再インストールをしたとき、バージョンの違うOfficeに入れ替えたとき、バージョン違いのOfficeを混在インストールした場合でバインディング先のバージョンが変わったとき、などになりやすいです。(バージョンの違うOfficeに入れ替えたとき以外は、ならない場合の方が多いですが。)
OfficeやOSのビット数が変わったときもかも?
ただ、いずれにしましても、エラーが出たときにVBEの「ツール→参照設定」の内容を見て、「参照不可」になっていたら、もう一度、チェックを入れなおしてOKします。それで当分は大丈夫です。
「実行時バインディング」は、プログラムが実行されている間だけ有効です。「一時的・一瞬/短時間」なイメージのバインディングです。
ただし「プログラム実行中」、といっても「バインディングするよ~」という内容のプログラムを書いた場所から終わりまで、という意味です。「バインディングするよ~」という内容のプログラムを書いてないプログラムの実行中は、もちろん、バインディングは無効のままです。
なお、こちらは、プログラムが実行されるその都度、プログラムコードによって一時的にバインディングするので、「ソフトがちゃんとインストールされてさえいれば」、『 何かの拍子に勝手にバインディングがはずれて、エラーを出す』なんていうことは基本的にはありません。
検証はしていませんが、例えばOfficeのバージョンが異なってもバインディングのためのプログラムコードは変わりませんので、バージョン違いは吸収されるのではないか?と予想します。
なお、いずれも、「別のパソコンにファイルをコピーした際」や「PCの再インストール直後」に、そのパソコンの中にバインディング対象のソフトがちゃんとインストールされていないと、エラーになります。
場合によってはバージョンや32bit・64bitが違うときにもエラーになるかも?です。必要なコンポーネント(DLLなど)がインストールされていない場合もエラーになることがあります。(特にPCの再インストール直後)
あと、複数のバージョンのOfficeを1つのOSに同時にインストールしていた場合は、事前も・実行時も・どちらのバインディングもおかしな挙動になる場合があるようです。
また、「事前バインディング」や「実行時バインディング」で「CreateObject関数」や「GetObject関数」が やってくれることとしては(たとえばExcelから他のソフトをバインドした場合なら)・・・
"CreateObject関数" は、
・全く何もない状態から新しくWordやAccess等々のアプリケーションウィンドウ(ガワ)を開きつつ、
・プログラムの実行後~完了するあいだのみ・それらに一時的にバインディングをしてくれつつ、
・同時に、その作ったファイルを「オブジェクト」として返してくれます。
そのような「3つ」のことをしてくれます。
※CreateObject関数は、空っぽの「ガワ」「だけ」を開いてくれるにすぎないなので、白地のファイルの画面を表示させるには、別途、AddやOpenなどのメソッドを使って開くことが必要です。
(バインディングはファイルに対してではなく、ソフトウェアに対して行われるっぽいです。)
"GetObject関数" は、
・WordやAccess等々のアプリケーションウィンドウ(ガワ)を別個に新しく開きつつ、
(ホントはファイルに関連づいたアプリケーションのウィンドウを開く。)
・既存のファイルを開きつつ、
・プログラムの実行後~完了するあいだのみ・それらに一時的にバインディングをしてくれつつ、
・同時に、その開いたファイルを「オブジェクト」として返してくれます。
そのような「4つ」のことをしてくれます。
※GetObject関数は、「ガワ」とファイルの2つのオープンをしてくれるので便利です。
(つまり、1つのコマンドで、New・・・とOpenの2つの動作をしてくれる)
(こちらもバインディングはファイルに対してではなく、ソフトウェアに対して行われるっぽいです。)
※Wordの場合なら ExcelやAccessなどのファイルに対して、Accessの場合なら WordやAccessなどのファイルに対して、同じことをしてくれます。
なお、相手のソフトに対して「ツール→参照設定」をした場合には「実行時バインディング」だけでなく「事前バインディング」も使えるので、その場合は基本的には・・・、
新規の相手ソフトのファイルを作りたいときに、"CreateObject関数" は原則的には使う「必要がありません」。(もちろん、使ってもよいですが。)
たとえばWordからExcelに対して、ツール→参照設定をしたのなら、"CreateObject関数" は使わずに・・・、
Set オブジェクト変数A = New Excel.Application
オブジェクト変数A.Visible = True
Set オブジェクト変数B = オブジェクト変数A.Workbooks.Add
・・・という感じで「New」キーワードと「Add」メソッドにて、Excelの新規ファイルの作成ができます。大量のファイルを開いたりするときはこちらのほうが実行時バインディングよりも、一応、動作が速いそうです。未チェックですが・・・。(逆に、ExcelからWordへ参照設定した場合なら、「Excel」の部分が「Word」に、「Workbooks」が「Documents」に変わります。それで、Wordの新規ファイルを作れます。)
(参考記事:『~用語:Setと「New」キーワードのことについて。「New」って何?~』)
同様に、相手の既存ファイルを開きたいときも、原則的には、"GetObject関数" を使う「必要がありません」。(こちらも、使ってもOKなのですが。)
同じく、WordからExcelに対して、ツール→参照設定をしたのなら、、"GetObject関数" は使わずに・・・、
Set オブジェクト変数A = New Excel.Application
オブジェクト変数A.Visible = True
Set オブジェクト変数B = オブジェクト変数A.Workbooks.Open("ファイルのフルパス")
・・・という感じで「Open」メソッドにて、Excelの既存のファイルが開けます。
(こちらもExcelからWordへ参照設定した場合なら、「Workbooks」が「Documents」に変わります。それでWordの既存のファイルが開けます。)
※※ それぞれ、「~~.Visible = True 」にて表示させます。
ただし、「すでに開いているファイル」を取得したい場合だけは、「GetObject関数」を使うしかありません。
例えば「すでに開いているExcelファイル」を取得したい場合、以下のように書くと、目的のファイルを取得できます。
Set オブジェクト変数A = GetObject(,"Excel.Application")
Set オブジェクト変数B = オブジェクト変数A.Workbooks.Open("タイトルバーに表示されたファイルの名前のみ")
あともうひとつ、似たようなことですが、・・・、
基本的に、Excelを普通に開いたときは、すでに、
「Excel自身(=「Microsoft Excel ×× Object Library」)に対して、ツール→参照設定がなされています。
(Wordなら、Word自身(=「Microsoft Word ×× Object Library」)に対して、ツール→参照設定がなされています。)
ですので、Excelをすでに開いた状態から、さらに新規や既存の「Excelの」ファイルを、作ったり開いたりしたいときには、"CreateObject関数" や "GetObject関数" は一応、「使う必要がない」、ということになります。
「New」キーワード+「Add」メソッドでExcelの新規ファイルが、「Open」メソッドでExcelの既存ファイルが、作れる・開ける、ということになります。
また、同じアプリケーション内でなら必ずしもNewを使う必要もないので、「Add」メソッドだけでExcelの新規ファイルが、「Open」メソッドだけでExcelの既存ファイルが、作れる・開ける、ということになります。
同様に、Wordを開いて、新しいWordのファイルや既存のWordファイルを開くときも、"CreateObject関数" や "GetObject関数" は必要ありません。
というか使いません。(使えてしまいますけど使いません。)
「Add」や「Open」でWordの新規や既存のファイルを操作します。
もちろん、Accessでも同様です。
(参考記事:『~用語:Setと「New」キーワードのことについて。「New」って何?~』)
「事前バインディング」と「実行時バインディング」の、どちらがどうメリットがあるかは終わりに示したWebページのほうが詳しいのでご参考にしてください。
なお、「事前バインディング」はたまにその参照設定が外れてエラーを起こすことがある・・・と書きましたが、そのような場合は、VBAで明示的・強制的に、「VBEの ツール→”参照設定” ダイアログでの チェックON 設定をしたことにする」といったことができるようです。
そのようなことをしたい場合は、以下のWebページをご参考にしてください。
Office TANAKA:マクロで参照設定を操作する
「現在インストールされているバージョンに、参照設定を自動的にやりなおす」といったことができると思います。
逆に、「実行時バインディング」を使うと、参照設定をしないのでインテリセンスが使えなかったりしますので「学習」の面からすると、ちょっと不便な面もあります。
さらに逆に・・・、
参照設定をすると、インテリセンスはもちろん、オブジェクトブラウザも使えるようになります。例えば下図の状態だと、ExcelからWordのヘルプを見ることもできます。オブジェクトブラウザのクラスやメソッド・プロパティを選択してからの「F1」キーでWordのそれらのヘルプページを表示させることもできます。(ヘルプファイルが存在するもののみ、ですが。)
上図の例では、Excelの初期状態に、DAO 3.6、ADO 2.5、Word を「ツール→参照設定」してあります。「ツール→参照設定」をしたらした分だけ、このドロップダウンの中に、そのチェックを入れたものが増えていきます。
オブジェクトブラウザが使えると勉強しやすいので、「VBAでのCOMオートメーションの学習」には参照設定して、事前バインディングをしばらくのあいだ、利用したほうがいいかもしれません。(もちろん参照設定しても実行時バインディングも使えます。)
(バージョン違いは、先ほどご紹介した『 Office TANAKA:マクロで参照設定を操作する 』といった方法で吸収するなどして・・・。
『VBA 参照設定とCreateObjectを定数1つで切り替えるテクニック』も参考になるかもしれません。
※実行時バインディングでExcelから既存のWordファイルを開く例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
' ' Sub test() Dim wd As Object Set wd = GetObject("D:\1\1.docx") 'wd.Visible = True 'GetObjectの場合、これだと「サポートしてない」のエラーになります。 wd.Application.Visible = True Debug.Print wd.Name 'wd.Close 'Set wd = Nothing End Sub ' ' |
※実行時バインディングでWordから既存のExcelファイルを開く例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
' ' Sub test() Dim MyXL As Object ' 表示対象のファイルへの参照をオブジェクト変数に代入します。 Set MyXL = GetObject("D:\1\1.xlsx") ' Application プロパティを使って、Microsoft Excel を表示します。 ' さらに、オブジェクト変数 MyXL の Windows コレクションを使って、 ' 指定したワークシートが含まれる実際のウィンドウを表示します。 MyXL.Application.Visible = True MyXL.Windows(1).Visible = True '子ウィンドウも Visible = True しないといけない? Debug.Print MyXL.Name End Sub ' ' |
※関連記事
COMオートメーションとは?
※参考Webページ
VBA CreateObject関数と参照設定の違い
APIとOLEオートメーション(「CreateObject「参照設定」「事前バインディング・実行時バインディング」について)
Office をマルチスレッドでオートメーションすることの危険性
VBA オートメーション、参照設定、ライブラリ、タイプライブラリ、DDE、COM、OLE、ActiveXなどの用語整理。ついでに.NETも。