小規模老人保健施設の給食業務向けExcelVBA練習帳、給食業務のエクセルでプログレスバーを活用。時間のかかる処理中の進捗状況を可視化する

Uncategorized

プログレスバーもどき

時間のかかる処理

①、ダウンロードファイルでは時間のかかる処理として献立作成の場面を想定しました。

②、月間献立表の各曜日の食事カテゴリー欄のセルに、献立名にレシピ料理名を登録する

③、献立レシピ料理名のアドレスからレシピの食材情報を取り出す。

④、取り出した食材データを各曜日のシートに書き出す。

①~④までの工程を各曜日シート(6曜日)ごとに、更に食事カテゴリー(朝食、昼食、夕食)ごとに繰り返す処理をしますので、膨大な計算が必要です。

つまりこの工程の処理は終了するまでかなりの時間が必要なので、何も準備しなければ画面に何の変化も無く、フリーズしたかの状態になります)

月間献立表イメージ

月間献立表の各曜日の各食事カテゴリーのメニュー名欄に具体的なレシピ名を設定した状態です。

この状態で「週間献立表へ送る」ピンクのボタンをクリックすると、各曜日のシートにレシピ情報を書き出す処理が始まります。

 

各曜日シートイメージ

下図は上図で月間献立表にセットしたレシピ名からのレシピの情報を曜日のシートに出力した状態です。

 

プログレスバーイメージ

 

繰り返し処理でプログレスバーを表示するコード全体

Sub tensouKaisi()
Dim i As Integer
Dim i2 As Integer
Dim r As Integer
Dim r2 As Integer


ReDim furPathFile(15, 6)
'週間献立表のフルパス格納のセルからファイル名を取り出しておきます
'--------------------------------------------
For r = 0 To 15     '朝昼夕のループ
'    tennsou.Label2.Width = tennsou.Label1.Width / 15 * r
'    DoEvents
    For i2 = 0 To 6  '曜日ごとのループ
     ’日付情報とレシピ食材情報を 二次元配列に取り出す処理
        hiduke(i2) = ActiveSheet.Cells(kaisigyou - 1, i2 + 4)
         furPathFile(r, i2) = ActiveSheet.Cells(r + kaisigyou, i2 + 4).Offset(0, 10)
    Next i2
Next r
'この処理はすぐに終わるのでプログレスバーで見せるまでもないが、一応練習のため残しておいた
'--------------------------------------------


'上で取り出したフルパスファイル名のcsvデータを配列に取り出してレシピシートに展開する
’配列変数からデータを取り出して、シートのセルに書き込む処理はなかなか時間かかるのでこちらが見せ場の処理だ
'Call youbinoSheet
Dim x As Double
Dim x2 As Double

'ファイルデータの転送処理の繰り返しの中でプログレスバーに見立てたラベルコントロールの長さを変化させる

For i = 0 To 6  '曜日の繰り返し
    x = tennsou.Label1.Width / 6    '
    tennsou.Label2.Width = x * (i)
    
    Call resipkesu3(siito(i + 1))   'シートの以前のデータを確認なしで消去してから転記する
    
    For r2 = 0 To 15
        x2 = tennsou.Label4.Width / 15
        tennsou.Label5.Width = x2 * (r2)
        DoEvents
        resiName = furPathFile(r2, i)
        Call siitoTenki2(siito(i + 1), resiName, kaisigyou + r2, hiduke(i))
        'レシピに記録された作り方コメントをテキストボックスに読込む
        'ここに指定したsiitoはモジュール7で献立表を送り出すときの転送処理シート名をグローバル宣言している
        'Call youbiKomentoYomi(siito(i + 1))
    Next r2
    tennsou.Label5.Width = 0
    'siitoごとにデータの転送が終わった段階で栄養価数値を取りに行って持ち帰り月間献立表に取り込む
    'Call syuueiyougoukei(siito(i + 1), kaisigyou, i)
Next i
MsgBox "献立データの転送が終わりました"
Unload Me

End Sub

 

具体的処理の仕方(プログレスバーが変化する様子を表現)

32行目外側の繰り返し(上図の上側のlabe1とlabel2)

x = tennsou.Label1.Width / 6・・・ラベル1の長さを曜日シートの数で割った値をxに与える

tennsou.Label2.Width = x * (i)・・・ラベル2の長さをxの値に繰り返す回数(i)を掛けた値にセットする

38行目内側の繰り返し(上図の下側のlabel4とlabel5)

x2 = tennsou.Label4.Width / 15・・・ラベル4の長さを各食事カテゴリーのレシピ欄の行数で割った値をx2に与える

tennsou.Label5.Width = x2 * (r2)・・・ラベル5の長さをx2の値に繰り返す回数(r2)を掛けた値にセットする

For~Nextで繰り返しの処理の中に入るとその中で行われるプログレスバーが変化する状態は画面処理が停止してしまいます。つまりプログレスバーは止まったままで動きません。

そのため、繰り返しの処理中でも画面処理が更新されるように、繰り返すごとにWindowsに処理を渡す必要があります。

その一文が41行目の DoEvents です。これでプログレスバーが変化する様子が表現できます。

以上がlabelコントロールを利用したプログレスバーもどきです。
ダウンロードファイルではこのプログレスが動く様子を表現しただけのものです。
献立の内容や、レシピのデータの内容は仮のデータであることをご理解お願いします
尚このダウンロードファイルは前回ご紹介した「献立Base」の内容を一部変更して作成しています。

「献立Base」は下のカードからもご覧いただけます。もよろしければもお試しになってください。

ダウンロード

本プログラムはエクセル2013で作成しています。他のバージョンでは動作可能かはわかりません。また、最近(2022年以降)のエクセルではマクロを含んだネット経由のダウンロードファイルは動作しないようになっているようです(確認していません。)
下のカードからダウンロードできます

コメント

タイトルとURLをコピーしました