プロが教えるわが家の防犯対策術!

Accessで進行状況インジケーターの表示だけ止めたい
VBAで、Syscmdなどの命令を使って、左下のインジケーター部に
進行状況を表示していますが、マクロ動作により、次のクエリが
動いているときには「クエリを実行しています■■」のような
表示になってしまいます。
Syscmdコマンドを使用した直後に、インジケータ部の表示だけ
ロックして、次のメッセージを表示させたい時点でリフレッシュ
するようなことは可能でしょうか。
Application.Echo falseは試してみましたが、ウィンドゥ内の
表示がロックするだけで、インジケーターはうまくロックしない
ようでした。(ステップ実行で確認。)
対処方法をご存知の方、ご教示よろしくお願いいたします。

A 回答 (1件)

【要旨】


データの更新を、「DoCmd.OpenQuery」から「CurrentDb.Execute」に変更
すれば、進行状況を知らせるメーターの表示を回避できます。

※当該クエリを、更新クエリや追加クエリ等の「アクションクエリ」と想像。


【詳細】
恐らく、『アクションクエリの実行中も、「SysCmd acSysCmdSetStatus」で
設定した内容を、表示させておきたい』ということだと思いますが、
こちらで確認した限り、クエリ(DoCmd.OpenQuery)を使用した状況下での
回避策は見つけられませんでした(汗)

ただ、クエリと同様の処理は、DAOのExecuteメソッドでも行うことができ、
こちらであればステータスバーでのメーター表示はされないことから、
冒頭で示したような変更をすれば、ご希望の動作になるかと思います。

なお、SQL文に差し替えるとなると、
  a)SQL文は触ったことがない
  b)既存のコードの修正が面倒
と二の足を踏まれるかもしれませんが、「DoCmd.OpenQuery」を以下の
関数に差し替え(VBEの画面で、Ctrl+Hキーの同時押しによる置換)れば、
  a)SQL文の直接編集ではなく、クエリのデザインビューで編集可能
  b)置換ダイアログでの一括置換
で対処できます。

<手順1>
標準モジュールに以下のコードを貼付し、適当な名前で保存:

Public Function ProxyExecute(QName As String) As Boolean
On Error GoTo エラー処理

  '「ツール(T)→参照(R)」で、「Microsoft DAO ~」への参照設定が必要
  Dim Rsl As Boolean, Qdf As DAO.QueryDef, strSQL As String

  '指定したクエリを変数に格納
  Set Qdf = CurrentDb.QueryDefs(QName)
  'クエリのSQL文を取得
  strSQL = Qdf.SQL
  'SQLを直接実行
  CurrentDb.Execute strSQL
  'エラーが発生しなかったことを記録
  Rsl = True

終了処理:
  '本関数の戻り値として、実行/中止の結果を返す
  ProxyExecute = Rsl
  '念のため明示的にメモリを解放
  Set Qdf = Nothing
  '本関数を終了(後続の「エラー処理」の実行を回避)
  Exit Function

エラー処理:
  Select Case Err.Number
    Case 3265    '存在しないクエリ名を指定した場合
      MsgBox "以下のクエリが見つかりません:" & vbCrLf & vbCrLf & QName
    Case Else    '上記以外のエラー発生時はその情報を表示
      MsgBox Err.Number & ":" & Err.Description
  End Select
  'エラーが発生したことを記録
  Rsl = False
  Resume 終了処理

End Function


<手順2>
当該モジュールを開き、Ctrl+Hキーの同時押しで『置換』ダイアログを
表示させ、以下の条件で置換を実行:

 検索する文字列(F): DoCmd.OpenQuery
 置換後の文字列(W): ProxyExecute
 対象:  カレント プロシージャ(P)

但し、エラートラップの設定(「ツール(T)→オプション(O)」で開く画面の
『全般』タブで変更可能)によっては、
 ・OpenQuery: その場で処理を中止
 ・上記関数: 関数の呼出元の後続処理を継続
という違いが発生してしまいます(汗)

エラー発生時に処理を中止したい場合は、手動で(汗)以下のように書き
換えて下さい:

<現在>
 DoCmd.OpenQuery "クエリ名"

<置換後>
 ProxyExecute "クエリ名"

<手動修正後>
 If ProxyExecute("クエリ名") = False Then Exit Sub


・・・以上です。
長文、失礼致しました(汗)
    • good
    • 1
この回答へのお礼

丁寧な回答ありがとうございます。このような方法で回避できる
という記載(検証)をしていただいたのは、他でも余り見かけず、
質問に対する、原因と対策が明確に解決し、すっきりしました。

DoCmd.OpenQueryの後ろに、“acViewNomal.acEdit”がついていたので
消去(もともと必要かわかりませんが)する必要があったのと、
CurrentDb.Executeの処理対象がテーブル作成クエリで、作成対象
クエリが既存の場合に、エラーが出るようです。(何かパラメータ
等で上書きの指定をするようでしょうか。)後はご回答いただいた
もので期待した動作を確認しました。
参考のVBA部分を組み込むと、エラー処理の場合を無難?にスルー
してしまうので、もう一度システムのコードを見ながら組み込みを
検討してみます。
ネットの記載を見ると、CurrentDb.Executeは同期処理なので、
理屈上動作速度がacViewNomal.acEdit(非同期)より遅くなるはず
だが、実際は大して変わらない、とありました。特段利用上気にする
必要もなさそうですね。

会社では書き込みが出来ない環境なので、回答が遅くなり失礼いたしました。
今後のご活躍を期待しております。

お礼日時:2010/06/29 06:59

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

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