[リストへもどる]
一括表示

投稿時間:2003/07/10(Thu) 11:27
投稿者名:tak
Eメール:
URL :
タイトル:
GetObjectで実行時エラー429が出ます・・。
こんにちは!
こちらでも特集を組んで力を入れているVBからEXCELの操作について一つ分からない事があります。
下記のコードで「GetObject」実行時にエラーとなってしまいます・・。でも「CreateObject」なら正常にいけるんです。
環境はWIN2000+VB6.0SP5+EXCEL2000です。

  Dim oExcelApplication     As Object       'EXCELアプリケーション

    'EXCELアプリケーションをセット
    On Error Resume Next
    Set oExcelApplication = GetObject(, "Excel.application")
    If Err.Number <> 0 Then
        Set oExcelApplication = CreateObject("Excel.application")
    End If
    On Error GoTo 0

ちなみに上記コードをWIN95+(VBなし)+EXCEL97環境で行うとうまくいくんです・・。
「WindowsScript.DLL」のバージョン6.5をインストールしてレジストリの再登録を行ってもダメです・・。一体何故なのでしょうか??

もし、ご存知の方いらしたら是非、ご教授のほどよろしくお願いしますm(_ _)m

投稿時間:2003/07/10(Thu) 11:47
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: GetObjectで実行時エラー429が出ます・・。
どのような時に、どのようなエラーがでるのでしょうか?

もちろん、ここの説明は読んでおられますよね!

  'Microsoft Excel が既に起動されているかどうかを調べます。
  '第 1 引数を指定せずに GetObject 関数を呼び出すと、
  'アプリケーションのインスタンスへの参照が返されます。
  'Microsoft Excel が起動されていないと、エラーが発生します。
  Set xlApp = GetObject(, "Excel.Application")

当然、この 「Microsoft Excel が起動されていないと、エラーが発生します。」エラーとは
違うんですよね

このために、On Error Resume Next があるのですが、これを削除しているのですか?

投稿時間:2003/07/10(Thu) 11:58
投稿者名:tak
Eメール:
URL :
タイトル:
Re^2: GetObjectで実行時エラー429が出ます・・。
>花ちゃんさん
早急のレス、ありがとうございます!

もちろん、説明は読ませていただいております。
「On Error Resume Next」に関しては、「Microsoft Excel が起動されていない場合以外」にエラーにならないように「GetObject」の直前で指定して直後に「On Error GoTo 0
」で初期化しています。

Win95+ACCESS97環境では動いたんで、コードでなく環境のせいなのかな、とも思っています・・。でもDLL更新、レジストリ登録と調べた限りのことは試しているんです・・。

投稿時間:2003/07/10(Thu) 12:10
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: GetObjectで実行時エラー429が出ます・・。
1.どのような時にエラーがでるのですか?
 (Excelが起動されている時もでるのですか)
2.どこででるのですか?
  本来はエラーが表示されないはずなのですが。
3.私の元々のコードでもでるのですか?

1.〜3.について教えて下さい。

投稿時間:2003/07/11(Fri) 10:45
投稿者名:tak
Eメール:
URL :
タイトル:
Re^4: GetObjectで実行時エラー429が出ます・・。
>花ちゃんさん
即レスありがとうございます。
逆にぼくのレスが大変遅れて申し訳ありません・・m(_ _)m

一応、下記のコードで実行してみました。(御サイトのコードをそのままです。参照設定もしています。)

    'EXCELアプリケーションをセット
    '参照設定をしておいて下さい。
    ' エラーのトラップを留保します。
    On Error Resume Next

    'Microsoft Excel への参照を格納する変数を宣言します。
    Dim xlApp As Excel.Application

    'Microsoft Excel が既に起動されているかどうかを調べます。
    '第 1 引数を指定せずに GetObject 関数を呼び出すと、
    'アプリケーションのインスタンスへの参照が返されます。
    'Microsoft Excel が起動されていないと、エラーが発生します。
★  Set xlApp = GetObject(, "Excel.Application")

    If Err.Number Then
        MsgBox "Excel が起動されていません。"
        ' エラーが発生した場合は Err オブジェクトをクリアします。
        Err.Clear
    Else
        MsgBox "Excel はすでに起動中です。"
    End If

>1.どのような時にエラーがでるのですか?
Excelが起動されている場合にはちゃんと"Excel はすでに起動中です。"とメッセージボックスが出ました。どうもエラーになるのはExcelが起動されていない場合限定のようです。

>2.どこででるのですか?
上記コードで★印をつけた1行です。

>3.私の元々のコードでもでるのですか?
う〜ん・・。出るようです・・。

度々で申し訳ありませんが、よろしくお願いいたします。

投稿時間:2003/07/11(Fri) 12:11
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^5: GetObjectで実行時エラー429が出ます・・。
> >1.どのような時にエラーがでるのですか?
> Excelが起動されている場合にはちゃんと"Excel はすでに起動中です。"とメッセージボックスが出ま>した。どうもエラーになるのはExcelが起動されていない場合限定のようです。

