Accessプログレスバーを使用して画面固まり問題を解決する方法

このQ&Aのポイント
  • Access 2007 VBAでファイル出力処理が長い場合、プログレスバーを設置することで画面固まり問題を解決する方法について紹介します。
  • 10,000件単位のファイル出力では、Accessが応答しなくなり、プログレスバーも途中で停止してしまいますが、実際には処理が進行しており、ファイルは正常に出力されます。
  • Access画面が固まらずにリアルタイムでプログレスバーを進行させる方法を教えていただければ幸いです。
回答を見る
  • ベストアンサー

Access プログレスバー 画面固まる

Access 2007 VBA でファイル出力処理が長いため、以下を参考にしてプログレスバーを設置しました。 http://www.moug.net/tech/acvba/0060023.htm 1,000件程度だと進行状況がちゃんと表示されるのですが、10,000件単位になるとAccess自体が応答せず、プログレスバーも途中で止まったまま、だけど処理は裏で動いているようでファイル出力自体は時間はかかりますがちゃんと出力されます。 DBアクセスを含んだファイル出力処理なので、多少時間がかかっているのかと思います。 また、私の技術の低さから処理自体に時間がかかってしまっていることもあると思いますが、私の技術では処理自体を変えて早くするのは限界です。 Access画面が固まらず、リアルタイムでプログレスバーを進行させる手段等ございましたらご教授いただけるとありがたいです。

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

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

プログレスバーは使ったことがないのですが・・・(汗) (中間状況の表示が必要な場合は、それぞれの処理段階を示す意味も込めて、  チェックボックスの「Off→Null→On」の表示切替で自作しているもので・・・) > Access画面が固まらず、リアルタイムでプログレスバーを進行させる手段 ループ処理中の画面再描画の定番操作、DoEvents関数の組み込みという ことになるかと思います。 http://office.microsoft.com/ja-jp/access/HA012288271041.aspx 但し、あまり高頻度に行うとスタックエラーを起こしますので、複数のループが ある場合は、ある程度上位に入れるとか、カウントがある数の整数倍になった ときだけ実行する、といった工夫をしてやる必要があります。 ◆提示サイトのコードにDoEventsを組み込んだ例: Private Sub コマンド1_Click()   Dim i As Integer   Dim PauseTime As Double   Me.Progress1.Max = 10   Me.Progress1.Min = 0   For i = Me.Progress1.Min To Me.Progress1.Max     '1回のループ毎にOSに処理を返す場合     DoEvents     '「i」が5の倍数(=5で割った余りが0)のときに実行させる場合     'If (i Mod 5)=0 Then DoEvents       Me.Progress1.Value = i     PauseTime = Timer + 1     Do While Timer < PauseTime '※1     Loop   Next End Sub

1192296jp
質問者

お礼

ご回答ありがとうございます。 基本的な話だとは思いますが、 初心者の私に対して丁寧にご説明いただき、 本当にありがとうございます。 また、サンプルコードまで記載していただき、大変助かりました。 >(中間状況の表示が必要な場合は、それぞれの処理段階を示す意味も込めて、 >チェックボックスの「Off→Null→On」の表示切替で自作しているもので・・・) できれば、こちらもご紹介いただけると幸いです。 本当にありがとうございました。

その他の回答 (1)

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

