
当方エクセル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
この二つは何が違うのでしょうか?
どちらも既存のエクセルファイルがが開きます。
No.1ベストアンサー
- 回答日時:
こんばんは。
>どちらも既存のエクセルファイルがが開きます。
いいえ。ご相談に掲示されたそれらのコードでは、結果が異なります。(必要に応じてエクセルを再起動しながら確認します)
createobjectの場合は、必ず新しいエクセルアプリケーションが起動します。
あなたのgetobjectでは、今開いているエクセルの中でブックが開きます。
あなたのマクロと違う
set app = getobject("", "Excel.Application")
とした場合は、createobjectと同じ結果となります。
やり直してみたら仰る通り、
createobjectの場合は、必ず新しいエクセルアプリケーションが起動します。
getobjectでは、今開いているエクセルの中でブックが開きます。
になりました。
ご回答ありがとうございました。
No.3
- 回答日時:
サンプルコードは、Excelのコードのようですが、エラーは出ないけれども、コードの内容がかなりヘンです。
オートメーションというのは、他のアプリケーションからコントロールすることです。仮に、Wordから試してみると良いです。たぶん、動かないはずです。どうすればよいのかは、考えてみてください。>この二つは何が違うのでしょうか?
オブジェクトが、まったく違います。GetObject は、既存のExcelのオブジェクトですが、CreateObject は、新規に生成されたExcelのオブジェクトです。
#2の方の参照先の「アットマーク・アイティ」を、何度か読んでみて、分かりにくいというか、今時の内容なんだなって思いました。VBAプログラミングで、いきなりCOMの話をすると、絵に描いた餅で、実際の所が見えてきません。
一応説明は、MSDNにあります。
「COM オブジェクトとは」
http://msdn.microsoft.com/ja-jp/library/cc351706 …
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
もう少し実務的なマクロを扱わないと、この話では理解できないかもしれません。
No.2
- 回答日時:
>この二つは何が違うのでしょうか?
結果は同じです。
プログラムIDを引数にとり、COMオブジェクトを新規に生成するのがCreateObject。
既に存在するファイル名を引数にとり、そのファイルを操作するオートメーションオブジェクトを参照して取得するのがGetObjectです。ファイル操作のオブジェクトが複数ある可能性もあり、第2引数にプログラムIDを取ることもできます。
参考URLをよく読んでみてください。
参考URL:http://www.atmarkit.co.jp/fwin2k/operation/wsh03 …
まとめると
CreateObject・・・プログラムIDを引数にとり、COMオブジェクトを新規に生成する。
GetObject・・・既に存在するファイル名を引数にとり、
そのファイルを操作するオートメーションオブジェクトを参照して取得する。
ファイル操作のオブジェクトが複数ある可能性もあり、第2引数にプログラムIDを取ることもできる。
という事ですね。
URLもよく見てみます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ExcelVBAで既に開いてるwordを閉じる
Excel(エクセル)
-
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
-
4
VBAで既に開いている別アプリケーションのオブジェクトを得る
Visual Basic(VBA)
-
5
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
6
EXCELのVBAでWORDが開いてあるかチェック
Excel(エクセル)
-
7
VBAをつかってクエリの情報を抽出するには??
Visual Basic(VBA)
-
8
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
9
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
10
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
11
VBSの処理中一旦処理を止めて再開させたい。
Visual Basic(VBA)
-
12
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
13
「Columns(A:C")」の列文字を数字にして表記したい"
Excel(エクセル)
-
14
ExcelのVBA。public変数の値が消える
Visual Basic(VBA)
-
15
Access開いているブックのセル値参照
Access(アクセス)
-
16
ExcelのVBAで、選択したファイルが既に開かれているか確認したい
Excel(エクセル)
-
17
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
18
Excel-VBAの「しばらくお待ちください」のダイアログが自動的に閉じない
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
AccessVBAで「dim dbs as datab...
-
worksheetFunctionクラスのVloo...
-
エクセルから表をパワーポイン...
-
エクセルマクロエラー「'Cells'...
-
コンパイルすると「メソッドま...
-
メモリ解放について(ASP)
-
「Columns("A:C")」の列文字を...
-
配列にしたセル範囲でのコメン...
-
ExcelVBAのコントロールの種類...
-
どう増強すべきか
-
複数のコマンドボタン(VBAで)...
-
VBA シートのボタン名を変更し...
-
パソコンへの「Dropbox...
-
Debug.exe実行時にWinMainCRTSt...
-
【マクロ】エラー【#DIV/0!】が...
-
フォーム1が開いているのならMs...
-
VB.NETでラベルの大きさってど...
-
クリックイベントなのに、2回ク...
-
[VB.net] ボタン(Flat)のEnable...
-
Do While中のVBAアプリケーショ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
PowerPointVBAでスライドマスタ...
-
エクセルのVBAの標準モジュール...
-
Excelでフィルタをかけると警告...
-
実行時エラー 3265「要求された...
-
テキストボックス中の文字列の...
-
VBAからPDFファイルにパスワー...
-
VBAで既に開いている別アプリケ...
-
Excel VBAでIEにアクセスするプ...
-
オブジェクトが見つかりません
-
ExcelVBAでのNZ関数について
-
エクセルVBAでcode128のバー...
-
WordにOLEで埋め込んだExcelでW...
-
AccessVBAで「dim dbs as datab...
-
エクセルマクロエラー「'Cells'...
-
エクセル エラー438
-
[VBA]CDOメッセージ送信エラー
-
VBAで作成するメール(開封確認...
-
VBScriptでファイルの日時順(降...
おすすめ情報