• ベストアンサー

OLE又はDDEを使うVISUAL BESICモジュールを実行している時は…と表示されます

以前、下記の質問をさせていただいた者です。 教えていただいた方法を実行中に、別の問題が発生したため 新規に質問スレを立てさせていただきました。 バッチ処理をすると(Accessの)ldbが残ってしまいます ⇒ http://okwave.jp/qa5148407.html ------------------------------------------------------------------- OLE又はDDEを使うVISUAL BESICモジュールを実行している時は モジュールの実行を中断する必要があります ------------------------------------------------------------------- というエラーメッセージが表示されてしまいます。 (1)AccessのMDBファイルを直接叩く  → AoutExecで起動~作成~終了まで動作し、問題なく終了しました。 (2)元ネタのコピー~AccessのMDB起動までを含むBatファイルを叩く  → 「OLE又はDDEを使うVISUAL BESICモジュールを実行している時は     モジュールの実行を中断する必要があります」    と表示され途中で止まりました。 (2)の症状の場合 ・新規にMDBを作成しデーブル等をインポートし直す ・最適化する などの方法があるようですが…。 (1)ではエラーメッセージが表示されることもなく 終了できているので原因が不明です。 モジュールで途中停止することがなくなれば 先に質問させていただいた「ldbが残ってしまう」問題も 解決できそうな気がします。 ゜。.o。─* 補足 *─。o.゜。─**─゜。.o。─**─。o.゜。 ●前提 Accessバージョン: MS Access 2003 サーバのOS: Windows Sever 2003 R2 MDBファイルについて  サイズ: 2,772KB  最適化: 閉じるときに最適化(ツール→オプションで設定済) ----- ●前回の質問と変更した点 1.バッチファイル内の処理順番 <変更前> (1)別サーバからAccessで使うデータをコピーする (2)Accessを起動し、ファイル読込→CSV出力 という一連の処理をする (3)出力されたCSVファイルをバックアップフォルダにコピー&リネームする (4)バックアップフォルダの中身を最新2週間分残して削除する   ↓ <変更後> (3)前日に出力されたCSVファイルをバックアップフォルダにコピー&リネームする (4)バックアップフォルダの中身を最新2週間分残して削除する (1)別サーバからAccessで使うデータをコピーする (2)Accessを起動し、ファイル読込→CSV出力 という一連の処理をする としました。 Accessの処理が終わらないうちに次のバッチ処理が始まるからでは? という指摘を受けたからです。 2.ファイル形式の変更 Accessのファイル形式を「2000」→「2002-2003」に変更しいました。 実際に動かしているサーバにインストールされているのが、Access2003だからです。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.3

バッチファイルのことは全くわからないのですが・・・(汗) > OLE又はDDEを使うVISUAL BESICモジュールを実行している時は > モジュールの実行を中断する必要があります 実行するマクロが「AutoExec」ということですので、 そのファイルを実行すると、「自動的に」実行されます。 (これを停止させる場合は、Shiftキーを押しながら  起動する必要があるという、Access上、特殊なマクロ) これを頭に入れた上で、以下のコマンドを見ますと、 > "C:\Program Files\Microsoft Office\Office11\MSACCESS.EXE" "D:\test\test.mdb" /x AutoExec 1)「test.mdb」を起動させることで、AutoExecマクロが起動し、 2)その最中に、コマンドラインスイッチの指定により、  再度AutoExecマクロが起動する という流れになっているのではないかと思われます。 ですので、コマンドラインスイッチ「/x AutoExec」を削除して みることをお勧めします。 (「"C:\Program Files\Microsoft Office\Office11\MSACCESS.EXE" "D:\test\test.mdb"」  にする、と)

rurineko
質問者

お礼

> 1)「test.mdb」を起動させることで、AutoExecマクロが起動し、 > 2)その最中に、コマンドラインスイッチの指定により、 >  再度AutoExecマクロが起動する すっかり見落としてました。 ご指摘いただいたとおり、「/x AutoExec」を削除したところ 通常起動→終了→ldbファイル残らず という結果にたどり着くことができました。 ありがとうございます!! Batファイルも奥が深いなぁ…としみじみ勉強になりました。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 Batプログラムの難しさは、その先が、特殊な環境になることが多いからです。 しかし、どうもBatから解決しなくてはならないような雰囲気ですね。 daily.batの    rem --Access起動-----    call d:\test\access.bat     goto :EOF さらに「access.bat」の中身は…  └ @echo off    "C:\Program Files\Microsoft Office\Office11\MSACCESS.EXE" "D:\test\test.mdb" /x AutoExec '------------------------------------------- この部分 >   call d:\test\access.bat    ↓ "C:\Program Files\Microsoft Office\Office11\MSACCESS.EXE" "D:\test\test.mdb" /x AutoExec と、daily.batから直接実行するようにしたら、どうなりますでしょうか? >(3)access.batのみをタスク登録してタスク実行 →起動→エラー停止 この場合、Task 子(bat)--->孫(bat)--->ひ孫(Access)で実行されているわけですね。 一段階減らしたら、どうなのかなって思います。それと、タスクの使用者の確認が必要だと書いてある掲示板もあるようです。権限はAdministrator でないといけないようですが。 私自身は、タスクの自動実行は、Wsh で、CreateObject でオートメーション・オブジェクトをつくり、そこから実行します。VBAで行えるよなことはだいたいできるのがメリットです。ただ、VBAよりは難しいです。