No.1です。 > できれば、こちらもご紹介いただけると幸いです。 ・・・すみません、もしかしたら、いらないことを言ったかも(汗) こちらでやっているのは、「必要時に、都度作成」なので、 「考え方」自体はともかく「プログラム」そのものは使いまわし できません(汗) (使い回せるようにできなくはないと思いますが、自分としては  余り使用頻度が高くないので、「汎用ツール(?)として纏める  苦労」より、「都度作成の労力」の方が小さい、と) とはいえ、せっかくですので、雰囲気だけご紹介してみます。 ◎フォームのプロパティシートでの設定  ※主に、ダイアログっぽい表示にするため。 『書式』タブ  スクロールバー=なし  レコードセレクタ=いいえ  移動ボタン=いいえ  区切り線=いいえ  サイズ自動修正=はい  自動中央寄せ=はい  境界線スタイル=ダイアログ  コントロールボックス=いいえ 『データ』タブ  更新の許可=いいえ  ※チェックボックスの『使用可能』『編集ロック』の設定を    個別に行うのが面倒な場合。 『イベント』タブ  開く時=[イベント プロシージャ]  タイマ時=[イベントプロシージャ]  タイマ間隔=0  ※タイマ間隔(TimerInterval)は、『開く時』イベントで切替 『その他』タブ  ポップアップ=はい  作業ウィンドウ固定=はい ◎各チェックボックスのプロパティシート 『データ』タブ  既定値=False  使用可能=いいえ  編集ロック=はい  ※マウスクリック等でフォーカスを受け付けない一方で、    グレー表示にしないための設定。編集できなければ    フォーカスは受け付けてもよしとするなら、フォームの   『更新の許可』を「いいえ」にすればOk。 ◎フォームの『開く時』イベントのコード Private Sub Form_Open(Cancel As Integer)   'フォームのコントロールが未表示のままでの処理開始を回避   Me.TimerInterval = 100 End Sub ◎フォームの『タイマ時』イベントのコード Private Sub Form_Timer() 'エラー発生時は「エラー処理:」の行に飛ばす On Error Goto エラー処理   '『タイマ時』イベントが繰り返されるのを回避   Me.TimerInterval = 0   'クエリ実行時などのメッセージ表示を回避   DoCmd.SetWarnings False   '別のデータベースの「MT1」テーブルをインポート   チェック1 = Null   'チェックボックスの表示を切替(クラシック表示ならグレー)   DoEvents   DoCmd.TransferDatabase acImport, "Microsoft Access", "c:\Source.mdb", acTable, "MT1", "NewMT1"   チェック1 = True  '処理終了をチェックボックスに反映   'このデータベースの「MT1」を別のデータベースにエクスポート   チェック2 = Null   DoEvents   DoCmd.TransferDatabase acImport, "Microsoft Access", "c:\OldTables.mdb", acTable, "MT1", "MT1" & Date$   チェック2 = True   '古いデータを削除   チェック3 = Null   DoEvents   DoCmd.OpenQuery "MQ1_1_初期化"   '削除クエリ(MT1の全レコードを削除)   チェック3 = True   '「NewMT1」から必要なデータを「MT1」テーブルに抽出   チェック4 = Null   DoEvents   DoCmd.OpenQuery "MQ1_2_更新"   '更新クエリ(NewMT1から必要列のみ追加)   チェック4 = True   MsgBox "全ての工程を終了しました。", , "確認" 終了処理:   'メッセージ表示を復活   DoCmd.SetWarnings True   Exit Sub エラー処理:   'エラーメッセージを表示して、処理を中止   MsgBox Err.Number & ":" & Err.Description, , "処理を中止しました。"   Resume 終了処理 End Sub

1192296jp
質問者

お礼

詳細な内容をご教授くださり、ありがとうございます。 後ほど試させていただきます。 質問に関してはこれで締め切らせていただきます。 本当にありがとうございました。

