
Access 2007 VBA でファイル出力処理が長いため、以下を参考にしてプログレスバーを設置しました。
http://www.moug.net/tech/acvba/0060023.htm
1,000件程度だと進行状況がちゃんと表示されるのですが、10,000件単位になるとAccess自体が応答せず、プログレスバーも途中で止まったまま、だけど処理は裏で動いているようでファイル出力自体は時間はかかりますがちゃんと出力されます。
DBアクセスを含んだファイル出力処理なので、多少時間がかかっているのかと思います。
また、私の技術の低さから処理自体に時間がかかってしまっていることもあると思いますが、私の技術では処理自体を変えて早くするのは限界です。
Access画面が固まらず、リアルタイムでプログレスバーを進行させる手段等ございましたらご教授いただけるとありがたいです。
No.1ベストアンサー
- 回答日時:
プログレスバーは使ったことがないのですが・・・(汗)
(中間状況の表示が必要な場合は、それぞれの処理段階を示す意味も込めて、
チェックボックスの「Off→Null→On」の表示切替で自作しているもので・・・)
> Access画面が固まらず、リアルタイムでプログレスバーを進行させる手段
ループ処理中の画面再描画の定番操作、DoEvents関数の組み込みという
ことになるかと思います。
http://office.microsoft.com/ja-jp/access/HA01228 …
但し、あまり高頻度に行うとスタックエラーを起こしますので、複数のループが
ある場合は、ある程度上位に入れるとか、カウントがある数の整数倍になった
ときだけ実行する、といった工夫をしてやる必要があります。
◆提示サイトのコードに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
ご回答ありがとうございます。
基本的な話だとは思いますが、
初心者の私に対して丁寧にご説明いただき、
本当にありがとうございます。
また、サンプルコードまで記載していただき、大変助かりました。
>(中間状況の表示が必要な場合は、それぞれの処理段階を示す意味も込めて、
>チェックボックスの「Off→Null→On」の表示切替で自作しているもので・・・)
できれば、こちらもご紹介いただけると幸いです。
本当にありがとうございました。
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

詳細な内容をご教授くださり、ありがとうございます。
後ほど試させていただきます。
質問に関してはこれで締め切らせていただきます。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- 画像編集・動画編集・音楽編集 Native Accessのインストールが先に進みません 2 2022/09/14 13:34
- その他(プログラミング・Web制作) Accessの代わりのノンプログラムデータベース作成 4 2022/10/21 09:26
- その他(プログラミング・Web制作) 監視カメラを水平につないでパノラマの映像を作りたい 1 2022/09/06 15:26
- Visual Basic(VBA) 複数ブックの統合について Excel VBA 1 2022/05/13 09:48
- Excel(エクセル) CSVファイルでVBAを動かす方法 3 2023/04/04 10:22
- Access(アクセス) Access IF文でテーブルに存在しない場合の処理について 2 2022/10/10 18:09
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- 発達障害・ダウン症・自閉症 中学の時にIQ82の境界知能と診断されました。 今の私も、やはり境界知能でしょうか? そしてこれは、 3 2023/02/19 00:37
- 画像編集・動画編集・音楽編集 PowerDirector21 動画出力時のCPU稼働率が急に下がってしまう原因を教えてください 2 2023/03/30 20:54
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
マクロで、次のコードへ行く前...
-
特定のファイルを他のプロセス...
-
vbaのエラー対応(実行時エラー...
-
どう増強すべきか
-
private subモジュールを他のモ...
-
IF文に時間(何時から何時ま...
-
順番に処理させたい
-
シェルスクリプトでファイル内...
-
エクセル VBAで複数セル選択時...
-
入力した値が不正というよりイ...
-
VBA 複数の行を高速で削除する...
-
VBAの進捗状況をリアルタイ...
-
VBA Select Caseについて
-
COBOL OCCURSで指定したデータ...
-
aspx の同時処理数について教え...
-
エクセル画面のちらつきなくす...
-
VB6にてネットワーク上にある共...
-
【C#】Page_Loadさせない方法に...
-
エクセルファイルをフロッピー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
vbaのエラー対応(実行時エラー...
-
private subモジュールを他のモ...
-
マクロで、次のコードへ行く前...
-
シグナル 6(SIGABRT)とは?
-
特定の名前のオートシェイプの...
-
IF文に時間(何時から何時ま...
-
どう増強すべきか
-
特定のファイルを他のプロセス...
-
Word VBA。各マクロの間に待ち...
-
どうやってもFor文を抜けてしま...
-
Excel VBA セルの名前があるか...
-
ExcelのVBAで、選択したファイ...
-
【C#】Page_Loadさせない方法に...
-
StatusStripの表示が更新されな...
-
途中で処理を中断させたい (ア...
-
エクセル VBAで複数セル選択時...
-
Functionで戻り値を複数返す方法
-
VBAでBook読み込み時の非表示方...
-
VBA 複数の行を高速で削除する...
おすすめ情報