- ベストアンサー
アクセスフォームのタイマー機能でエラーが発生しています
- Win7 Ultimate アクセス2013でタイマー機能を使ってデータをアップデートしていますが、マクロをタイマーで動かすとエラーやデータの消失が発生しています。
- Win Vista Ultimate アクセス2003SP3でも同様のエラーが発生しましたが、2003の方がエラーの頻度が少ないです。
- 簡単な操作ではエラーが発生せず、アクセスのフォームのタイマー機能に問題がある可能性があります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.2です。 レスが遅くなってすみません(汗) > マクロではなくVBAで試していますが、2日間はエラーは出ておりません。 とのことから思い至ったのですが、マクロの「クエリを開く」や VBAのDoCmd.RunSQLが「非同期」だといわれているのは、 もしかしたら「一連のマクロ/コードの実行中」の話ではなく、 「あるマクロ/コードの実行中に、タイマーなど、全く関連の ないイベントをきっかけに、別のマクロ/コードが実行された 場合」の話、なのかもしれません。 つまり、タイマー時イベントによる処理の実行中に、タイマー 間隔の設定の時間が経過した場合、VBAでCurrentDbの Executeメソッドであれば、前のタイマー時イベントの処理が 終わるまで待機されるのに対し、マクロの『クエリを開く』 アクションやDoCmd.RunSQLでは即座に実行されるという ことではないか、ということです。 今回検証はしていませんが、こういうことであれば、今まで 使用してきた経験と照らし合わせても違和感はありません。 例) タイマー間隔が1分、タイマー時イベントの処理に要する 時間が1.5分の場合: 0 30秒 60秒 90秒 120秒 |---|---|---|---| (a) (b) (c) (a)=最初のタイマー時イベントの発生タイミング (b)=次のタイマー時イベントの発生タイミング →マクロやDoCmd.RunSQLは、「(b)」で2回目の処理を実行 (=非同期処理) CurrentDb.Executeでは、「(a)」のイベントで実行された 処理が終了する「(c)」まで待ってから、2回目の処理を実行 (=同期処理) > アクセスのTimer機能で問題はございませんか? こちらでは、主にデータベースの使用状況(使用端末と 使用時間を確認し、自動バックアップの要否を判定)で 使用していますが、データベースの使用中に端末を 休止状態にしたりといったことをしない限り、タイマー 関連でのエラーは発生していません。 (タイマー時イベントの処理は一瞬で終わる内容で、 タイマー間隔は10分なので、minoriyukiさんの ケースとは状況が違いますが) なお、「ある特定条件で発生することを把握している、 (無視して後続処理を継続しても問題ない)エラー」が 発生している場合は、VBA上でエラー処理を組み込む という対応方法もありますので、併せて参考まで。 http://officetanaka.net/excel/vba/tips/tips104.htm 上記サイトの最下方にある、『エラーの種類を自動判定する』 の辺りが実用的かと思います。 ※「On Error Resume Next」を冒頭に記述して、 すべてのエラーを無視する方法を紹介しているサイト などもありますが、自分の予想外のエラーも含めて 無視してしまうと、実際は問題があるのに隠蔽されて しまい非常に危険です。 上記サイトのように、エラー番号で場合分けをしたり するなどして、『想定していないエラー』については MsgBoxで表示するか、無人処理にする場合は エラーログとしてファイルを出力させる、といった対応を とることを強くお勧めします。 (VBAで長時間の無人稼動をさせるのは、どちらにせよ お勧めできませんが(汗))
その他の回答 (2)
- DexMachina
- ベストアンサー率73% (1287/1744)
推測というよりは憶測ですので、違いましたらご容赦のほど・・・(汗) タイマー時イベント内での処理の実行中に、タイマー時イベントが 再度発生している、ということはないでしょうか。 私自身が時折これを失念して失敗していたりするのですが(汗)、 タイマー時イベントによる処理の冒頭では『タイマー間隔』を「0」に 設定した上で、反復処理が必要な場合は改めてそこに必要な 値を設定、とすれば、上記の現象(=タイマー時イベント実行中の タイマー時イベントの再実行)は発生しなくなります。 フォームの『タイマー間隔』は、マクロでは『値の代入』アクションで 設定できます。 以下は、「フォーム1」フォームの「タイマー間隔」に1分(60000ミリ 秒)を設定する場合の例です。 参考URL: http://mukkumuku.blogspot.jp/2013/01/access-2010-2013-Macro-builder-2-.html アクション: 値の代入 アイテム: [Forms]![フォーム1].[TimerInterval] 式: 60000 このアクションを、 ・タイマー時イベントの冒頭(「式」には「0」を指定) ・タイマー時イベントの末尾(「式」には元の設定値を指定) の2箇所に組み込めばOkです。 また、hatena1989さんのアドバイスに従ってマクロではなくVBAで 対応する場合は、以下の式を使用します: (私自身がAccess2000まででマクロを使用して組んでいた時の 感覚としては、「クエリを開く」アクションが非同期処理だという 実感はなかったのですが・・・(汗): MSの公式資料は未確認です) Me.TimerInterval = 60000
補足
DexMachina様どうもありがとうございます。 タイマーの間隔は59500で設定してあります。1分以内に終わってしまうイベントですと確かに再実行してしまいますね。したがってどのタイマーにも59500を設定してあります。マクロの内容は削除クエリと追加クエリの連続です。計8個のデーブルを最新情報にしています。約2分の作業です。マクロではなくVBAで試していますが、2日間はエラーは出ておりません。エラーが出ても次のタイマーのイベントをやってくれれば良いのですが、そこで止まってしまっているのでやるべき事をやらないので困っております。 手動でマクロを動かすのは2~300回は試しましたが一度たりともエラーは出ません。 朝一に誰かがボタンをクリックしてデータをアップデートするやる様に設定しましたが、やるはずの人が休んだり、忘れたりで話になりません。したがって色んな作業は全てタイマーにてやっております。DexMachina様はアクセスのTimer機能で問題はございませんか? どうもありがとうございます
- hatena1989
- ベストアンサー率87% (378/433)
これが原因かどうかは分かりませんが、マクロのクエリ実行は非同期なので、削除クエリ、追加クエリを連続して実行すると、前の削除クエリが終了する前に、追加クエリが実行される場合があります。 そうすると、エラーになったり、正しい結果にならない場合があります。 実行クエリを連続して実行する場合は、VBAの Excuteメソッドで実行するほうが安全です。Excuteメソッドは同期実行(前のコマンドが終了してから次のコマンドが実行される)になります。 Dim db As DAO.DataBase Set db = CurrentDB DB.Execute "削除クエリ名" DB.Execute "追加クエリ名"
補足
hatena1989様どうもありがとうございます。 マクロのクエリ実行が非同期とは知りませんでした。 しかし手動のマクロ実行では問題が発生せず、タイマー時のみ発生するのが理解出来ません。 もう一つ、アクセスからクエリーをエクセルでエクスポートするのをタイマーでやっておりますが、これもエラーが出る時があります。マップドライブに出すためマップドライブにa.txtがあることを確認後出すのですが、エラーがでます。タイマーでエラーが出ると次の動きをしてくれませんので、本当に困ってしまいます。 マクロでなくVBAで書いて確認してみます。 どうもありがとうございました。
お礼
DexMachina様、どうもありがとうございます。 まさにここ、”マクロの「クエリを開く」や VBAのDoCmd.RunSQLが「非同期」だといわれているのは、 もしかしたら「一連のマクロ/コードの実行中」の話ではなく、 「あるマクロ/コードの実行中に、タイマーなど、全く関連の ないイベントをきっかけに、別のマクロ/コードが実行された 場合」の話、なのかもしれません。” のような気がします。 エラーでデバグをしてもマクロの部分が黄色くハイライトされているだけです。またマクロを手動で実行すれば一切エラーは出ません。 かなりの事をタイマーでやらせているのですがマクロをやめてVBAでやらせるようにします。確かに長時間無人稼働は良くないのですが、やむおえずやっております。On Error Resume Nextの件もありがとうございます。メッセージボックスで対応しようと思います。 ありがとうございました。