貴方は、このサンプルで一体何がしたいのでしょうか?

[最初の時の回答内容]
#どのような時に、どのようなエラーがでるのでしょうか?

#もちろん、ここの説明は読んでおられますよね!

#  'Microsoft Excel が既に起動されているかどうかを調べます。
#  '第 1 引数を指定せずに GetObject 関数を呼び出すと、
#  'アプリケーションのインスタンスへの参照が返されます。
#  'Microsoft Excel が起動されていないと、エラーが発生します。
#  Set xlApp = GetObject(, "Excel.Application")

#当然、この 「Microsoft Excel が起動されていないと、エラーが発生します。」エラーとは
#違うんですよね

#このために、On Error Resume Next があるのですが、これを削除しているのですか?

上記の最初回答でも言っているようにこのサンプルはエクセルが既に起動中かどうかを調べる
サンプルです。
Set xlApp = GetObject(, "Excel.Application") でExcelが起動されていないと
エラーが発生するのを利用してExcelが起動されているかどうかを調べている
サンプルです。
従って、当然Excelが起動されていないとエラーが発生します。
そのためにOn Error Resume NextやIf Err.Number ThenやErr.Clearを使用
しています。

こういったエラーの発生を逆利用したプログラムは他にも結構あります。
(あまり、感心はしませんが、簡単なので)

もう一度、よく、サンプルの各行の動作を理解して見て下さい。


> >3.私の元々のコードでもでるのですか?
> う〜ん・・。出るようです・・。
プログラムを実行中にエラーが発生して止まりますか?とお聞きしているのです。
エラー処理をしているので、実行中はエラーが発生しているかどうかは解らない
はずです。(デバッグ中は別ですよ)

投稿時間:2003/07/11(Fri) 13:27
投稿者名:tak
Eメール:
URL :
タイトル:
Re^6: GetObjectで実行時エラー429が出ます・・。
>花ちゃんさん
お返事ありがとうございます。

>プログラムを実行中にエラーが発生して止まりますか?とお聞きしているのです。
はい。止まります。
エラー内容は「実行時エラー429 ActiveXコンポーネントはオブジェクトを作成できません。」です。
ただし、「GetObject」実行時のみに落ちるのあって、「CreateObject」では正常に処理を続行します。

>貴方は、このサンプルで一体何がしたいのでしょうか?
すみません。少し本題からズレてしまったかもしれません・・。
確かに、ソースだけ載せて、「何がしたいのか」は明記しておりませんでした。

ぼくは「ACCESSの商品テーブル(T_SYOHIN)内容をEXCELに貼り付けて、自分でEXCELを編集したい」のです。
※「syohin.mdb」のテーブル「T_SYOHIN」内容
連番 商品コード 商品名   原価 単価 ・・
01    12345       シャーペン  80    120   ・・  
02    67890       消しゴム    40    50    ・・
03    99999       えんぴつ    10    15    ・・


***** 処理仕様 *****
@EXCELが起動済みかどうか調べる
 ┣起動済み
 ┃ ┗「GetObject」で起動済みのEXCELのインスタンス取得。
 ┗未起動
   ┗「CreateObject」で新規にEXCELのインスタンス取得。
こうしておくと、起動済みなのに新規にインスタンス取得するという無駄が省けますので。
A処理後、出力シート(「C:\Work\File\output.xls」←シート名固定)はクローズしないで、そのままオープンした状態にしておく
B二度連続して作成ボタンを押した場合は「C:\Work\File\output.xls」を破棄して新規に作成し直す、からです。つまり一度目のは、有無を言わさず保存しないで終了して閉じてしまいます。


言葉だけで全てをお伝えするのは難しいですね・・。
上記が「ぼくのしたい事」の全貌です。
問題となっているのは「起動済みなのに新規にインスタンス取得しないための考慮」です。
くどい様ですが、もしよろしければお知恵を拝借できれば思います。

投稿時間:2003/07/11(Fri) 13:43
投稿者名:よねKEN
Eメール:
URL :
タイトル:
Re^5: GetObjectで実行時エラー429が出ます・・。
> >3.私の元々のコードでもでるのですか?
> う〜ん・・。出るようです・・。

VBの設定でエラー発生時の扱いを「エラー発生時に中断」にしていませんか?
#VB環境が今手元にないのでうろ覚えですが、
#メニューの[ツール]-[オプション]-[全般]タブ-項目[エラートラップ]みたいな項目です。

投稿時間:2003/07/11(Fri) 14:07
投稿者名:tak
Eメール:
URL :
タイトル:
解決致しました。
>よねKENさん
お返事ありがとうございますm(_ _)m
よねKENさんのお言葉どおり試してみたら・・できました!!
プログラミング中はエラー時中断にしていますが、なるほど、RESUME_NEXTしてようがなんだろうが、とにかくエラーならストップする分けなんですね・・。ぼくの認識が足りないばかりに・・。猛省いたします・・。

>花ちゃんさん
原因は、エラー時中断についてのぼくの勝手な認識にありました・・。こんな事で板を汚してしまったこと、深くお詫びいたします・・。