rurineko
質問者

お礼

No3の方のお礼にも書かせていただきましたが AoutExecの二重起動が原因だったようです。 ただ、ご指摘のとおり、batファイルとはいえ階層が深くなるのは あまり良いことではないかも知れないので (部署内での統一した作り方ルールで、階層化が深いのですが…) できるだけ見直していきたいと思います。 WshはBatよりも色々なことができそうですね。 勉強していきたいと思います。 ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 ざっと読んでみましたが、異常終了していることでしょうか? >(2)元ネタのコピー~AccessのMDB起動までを含むBatファイルを叩く > → 「OLE又はDDEを使うVISUAL BESICモジュールを実行している時は >    モジュールの実行を中断する必要があります」 >   と表示され途中で止まりました。 素朴な疑問なのですが、Bat ということは。Windows の場合は、Cmd.exe が介在しているわけで、Cmd.exe が起動した環境そのものから動作しますが、そこにOLE が入り込む余地があるのかなって思います。 まず、その辺りから固めていく必要があります。 Bat のコードはどうなっているのでしょうか。以下を、Bat で組んでいるのでしょうか? >(3)前日に出力されたCSVファイルをバックアップフォルダにコピー&リネームする >(4)バックアップフォルダの中身を最新2週間分残して削除する >(1)別サーバからAccessで使うデータをコピーする >(2)Accessを起動し、ファイル読込→CSV出力 という一連の処理をする Batでそこまで組めるなら、今となっては「すごい!」とは思うのですが、これ自体は、Access を起動してから、行ってしまえばよいのではないでしょうか。あえて、そこまでするなら、Windows に組み込まれた、Wsh というものもあります。私は、Bat(Shell)プログラムは、ほとんど忘れてしまいました。

rurineko
質問者

お礼

>…Access を起動してから、行ってしまえばよい… Access自体あまり得意でないので… VBAでゴリゴリ書くのは避けたかったのです。 また、職場の伝統(?)というかDOSコマンドに詳しい方は多く 色々な作業がbatファイルで組まれている状態なのです。 それ自体どうなの?とは思いますが… “いざ引継”という状況で全部をオジサマ方に説明しきれません。 このため、皆様の方式に合わせてbat処理なんです。

rurineko
質問者

補足

<タスク処理しているbatファイル> daily.batをタスク登録しており、中身は…  └ @echo off    rem --コピー&リネーム-----    call d:\test\a.bat    rem --不要なバックアップファイル削除-----    call d:\test\b.bat    rem --元データのコピー-----    call d:\test\c.bat    rem --Access起動-----    call d:\test\access.bat    goto :EOF さらに「access.bat」の中身は…  └ @echo off    "C:\Program Files\Microsoft Office\Office11\MSACCESS.EXE" "D:\test\test.mdb" /x AutoExec となっています。 <切り分け作業1> (1)Access.mdbを直接ダブルクリック→ 正常起動&終了 (2)access.batを直接ダブルクリック→ 正常起動&終了 (3)access.batのみをタスク登録してタスク実行 →起動→エラー停止 <さらなる切り分け作業2> 呼び出しているAoutExecの中身を… (a)終了コマンドのみ →正常終了 (b)CSVインポート用マクロ+終了 →正常終了 (c)CSVインポート用マクロ+処理用マクロ(ア)+終了 →「OLE又はDDEを使うVISU…」となる (d)CSVインポート用マクロ+処理用マクロ((ア)以外のマクロすべて)+終了 →正常終了 ----- どうやら、エラー停止している原因は、処理用マクロ(ア)のようです。 処理用マクロ(ア)は、元CSVファイルのデータをDjoin関数で集計しCSV出力する内容です。 Access.mdbを直接ダブルクリックしても Access起動用のbatファイルを直接ダブルクリックしても正常に起動&終了します。 タスク処理にした時のみ不具合が発生する理由が分かりません。 毎日(月~金/5:00)に実行するように登録してるだけなのに…。

関連するQ&A