こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

CreateObjectとGetObjectの違い

当方エクセル2003です。

Sub test_CreateObject()
Dim App As Excel.Application
Dim MyFileName As String

Set App = CreateObject("Excel.Application")

MyFileName = ActiveWorkbook.Path & "\新規Microsoft Excel ワークシート.xls"

With App
.Workbooks.Open FileName:=MyFileName
.Visible = True
End With

Set App = Nothing

End Sub
---------------------------------------------------------
Sub test_GetObject()
Dim App As Excel.Application
Dim MyFileName As String

Set App = GetObject(, "Excel.Application")

MyFileName = ActiveWorkbook.Path & "\新規Microsoft Excel ワークシート.xls"

With App
.Workbooks.Open FileName:=MyFileName
.Visible = True
End With

Set App = Nothing
End Sub

この二つは何が違うのでしょうか?
どちらも既存のエクセルファイルがが開きます。

投稿日時 - 2012-10-22 21:15:02

QNo.7761411

困ってます

質問者が選んだベストアンサー

こんばんは。

>どちらも既存のエクセルファイルがが開きます。

いいえ。ご相談に掲示されたそれらのコードでは、結果が異なります。(必要に応じてエクセルを再起動しながら確認します)

createobjectの場合は、必ず新しいエクセルアプリケーションが起動します。
あなたのgetobjectでは、今開いているエクセルの中でブックが開きます。

あなたのマクロと違う
set app = getobject("", "Excel.Application")
とした場合は、createobjectと同じ結果となります。

投稿日時 - 2012-10-22 22:04:20

お礼

やり直してみたら仰る通り、
createobjectの場合は、必ず新しいエクセルアプリケーションが起動します。
getobjectでは、今開いているエクセルの中でブックが開きます。
になりました。

ご回答ありがとうございました。

投稿日時 - 2012-10-23 21:26:10

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

サンプルコードは、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

もう少し実務的なマクロを扱わないと、この話では理解できないかもしれません。

投稿日時 - 2012-10-23 09:09:25

お礼

ありがとうございました。

投稿日時 - 2012-11-05 22:59:38

ANo.2

>この二つは何が違うのでしょうか?

結果は同じです。

プログラムIDを引数にとり、COMオブジェクトを新規に生成するのがCreateObject。
既に存在するファイル名を引数にとり、そのファイルを操作するオートメーションオブジェクトを参照して取得するのがGetObjectです。ファイル操作のオブジェクトが複数ある可能性もあり、第2引数にプログラムIDを取ることもできます。

参考URLをよく読んでみてください。

参考URL:http://www.atmarkit.co.jp/fwin2k/operation/wsh03/wsh03_02.html

投稿日時 - 2012-10-22 22:08:04

お礼

まとめると
CreateObject・・・プログラムIDを引数にとり、COMオブジェクトを新規に生成する。

GetObject・・・既に存在するファイル名を引数にとり、
そのファイルを操作するオートメーションオブジェクトを参照して取得する。
ファイル操作のオブジェクトが複数ある可能性もあり、第2引数にプログラムIDを取ることもできる。

という事ですね。
URLもよく見てみます。
ありがとうございました。

投稿日時 - 2012-10-23 21:26:53

あなたにオススメの質問