ACCESSで大量のデータを処理する機能を作成すると、かなり完了までに時間がかかってしまいます。
PCからの応答がなくなると、ユーザーとしては止まってしまったのかなと不安になり、再起動などをしてしまうかもしれません。
こうした場合には、処理の進捗をユーザーに表示できると便利です。
今回は、処理の進捗をプログレスバーで表示する機能をご紹介します。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは使いこなすために少しスキルが必要なものの、うまく活用すればExcelよりも業務の効率化が図れます。
この記事ではACCESSで実際に作成したフォームやレポートを、その作成方法と共にご紹介していきます。
完成形:処理の進捗をプログレスバーで表示するフォーム
「大量のデータを更新中、画面が固まって不安になる…」 「あとどれくらいで処理が終わるのか目安が欲しい」
そんな悩みは、VBAでプログレスバー(進捗バー)を実装することで解決できます。まずは、今回作成するツールの完成形をご覧ください。

上記は出勤簿のデータを追加する処理画面です。
画面の中央にプログレスバーが表示されており、ここで処理の進捗が一目で分かるようになっています。
これであれば時間がかかる処理でも、ユーザーが「止まってしまったかな?」と不安を持たずに処理の終了を待つことができます。
では、以降でこの機能の作成方法をご紹介していきます。
フォームへのプログレスバーの追加
まずはフォームにプログレスバーを追加しましょう。
フォームをデザインビューで開きます。

ACCESSのメニューから「フォームデザイン」タブを選択します。
コントロールを追加するアイコンのエリアで下向きの矢印をクリックします。

一番下にActiveXコントロールが表示されますのでクリックします。

ActiveXコントロールの挿入画面が表示されます。
Microsoft ProgressBar Control version X.Xを選択します。

すると、フォーム画面にプログレスバーが追加されます。
位置や幅などを整えておきましょう。

また、デフォルトでは「ProgressBarX」のような名前になっていますので、名前もわかりやすいものに変えておきましょう。今回は「進捗バー」という名前にしました。
後ほど、VBAでこのプログレスバーの名前を使用します。
また、今回の機能では通常時はプログレスバーが表示されず、処理が始まると表示されて完了すると消えるという処理にしています。
そのため、プロパティシートで進捗バーの「可視」を「いいえ」に設定しました。

また、フォームにはデータ追加等のもともとの処理のためのボタンを配置します。
このボタンを押すことでデータ追加処理が開始され、プログレスバーが表示されます。
VBAでのプログレスバー進捗表示処理
処理概要
実際のプログラミングに入る前に、どのような処理でプログレスバーに進捗を表示するのかを説明します。
プログレスバーは以下の流れで使用します。
- プログレスバーの最大値(処理件数の最大値)を設定する
- 処理を1件行うたびにプログレスバーの値に1を足す
最大値を設定し、処理を行うたびに0から1ずつ数値を足していくと、その値に応じてプログレスバーのメモリが増えていきます。
データ追加ボタンクリック時のイベントプロシージャ
では、VBAでのプログレスバー進捗表示処理を作成しましょう。
先ほど作成した「データ追加」ボタンのクリック時イベントでイベントプロシージャを設定します。

