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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ちょっと先の未来クイズ第2問
9月9日(月)に発表される「第3回子どもマネー川柳」に入賞する川柳を考えてこちらに投稿してください。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
クエリの進行状況を知りたい。
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
IF文に時間(何時から何時ま...
-
シグナル 6(SIGABRT)とは?
-
マクロで、次のコードへ行く前...
-
vbaのエラー対応(実行時エラー...
-
VBAの進捗状況をリアルタイ...
-
擬似言語にて
-
エクセルVBAでロックをかけたい
-
【C#/Java?】try-catchでcatch...
-
n88 Basic に関して(ループ)
-
エクセル VBAで複数セル選択時...
-
エクセル画面のちらつきなくす...
-
private subモジュールを他のモ...
-
途中で処理を中断させたい (ア...
-
Linux(CentOS)にでcronとシェル...
-
タイマーの使い方
-
Excel VBA セルの名前があるか...
-
シェルスクリプトでファイル内...
-
Word VBA。各マクロの間に待ち...
-
ExcelのVBAで、選択したファイ...
-
ListViewから選択中の文字列を取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
IF文に時間(何時から何時ま...
-
private subモジュールを他のモ...
-
vbaのエラー対応(実行時エラー...
-
シグナル 6(SIGABRT)とは?
-
マクロで、次のコードへ行く前...
-
どう増強すべきか
-
Excel VBA セルの名前があるか...
-
特定の名前のオートシェイプの...
-
どうやってもFor文を抜けてしま...
-
特定のファイルを他のプロセス...
-
ExcelのVBAで、選択したファイ...
-
VB6にてネットワーク上にある共...
-
VBA 複数の行を高速で削除する...
-
Word VBA。各マクロの間に待ち...
-
フォルダのアクセス権確認について
-
エクセル VBAで複数セル選択時...
-
VBA For Each 〜 複数条件について
-
【C#】Page_Loadさせない方法に...
-
StatusStripの表示が更新されな...
おすすめ情報