関連するQ&A

  • Access2000 CopyFromRecordsetでの出力状態をプログレスバーに反映させたい。

    Access2000のレコードセットをCopyFromRecordsetメソッドを使用してデータ出力させています。 しかし、最近データ量が多くなったため、進行状況をプログレスバーで表示したいと思っています。 画面下のステータスバーに表示されるのではと思ったのですが、 「そんなとこまでうちの社員は見ないだろう」と却下されてしまいました。 通常ならDo~Loop処理などの際にプログレスバーのValue値を変えればいいとおもうのですが、 このような「Accessにおまかせ」状態の時はどのようにすればいいのでしょうか。 となたかご教授ください。よろしくお願いします。

  • プログレスバー

    アクセス+VBAです。 処理に時間がかかる場合に横のバーの進み具合で表示するのをプログレスバーっていうんでしょうか? それを、アクセスで利用できませんか? 方法を教えて下さい。

  • 重たい処理で画面がかたまります

    VB.NET2003で開発をしております。 4万件ぐらいのデータをCSV出力させる処理を作っています。 どうしても時間がかかってしまうのでプログレスバーを用いて進捗がわかるようにしたいと思いました。 ところがCSV出力をしているときは画面がかたまってしまうようで、プログレスバーの進捗が反映されません(時々反映されることはある)。 このような時はどうするのがよいのでしょうか?

  • アクセスVBAでデータベースからよみこみた

    いつもお世話になっております。 すごく初歩的な質問で恥ずかしいのですが・・・ いつもアクセスvbaで外部のCSVファイルを読み込んで処理をしていました。今回、DBから直接テーブルを読み込んで1件づつ処理をしたいとおもったのですが、どうしてもやりかたがわかりませんでした・・・。 ネットで調べればわかりそうなのですが、初歩的過ぎて記載がないのでしょうか・・・M(_ _)M どなたか教えていただけるとたすかります よろしくお願いします

  • ODBC経由のDBアクセスによる処理結果の相違

    DB2へアクセスして、結果をファイルへ出力処理するモジュールがあるのですが、AS400のバージョンアップなどした後に、ファイル出力が異常に遅くなってしまいました。 原因が分からないので、何かご存知の方はお教えください。 環境 DB2へODBC経由でデータアクセス クライアント側のOS:Windows2000 モジュール SQLFetchとSQLGetDataを使用してレコードを1行ずつファイルに出力 状況 現行4万件程度ならば20秒前後で終了していた処理が、新環境では2時間でも終了しません。 しかし、レスポンスが飛躍的に向上した処理もあるので、原因が特定できません。

  • プログレスバーで処理進捗を反映させたいが・・・泣

    backgroundWorkerで重たい処理をさせたいのですが、どのようにプログレスバーを噛ませてあげたらいいのか悩んでいます。 重たい処理はこんな感じです。 (ソースが今のPCに無いので大雑把な内容でお許し下さい) このページを参考にしています。 http://www.atmarkit.co.jp/fdotnet/dotnettips/436bgworker/bgworker.h... 処理自体は仕様通りに出来ています。 どうしても大きいファイルなど操作するのでどうしても時間を要します。 そのため、ファイルコピーなどの各処理が終わるたびにプログレスバーに反映させたいのですが、参考にしているページだとforを用いたループでやっているのでどうやったらいいのか悩んでいます。 (単に想像力が足りないのかもしれませんが・・・) どのようにするといいか教えていただけませんでしょうか? //処理内容 ファイル読み込み ファイルコピー テキスト開く 1000行書きこむ(繰り返しでかけないので1行1行書き込み) テキスト閉じる ファイル読み込み ファイルコピー ファイルの内容を検査して間違いを修正 ファイルをリネーム ファイルを指定したサーバのパスにバラ撒く ・ ・ ・ ・ ・ こんな類似処理を何千回もする

  • MFCを使わないで、プログレスバーを表示したい。

    複数のファイルで構成されているフォルダがあって、そのフォルダのコピーを作成する処理を行うとします。 その処理の進行状況を、ダイアログボックス上に貼り付けたプログレスバーコントロールで表示したい と思っているのですが、MFCを使用しない例はネットなどで検索しても見つけることができません。 例えば、フォルダの容量の「現在○○%コピーしました。」とか、それが無理なら全体の何ファイル目を処理 しているかなどを、プログレスバーで表示することは可能ですか。 数値的な表示が無理なら、現在処理中かどうかを表示するだけでも構いません。 ご教授の程、よろしくお願いいたします。 環境:VC++6.0, WIN32 API

  • 【Access2007について】

    宜しくお願いします。 現在、Access2007のVBAを使って約22万件のレコードから検索条件を指定し、特定のレコードを抽出しようとしているのですが、抽出するテーブルのレコードが約22万件存在するため、抽出処理が途中で止まってしまい、最終的に(応答なし)の状態になってしまいます。 そのテーブルには検索条件で使うフィールドをインデックスとしているため、若干早いとは思うのですが・・・ この問題を解決する方法はあるのでしょうか・・? どなたかご教授を宜しくお願い致します。。。

  • DBアクセス時間が早くなる理由

    約2万件のデータ読込み、帳票を作成してダウンロードする処理があるのですが、 最初のリクエストでの処理時間が33秒もかかります。 しかし、続けて同じ処理をさせていると、3回目には8秒にまで短縮しました。 繰り返しているとDBアクセス処理が早くなるのはどうしてでしょうか? 使っている言語は Java DBソフトは PostgreSQL です。 よろしくご教授ください。

  • vbsでファイルやフォルダのコピー中にプログレスバーを表示させるにはど

    vbsでファイルやフォルダのコピー中にプログレスバーを表示させるにはどうすればいいでしょうか。 無言でコピーするコードはいろいろと紹介されているのですが、何も表示されないので進行状況がわかるようにしたいのです。 残り時間表示やパーセント表示などどのような表示方法でもいいのでおおよその進行状況がわかる方法をご存知でしたら教えて頂けないでしょうか。 宜しくお願い致します。 <例> コピー元ファイル:"C:\test\*.*" コピー先フォルダ:"C:\backup\"

専門家に質問してみよう