Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3305 / 13645 ツリー ←次へ | 前へ→

【62988】Excel VBA実行時エラー91について ゆっぴぃ♪ 09/9/29(火) 20:27 質問[未読]
【62989】Re:Excel VBA実行時エラー91について neptune 09/9/29(火) 23:02 発言[未読]
【62990】Re:Excel VBA実行時エラー91について ゆっぴぃ♪ 09/9/30(水) 0:06 質問[未読]
【62992】Re:Excel VBA実行時エラー91について まるちか 09/9/30(水) 6:56 回答[未読]
【63013】Re:Excel VBA実行時エラー91について ゆっぴぃ♪ 09/9/30(水) 22:41 お礼[未読]
【63002】Re:Excel VBA実行時エラー91について neptune 09/9/30(水) 16:06 発言[未読]
【63015】Re:Excel VBA実行時エラー91について ゆっぴぃ♪ 09/9/30(水) 22:54 お礼[未読]

【62988】Excel VBA実行時エラー91について
質問  ゆっぴぃ♪ E-MAIL  - 09/9/29(火) 20:27 -

引用なし
パスワード
   初めまして。
Excelに投稿すべきかAccessに投稿すべきか迷ったのですが、こちらに書かせていただきました。よろしくお願いいたします。


 Accessのプロシージャに、

    Dim xl As Object
    Set xl = CreateObject("Excel.sheet")

     ・・・処理を記述・・・

    xl.SaveAs "C:\Documents and Settings\" & d & "\デスクトップ\(ファイル名).xls"

     Set xl = Nothing

のように記述をして、DAOでAccessのテーブルの内容から必要なものをExcelに描き出してデスクトップ上にファイルを作成するという処理を作っています。