設定するイベントプロシージャの内容は以下の通りです。
まずここでは、進捗バーの表示/非表示処理のみを行い、具体的なデータ追加処理は別のプロシージャ「data_tsuika」を呼び出します。
Private Sub データ追加_ボタン_Click()
If MsgBox("出勤簿データを1年分追加します。" & vbCrLf & "よろしいですか?", vbYesNo + vbQuestion, "データ追加") = vbYes Then
'進捗バーを表示
Me!進捗バー.Visible = True
'データ追加処理
Call data_tsuika
'進捗バーを非表示
Me!進捗バー.Visible = False
End If
End Sub
最初にMsgBox関数でデータ追加処理を実行するか確認するメッセージを表示します。
プログレスバーを表示するような処理はかなり時間がかかるため、事前に実行確認メッセージを出すのが良いでしょう。
次に、
'進捗バーを表示
Me!進捗バー.Visible = True
でプログレスバーを表示させます。
Visibleプロパティはフォームやレポートの上のコントロールの表示/非表示を切り替えることができます。
処理前にTrueにし、処理後にFalseにすることで処理中のみプログレスバーを表示できます。
プログレスバーを常に表示しておいてもよいのですが、ユーザーに分かりにくくなるため、今回は処理中のみ表示する形としました。
プログレスバーの進捗表示処理イベントプロシージャ
では次に、実際にデータの処理と、それに合わせたプログレスバーの進捗表示を行うプロシージャ「data_tsuika」の内容です。
今回は、社員マスターテーブルに登録された全社員に対して、現在の年の1/1から12/31まで1年間の出勤簿レコードを出勤簿テーブルに追加する処理を行っています。
Dim cnn1 As ADODB.Connection
Dim rst1 As ADODB.Recordset
Dim rst2 As ADODB.Recordset
Public Sub data_tsuika()
'■■■当該年の日付レコードを社員ごとにを一括で追加する■■■
Dim current_date As Date
'変数にADOオブジェクトを代入
Set cnn1 = CurrentProject.Connection
Set rst1 = New ADODB.Recordset
rst1.CursorLocation = adUseClient
Set rst2 = New ADODB.Recordset
rst2.CursorLocation = adUseClient
'レコードセットを取得
rst1.Open "社員マスター", cnn1, adOpenKeyset, adLockReadOnly
rst2.Open "出勤簿", cnn1, adOpenKeyset, adLockOptimistic
'社員マスターが0件だったら処理終了
If rst1.RecordCount = 0 Then
Exit Sub
End If
'進捗表示プログレスバーの最大値を設定(社員数×365日)
[Forms]![出勤データ追加]![進捗バー].Max = rst1.RecordCount * 365
[Forms]![出勤データ追加]![進捗バー] = 0
'社員マスターを最初のレコードに移動
rst1.MoveFirst
'社員マスターをループ
Do Until rst1.EOF
'現在の年の1/1をスタートに指定
current_date = DateValue(Year(Date) & "/01/01")
'1/1から12/31月までループ
Do Until current_date = DateValue(Year(Date) & "/12/31")
'出勤簿に日付レコードを追加
rst2.AddNew
rst2!日付 = current_date
rst2!社員ID = rst1!社員ID
rst2.Update
'進捗表示プログレスバーを更新
[Forms]![出勤データ追加]![進捗バー] = [Forms]![出勤データ追加]![進捗バー] + 1
current_date = DateAdd("d", 1, current_date)
Loop
rst1.MoveNext
Loop
MsgBox "出勤簿データの作成が完了しました。", vbInformation + vbOKOnly, "出勤簿データ作成完了"
'終了処理
rst1.Close: Set rst1 = Nothing
rst2.Close: Set rst2 = Nothing
cnn1.Close: Set cnn1 = Nothing
End Sub
処理内容を解説します。
今回は、ADOを使って出勤簿テーブルにレコードを追加する処理を作成しています。
レコード追加処理は今回のメインテーマではないので、プログレスバーの進捗表示部分のみ解説します。
ADOについて詳しくは以下の記事をご覧下さい。

まず、処理を始める前にプログレスバーの最大値を設定します。
これによって処理を1件進める際にプログレスバーのメモリがどの程度進むかが決まります。
'進捗表示プログレスバーの最大値を設定(社員数×365日)
[Forms]![出勤データ追加]![進捗バー].Max = rst1.RecordCount * 365
プログレスバーの最大値を設定するには、プログレスバーのMaxプロパティをプログレスバー名.Maxで設定します。
今回の場合は社員数×365日分の処理を行うので、その値を格納しています。
次に、処理を1件行うたびに、プログレスバーの値を1ずつ増やします。
'進捗表示プログレスバーを更新
[Forms]![出勤データ追加]![進捗バー] = [Forms]![出勤データ追加]![進捗バー] + 1
ここでは、ループ処理の中でレコード追加処理を行うたびに進捗バーの値を1ずつ増加させています。
これによって進捗バーが少しずつ増えていきます。
これでプログレスバーで進捗表示する機能が実装できます。
まとめ:処理の進捗をプログレスバーで表示する方法
まとめです。
処理の進捗をプログレスバーで表示するには、フォームのデザインビューでActiveXコントロールの挿入から、Microsoft ProgressBar Control version X.Xを選択します。
VBAの処理では、プログレスバーのMaxプロパティに処理件数の最大値を記録した上で、プログレスバーの値を処理件数に合わせて増やしていきます。
以上、処理の進捗をプログレスバーで表示する機能をご紹介しました。
この記事の内容を実際に試したい方へ
本記事の内容を実際にACCESSを動かしながら確認したいという方向けに、記事で紹介した機能が実装されたサンプルファイルを販売しています。記事内で解説しているテーブル、クエリ、フォーム、レポート、VBAのプロシージャなどをそのまま動く形で実装しました。
学習用としてはもちろん、加工して自社業務に利用することも可能です。
ご興味のある方は以下からご覧ください。

ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に300以上のACCESSデータベースの開発・修正実績のあるはこにわガジェット(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

最後までお読みいただき、ありがとうございました。
