- ベストアンサー
CreateObjectとGetObjectの違い
- CreateObjectとGetObjectの違いについて、エクセル2003を使用したサンプルコードを元に説明します。
- CreateObjectは新しいExcel.Applicationオブジェクトを作成し、GetObjectは既存のExcel.Applicationオブジェクトを取得します。
- どちらの方法でも既存のエクセルファイルを開くことができますが、CreateObjectは新しいアプリケーションオブジェクトを作成するため、処理速度がGetObjectよりも遅くなることがあります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 >どちらも既存のエクセルファイルがが開きます。 いいえ。ご相談に掲示されたそれらのコードでは、結果が異なります。(必要に応じてエクセルを再起動しながら確認します) createobjectの場合は、必ず新しいエクセルアプリケーションが起動します。 あなたのgetobjectでは、今開いているエクセルの中でブックが開きます。 あなたのマクロと違う set app = getobject("", "Excel.Application") とした場合は、createobjectと同じ結果となります。
その他の回答 (2)
- WindFaller
- ベストアンサー率57% (465/803)
サンプルコードは、Excelのコードのようですが、エラーは出ないけれども、コードの内容がかなりヘンです。オートメーションというのは、他のアプリケーションからコントロールすることです。仮に、Wordから試してみると良いです。たぶん、動かないはずです。どうすればよいのかは、考えてみてください。 >この二つは何が違うのでしょうか? オブジェクトが、まったく違います。GetObject は、既存のExcelのオブジェクトですが、CreateObject は、新規に生成されたExcelのオブジェクトです。 #2の方の参照先の「アットマーク・アイティ」を、何度か読んでみて、分かりにくいというか、今時の内容なんだなって思いました。VBAプログラミングで、いきなりCOMの話をすると、絵に描いた餅で、実際の所が見えてきません。 一応説明は、MSDNにあります。 「COM オブジェクトとは」 http://msdn.microsoft.com/ja-jp/library/cc351706.aspx C++の話ですから、分からなくて当然です。 今回は、COMとオートメーションの対比ではありません。あくまでも、オートメーションの取得と生成のお話です。そして、GetObject とCreateObject の仕組みの違いです。そもそもCOMオブジェクトというものは、ここでは関係ないのです。 確かに、CreateObjectで、プログラムIDを引数にとってCOMオブジェクトを指定することは可能ですが、通常は、VBAプログラミングでは、クラス(例:Excel.Application)を指定して、オートメーション・オブジェクトを生成します。 それに対して、GetObject は、「すでにそのオブジェクトが存在していれば、新しいオブジェクトは作成せずに存在しているオブジェクトを返す」ということです。 質問のサンプルコードでは、オブジェクトは、まったく別物です。 Sub test_GetObject() は、間違ってはいないければも、Excelマクロとしては、意味のないことをしています。 すでに存在しているExcelアプリケーション・オブジェクトを取得して、そこから、既存のブックを読んでいるだけです。つまり、マクロを動かしている本体のオブジェクトだということです。 それに対して、 Sub test_CreateObject() これは、普通はExcelからは行いませんが、まったく別のもの(サーバー)になってしまいます。 Office オートメーション サーバーの GetObject および CreateObject の動作 http://support.microsoft.com/kb/288902/ja もう少し、標準的なコードを探して試されることをお勧めします。 コードとしては古いようですが、ここにサンプルがあります。 Excel百科事典 http://home.att.ne.jp/zeta/gen/excel/c04p44.htm もう少し実務的なマクロを扱わないと、この話では理解できないかもしれません。
お礼
ありがとうございました。
- taco0603
- ベストアンサー率63% (21/33)
>この二つは何が違うのでしょうか? 結果は同じです。 プログラムIDを引数にとり、COMオブジェクトを新規に生成するのがCreateObject。 既に存在するファイル名を引数にとり、そのファイルを操作するオートメーションオブジェクトを参照して取得するのがGetObjectです。ファイル操作のオブジェクトが複数ある可能性もあり、第2引数にプログラムIDを取ることもできます。 参考URLをよく読んでみてください。
お礼
まとめると CreateObject・・・プログラムIDを引数にとり、COMオブジェクトを新規に生成する。 GetObject・・・既に存在するファイル名を引数にとり、 そのファイルを操作するオートメーションオブジェクトを参照して取得する。 ファイル操作のオブジェクトが複数ある可能性もあり、第2引数にプログラムIDを取ることもできる。 という事ですね。 URLもよく見てみます。 ありがとうございました。
お礼
やり直してみたら仰る通り、 createobjectの場合は、必ず新しいエクセルアプリケーションが起動します。 getobjectでは、今開いているエクセルの中でブックが開きます。 になりました。 ご回答ありがとうございました。