このプロシージャの最後にCallで別プロシージャを呼び出し、
そこには以下のような記載をしています。

   Dim tExcel As Object
   Dim tObj As Object
   Set tExcel = CreateObject("Excel.Application")
   Set tObj = tExcel.Application.Workbooks.Open("C:\Documents and           Settings\" & d & "\デスクトップ\(ファイル名).xls")
   tExcel.Visible = False

   ・・・処理を記述・・・   ☆ 問題の部分

   tObj.Close SaveChanges:=True
   Set tObj = Nothing
   tExcel = Nothing


このプロシージャでは最初に書いたプロシージャで作成したデスクトップ上の
Excelファイルに接続し、書式の変更などをします。
イメージとしては、1つめのプロシージャでExcelファイルを作って保存し、
2つめのプロシージャでそのファイルを再度開いて各種書式変更・・・
というような感じです。
2つめの処理は別のものでも使う可能性があったのでPublicプロシージャと
しています。


さて、Accessのコマンドボタンを押すとこれらのプロシージャが正常に作動して
デスクトップ上にExcelファイルが作成され、2つめのプロシージャの書式設定が
うまく適用されて保存されます。


ところが・・・正常にできたExcelファイルを削除したり名前を変更した後で
もう一度このコマンドボタンをクリックすると、
1つめのプロシージャは正常に動きますが、2つめで必ず実行時エラー91が
発生します。
具体的に発生する場所は、☆の部分に記載した以下のプロシージャの2行目です。


tObj.Worksheets(1).Range("A1").Select
  Selection.Font.Bold = True
  With Selection.Interior
    .Pattern = xlSolid
  End With
以下続く・・・


1回目が正常に動いているだけに、余計に意味がわからず困っています。
このエラー番号の書き込みは様々なサイトで見たのですが、それでもわからず・・・。


必要な情報がすべて記載できていないかもしれませんので、ご指摘いただければ
追記させていただきます。
こちらで質問してよかったのかわかりませんが、ぜひ教えていただければと思います。
よろしくお願いいたします。

【62989】Re:Excel VBA実行時エラー91について
発言  neptune  - 09/9/29(火) 23:02 -

引用なし
パスワード
   ▼ゆっぴぃ♪ さん:
確認ですが、実行時エラー91ってエラーコメントは
オブジェクト変数またはWithブロック変数が設定されていません
ですよね?

>、☆の部分に記載した以下のプロシージャの2行目です。
原因は良くわかりませんが、私なら一番最初に
tExcel.Visible = False
をコメントアウトしておき
エラーでとまった時、実際にselect出来ているかどうか確認してみます。

それと、正常に動作した後、Excelのインスタンスが正常に破棄されていますか?
この辺りも関係あるかどうかはわかりませんが、UPされたソースからは
確認できません。

【62990】Re:Excel VBA実行時エラー91について
質問  ゆっぴぃ♪ E-MAIL  - 09/9/30(水) 0:06 -

引用なし
パスワード
   ▼neptune さま:


さっそくのお返事ありがとうございます。


実行時エラーの内容はneptuneさんの書かれているとおりです。


>tExcel.Visible = False
>をコメントアウトしておき
>エラーでとまった時、実際にselect出来ているかどうか確認してみます。

やってみたところ、1番目のプロシージャは正常に動いているようで
テーブルデータの出力は見た目上確実にできていました。
そして2番目のプロシージャの具体的な処理が始まる部分で
止まっていて、A1のセルを選択した状態になっていました。
ということは少なくともここまでは正常に動いている・・・ということですよね?たぶんですが・・・。


>それと、正常に動作した後、Excelのインスタンスが正常に破棄されていますか?
>この辺りも関係あるかどうかはわかりませんが、UPされたソースからは
>確認できません。

すみません。「インスタンスが正常に破棄されている」という意味がよくわからなかったのですが、これは「Set」したものが確実に「Nothing」になっているかという意味なのでしょうか?
実はエラーで止まった後に該当のExcelファイルをクリックすると、自分自身が「使用中のため読み取りモードで開きますか?」というようなメッセージが表示されるのです。
この部分も実は質問したかったことなのですが、このエラーと関係あるのでしょうか・・・・。

但し、このメッセージが表示されるのは2回目以降にコマンドボタンをクリックしたときで、最初の1回目で作成したExcelファイルは書式まできっちりとVBAどおりに作られていて、普通にファイルを開いたり閉じたりすることができます。


このことから考えると、2回目以降に動かした際の1番目のプロシージャの記述方法にどこか問題がある可能性があるということになるんでしょうか?


「インスタンスが正常に破棄されている」かどうかはどのようにして確認するものなのでしょうか?プロシージャに記述するものであれば、どのような表記なのかぜひ教えてください。

【62992】Re:Excel VBA実行時エラー91について
回答  まるちか  - 09/9/30(水) 6:56 -

引用なし
パスワード
   AccessVBAに書いたコードなんですよね
だとすると

>  Selection.Font.Bold = True
>  With Selection.Interior

のような記述はアウトです。
(同様のまずい記述が多数ありそうな予感がします。)
まずはオートメーションについてよく勉強したほうがいいでしょう。

簡単に言えば、コード内のエクセルのすべてのオブジェクトは
起動したエクセル経由で書かないといけません。
(いきなりSelectionなどはありえない。)
それからSelectなどExcelVBAでも推奨されない記述は避けるべきです。
つまりオートメーションはExcelVBAをよく理解できていないと
難しいということなのでしょう。

ちなみに、この手の質問は結構多いです。(同じミスの質問です。)
そして、その質問内容では、なぜか処理内容の部分は省略されていることも多いです。問題はその中にあるのにです。

AccessVBAの掲示板のほうがいいかもしれないです。
過去ログとかに同じ事例がありそうですから。

【63002】Re:Excel VBA実行時エラー91について
発言  neptune  - 09/9/30(水) 16:06 -

引用なし
パスワード
   ▼ゆっぴぃ♪ さん:
こんにちは

良く見てませんでしたが、まるちか さんが書かれている通り
selectionはまずいですね。
その他にも、rangeとかactive○○とかもまずいです。
対応は、まるちか さんご指摘どおり。
そもそも使う事はお勧めできません。
・・・・使わなくても良い。

>実はエラーで止まった後に該当のExcelファイルをクリックすると、
>自分自身が「使用中のため読み取りモードで開きますか?」というような
>メッセージが表示されるのです。
これは正常に終了せずExcelがそのBookを掴んでいるせいです。
プロセスも残っていると思われます。(確認はしてないですが。)
対策としては、errorステートメントを使用して、正常に終了処理
をする事で回避できます。

>。「インスタンスが正常に破棄されている」という意味がよくわからなかったのですが、
XPならタスクマネージャのプロセスタブで確認できます。

インスタンスが正常に破棄されていればタスクマネージャには表示されません。
詳しくは
「VBレスキュー」
ht tp://hanatyan.sakura.ne.jp/
の左側のフレームの「VB6.0関係」→「カテゴリ別一覧」→「カテゴリ別一覧」
の中の
VBからExcel及びWordを操作する時の注意事項
Excel のタスクを正常に終了できない現象
に書いてくれていますのでお読み下さい。
VB6について書いてますが、説明されている内容はVBAでも同じです。

と、書いたものの本当の原因はやはり本当のソースを見ないとわかりません。

【63013】Re:Excel VBA実行時エラー91について
お礼  ゆっぴぃ♪ E-MAIL  - 09/9/30(水) 22:41 -

引用なし
パスワード
   ▼まるちか さま:

Excelの自動記録機能を使ってコードを作り、それをAccessに貼り付けて
変数を直すだけで使えるものだと思っていました・・・。
おっしゃるとおり、同様の記述はそこらじゅうに散らばっています。


Accessのサイトでそれらしいサンプルを見つけたのでこれから研究してみようと思います。
根本的にはオートメーションを理解することが必要ということですので
ゆっくり腰を落ち着けてやっていこうと思います。


それにしても・・・
>SelectなどExcelVBAでも推奨されない記述
が自動記録で生成されるとなると、かなり詳しくわかっていないと
満足できる結果は得られそうにないですね。


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

【63015】Re:Excel VBA実行時エラー91について
お礼  ゆっぴぃ♪ E-MAIL  - 09/9/30(水) 22:54 -

引用なし
パスワード
   ▼neptune さま:


>これは正常に終了せずExcelがそのBookを掴んでいるせいです。
>プロセスも残っていると思われます。(確認はしてないですが。)
>対策としては、errorステートメントを使用して、正常に終了処理
>をする事で回避できます。

やはり正常な終わり方をしていなかったんですね!
メッセージの内容からある程度想像はつきましたが、具体的に
指摘していただいてとても助かります。


>XPならタスクマネージャのプロセスタブで確認できます。
>
>インスタンスが正常に破棄されていればタスクマネージャには表示されません。
>詳しくは
>「VBレスキュー」
>ht tp://hanatyan.sakura.ne.jp/
>の左側のフレームの「VB6.0関係」→「カテゴリ別一覧」→「カテゴリ別一覧」
>の中の
>VBからExcel及びWordを操作する時の注意事項
>Excel のタスクを正常に終了できない現象
>に書いてくれていますのでお読み下さい。

見てみました。おっしゃるとおりいつまでも動いていたようです!
この機能・・・知りませんでした。マイノートにメモしておこうと思います。


とりあえず頂いた情報をもとにもう少し勉強してみようと思います。少なくともAccessVBAだけでは連携は不可能だとわかったので・・・・。


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

3305 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free