プロが教える店舗&オフィスのセキュリティ対策術

以前、下記の質問をさせていただいた者です。
教えていただいた方法を実行中に、別の問題が発生したため
新規に質問スレを立てさせていただきました。

バッチ処理をすると(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だからです。

A 回答 (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"」
 にする、と)
    • good
    • 0
この回答へのお礼

> 1)「test.mdb」を起動させることで、AutoExecマクロが起動し、
> 2)その最中に、コマンドラインスイッチの指定により、
>  再度AutoExecマクロが起動する

すっかり見落としてました。
ご指摘いただいたとおり、「/x AutoExec」を削除したところ
通常起動→終了→ldbファイル残らず
という結果にたどり着くことができました。

ありがとうございます!!
Batファイルも奥が深いなぁ…としみじみ勉強になりました。

お礼日時:2009/07/31 13:58

こんにちは。



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よりは難しいです。
    • good
    • 0
この回答へのお礼

No3の方のお礼にも書かせていただきましたが
AoutExecの二重起動が原因だったようです。

ただ、ご指摘のとおり、batファイルとはいえ階層が深くなるのは
あまり良いことではないかも知れないので
(部署内での統一した作り方ルールで、階層化が深いのですが…)
できるだけ見直していきたいと思います。

WshはBatよりも色々なことができそうですね。
勉強していきたいと思います。

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

お礼日時:2009/07/31 14:04

こんにちは。



ざっと読んでみましたが、異常終了していることでしょうか?

>(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)プログラムは、ほとんど忘れてしまいました。

この回答への補足

<タスク処理している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)に実行するように登録してるだけなのに…。

補足日時:2009/07/30 14:24
    • good
    • 0
この回答へのお礼

>…Access を起動してから、行ってしまえばよい…

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

お礼日時:2009/07/30 14:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A