
Win7 Ultimate アクセス2013でタイマー機能を使って夜中にデータをアップデートしています。
リンクテーブルAのデータをを全て消して、その後リンクテーブルBからデータを全てリンクテーブルAに追加する事をしています。データは200列で約10,000件あります。削除クエリーと追加クエリーをマクロに記してあります。
これをマクロで手動でやると何度やっても問題なく動きますが、フォームを開いておいてタイマーでマクロを動かすと、できる時があったり、マクロのエラーが出ていたり、ひどい時はリンクテーブルAのデータをを消して、その時点でエラーになっている時もあります。
アクセス2010、2013はトラブルが多々ありますので、Win Vista Ultimate アクセス2003SP3でも試してみましたが結果は同じでした。しかし2013に比べエラーの出る頻度ははるかに2003の方が少ないと思います。
2003も同じくマクロを手動でやればエラーは全く出ません。
このアクセスのフォームのタイマーは、使い物にならない物なのでしょうか。
簡単なもの(小さいテキストファイルをフォルダーAからフォルダーBに動かす)はタイマーでやっても一度もエラーは出ません。
ご意見をお聞かせ下さい。
No.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で長時間の無人稼動をさせるのは、どちらにせよ
お勧めできませんが(汗))
DexMachina様、どうもありがとうございます。
まさにここ、”マクロの「クエリを開く」や
VBAのDoCmd.RunSQLが「非同期」だといわれているのは、
もしかしたら「一連のマクロ/コードの実行中」の話ではなく、
「あるマクロ/コードの実行中に、タイマーなど、全く関連の
ないイベントをきっかけに、別のマクロ/コードが実行された
場合」の話、なのかもしれません。”
のような気がします。
エラーでデバグをしてもマクロの部分が黄色くハイライトされているだけです。またマクロを手動で実行すれば一切エラーは出ません。
かなりの事をタイマーでやらせているのですがマクロをやめてVBAでやらせるようにします。確かに長時間無人稼働は良くないのですが、やむおえずやっております。On Error Resume Nextの件もありがとうございます。メッセージボックスで対応しようと思います。
ありがとうございました。
No.2
- 回答日時:
推測というよりは憶測ですので、違いましたらご容赦のほど・・・(汗)
タイマー時イベント内での処理の実行中に、タイマー時イベントが
再度発生している、ということはないでしょうか。
私自身が時折これを失念して失敗していたりするのですが(汗)、
タイマー時イベントによる処理の冒頭では『タイマー間隔』を「0」に
設定した上で、反復処理が必要な場合は改めてそこに必要な
値を設定、とすれば、上記の現象(=タイマー時イベント実行中の
タイマー時イベントの再実行)は発生しなくなります。
フォームの『タイマー間隔』は、マクロでは『値の代入』アクションで
設定できます。
以下は、「フォーム1」フォームの「タイマー間隔」に1分(60000ミリ
秒)を設定する場合の例です。
参考URL:
http://mukkumuku.blogspot.jp/2013/01/access-2010 …
アクション: 値の代入
アイテム: [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機能で問題はございませんか?
どうもありがとうございます
No.1
- 回答日時:
これが原因かどうかは分かりませんが、マクロのクエリ実行は非同期なので、削除クエリ、追加クエリを連続して実行すると、前の削除クエリが終了する前に、追加クエリが実行される場合があります。
そうすると、エラーになったり、正しい結果にならない場合があります。
実行クエリを連続して実行する場合は、VBAの Excuteメソッドで実行するほうが安全です。Excuteメソッドは同期実行(前のコマンドが終了してから次のコマンドが実行される)になります。
Dim db As DAO.DataBase
Set db = CurrentDB
DB.Execute "削除クエリ名"
DB.Execute "追加クエリ名"
この回答への補足
hatena1989様どうもありがとうございます。
マクロのクエリ実行が非同期とは知りませんでした。
しかし手動のマクロ実行では問題が発生せず、タイマー時のみ発生するのが理解出来ません。
もう一つ、アクセスからクエリーをエクセルでエクスポートするのをタイマーでやっておりますが、これもエラーが出る時があります。マップドライブに出すためマップドライブにa.txtがあることを確認後出すのですが、エラーがでます。タイマーでエラーが出ると次の動きをしてくれませんので、本当に困ってしまいます。
マクロでなくVBAで書いて確認してみます。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PowerPointで時計表示
-
JSPの処理の途中で、JavaScript...
-
VBA ステータスバー DoEvents
-
VBAについて
-
if(1){...}とはどういうことで...
-
リクエスト結果が一瞬しか表示...
-
resizeToメソッドが動作しません
-
非同期処理の終了監視2
-
既存のwebサイトで、ローカルの...
-
JSでファイル数取得
-
VBAによる第3、4水準文字の判定...
-
VB2008で数字の桁数を調べる...
-
”吴”とはなんですか?
-
javascriptからサーバサイドの...
-
エクセルVBA/ Formatで文字列が...
-
「終了していない文字列型の定...
-
JavaScriptのVersionは、ブラウ...
-
EXCEL 文字列操作
-
エクスプローラー風のメニュー
-
オブジェクトでサポートされて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSPの処理の途中で、JavaScript...
-
以下のコードを実行しても、オ...
-
PowerPointで時計表示
-
if(1){...}とはどういうことで...
-
innerHTMLなどの反映タイミング
-
デザイン時のVisible=Falseは実...
-
C#でボタン名を変更しても動く
-
1つのVBAコードをすべてのコア...
-
VBA ステータスバー DoEvents
-
〔Excel:VBA〕マクロの実行が異...
-
ラベルの色がかわってくれない
-
リクエスト結果が一瞬しか表示...
-
jQuery ui Datepicker 明日以降...
-
eval()の危険性の具体例を教え...
-
既存のwebサイトで、ローカルの...
-
JavaScriptでショートカットキ...
-
VBA SORT Applyでエラー
-
アクセスのフォームでタイマー...
-
初心者です。gulpでコンパイル...
-
VB.netでタイマーがスタートし...
おすすめ情報