プログレスバーもどき
時間のかかる処理
①、ダウンロードファイルでは時間のかかる処理として献立作成の場面を想定しました。
↓
②、月間献立表の各曜日の食事カテゴリー欄のセルに、献立名にレシピ料理名を登録する
↓
③、献立レシピ料理名のアドレスからレシピの食材情報を取り出す。
↓
④、取り出した食材データを各曜日のシートに書き出す。
①~④までの工程を各曜日シート(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 です。これでプログレスバーが変化する様子が表現できます。
「献立Base」は下のカードからもご覧いただけます。もよろしければもお試しになってください。
コメント