当方エクセル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.2
- 回答日時:
>この二つは何が違うのでしょうか?
結果は同じです。
プログラムIDを引数にとり、COMオブジェクトを新規に生成するのがCreateObject。
既に存在するファイル名を引数にとり、そのファイルを操作するオートメーションオブジェクトを参照して取得するのがGetObjectです。ファイル操作のオブジェクトが複数ある可能性もあり、第2引数にプログラムIDを取ることもできます。
参考URLをよく読んでみてください。
参考URL:http://www.atmarkit.co.jp/fwin2k/operation/wsh03 …
まとめると
CreateObject・・・プログラムIDを引数にとり、COMオブジェクトを新規に生成する。
GetObject・・・既に存在するファイル名を引数にとり、
そのファイルを操作するオートメーションオブジェクトを参照して取得する。
ファイル操作のオブジェクトが複数ある可能性もあり、第2引数にプログラムIDを取ることもできる。
という事ですね。
URLもよく見てみます。
ありがとうございました。
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
もう少し実務的なマクロを扱わないと、この話では理解できないかもしれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- その他(プログラミング・Web制作) VBSでExcelファイル起動時、重複しても開くのを止めたい 1 2022/10/01 23:20
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) Excel VBA メール作成について 本文の中にExcel でコピーした図を上下に2つ 貼り付けを 2 2023/06/14 01:48
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
<ACCESS VBA -> EXCEL>getObjectしたEXCELファイルのシートを指定したい
Excel(エクセル)
-
エクセル(複数インスタンス)より任意のWorkBookを取得したい
Visual Basic(VBA)
-
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
-
4
メッセージボックスのOKボタンをVBAでクリックさせたい
Visual Basic(VBA)
-
5
エクセルから現在起動しているアクセスファイルをアクティブにしたい
Access(アクセス)
-
6
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
7
別インスタンスのエクセルを制御したい
Excel(エクセル)
-
8
「インスタンス」の意味をわかりやすく教えてください
Visual Basic(VBA)
-
9
カレントレコードが無い事を判定させる方法
Visual Basic(VBA)
-
10
Accessで文字列の長さによって、フィールドの幅を自動で合わせる方法
Excel(エクセル)
-
11
On ErrorでエラーNoが0
Visual Basic(VBA)
-
12
Access サブフォームでの選択行の取得
その他(データベース)
-
13
VBAをつかってクエリの情報を抽出するには??
Visual Basic(VBA)
-
14
VBAで既に開いている別アプリケーションのオブジェクトを得る
Visual Basic(VBA)
-
15
ExcelVBA:すでに開かれているブックの判定方法
Visual Basic(VBA)
-
16
EXCEL VBAで2つEXCELを起動したときのブック名取得の方法
その他(Microsoft Office)
-
17
VBAで別プロセスのExcelのフルパスの取得
Visual Basic(VBA)
-
18
EXCELのVBAでWORDが開いてあるかチェック
Excel(エクセル)
-
19
ExcelのVBA。public変数の値が消える
Visual Basic(VBA)
-
20
開いたとき常に同じ大きさ・位置で表示したい
Windows 7
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
エクセルのVBAの標準モジュール...
-
Excelでフィルタをかけると警告...
-
実行時エラー 3265「要求された...
-
VBAで既に開いている別アプリケ...
-
テキストボックス中の文字列の...
-
VBAで Set wb = Sheets(1).Cop...
-
VBScriptでの起動済みのIEの操作
-
textBox isNot Nothing とは
-
EXCEL VBA COLLECTIONオブジェ...
-
AccessVBAで「dim dbs as datab...
-
VB6 エクセルに画像貼り付け
-
VBAについてです。 初心者です...
-
ExcelのVBAで3-D等高線のXYZ回...
-
VBAでWebページにセルの値を入力
-
上下の位置揃えについて
-
InternetExplorer.Application...
-
ある文字列が全て数字であるか...
-
VBで引数にDictionaryオブジェ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
実行時エラー 3265「要求された...
-
エクセルのVBAの標準モジュール...
-
VBAで既に開いている別アプリケ...
-
VBAで Set wb = Sheets(1).Cop...
-
テキストボックス中の文字列の...
-
PowerPointVBAでスライドマスタ...
-
エクセルマクロエラー「'Cells'...
-
VBAからPDFファイルにパスワー...
-
Excelでフィルタをかけると警告...
-
オブジェクトが見つかりません
-
ある文字列が全て数字であるか...
-
EXCEL VBA オートシェイプナン...
-
[VBA]CDOメッセージ送信エラー
-
VBAで作成するメール(開封確認...
-
VBAについてです。 初心者です...
-
VBA:オートシェイプの線の長...
-
VBで引数にDictionaryオブジェ...
-
AccessVBAで「dim dbs as datab...
おすすめ情報