古庄 潤(ふるしょう じゅん)

本業はエンジニア。ICに様々な機械をつなぎ,電流やら電圧を測定する。もちろん,これらの測定器もVBAでコントロールし,取り込んだデータもマクロで処理する。人呼んで,マクロの鬼軍曹!

診断(12)
進ちょく状況を表示する

「ぜっこ~ちょ~!!」
「おや,先生,ご機嫌ですね。さては,煙草屋のミーちゃんと?」
「何を言う。わしは修行の身。婦女子には目もくれず,釣り道一筋じゃ」
「なんだ,デートを断られて釣りに行ったんですね」
「うるさい! 見よ,この見事な黒鯛を。格闘すること10分,壮絶な戦いであった」
「はいはい,じゃあ機嫌良く働いてくださいね」
「それがじゃ,昨日の釣りで疲労困ぱい。今日は,休診にしよう」
「働かざる者,釣りに行くべかざる。仕事をしないのなら,釣りは禁止です」
「そんなぁー」
「働かないと,新しい竿を買えませんよ」
「それもそうだ。ではさくさく仕事をしよう」
「単純な人」
「何か言ったか?」
「いえ,次の方ど~ぞ~」

今月の相談
「売上表から,年月日と項目を指定して必要な情報を抽出するマクロを作りました。マクロ自体はパーペキ(完ぺき)です。が,フォームの見た目がいまいちなんです(図1)。視覚に訴えるアイテムはありませんか?」

図1●現在のユーザーフォーム
図1●現在のユーザーフォーム

「う~ん,テクニックのことならどうにかできる。しかし,デザインとなると…」
「苦手なんですね? では,不肖このゲールが!」
「なんじゃ?」
「先生,プログレスバーを使ったらどうでしょうか?」
「おぉ,その手があったか」
「はい。このマクロの実行には,少し時間がかかります。マクロが動いていることも確認できるし,ちょっとエレガントじゃありません?」
「エレガントかどうかはわからんが,なかなかいいアイデアじゃ。では,今回は任せた」
「先生,働かないと釣りは禁止ですよ」
「うへっ!」
「はい。びしばし働いて,ばりばり釣ろう」
「よっしゃ~! うりゃ! 出来た!」
「はやっ! では,解説を」
「プログレスバーを作るのは簡単じゃ。ツールボックスの[ProgressBar]ボタンをクリックし,フォーム上の適当な位置にドラッグする。作った後にハンドルをドラッグしてサイズを調整すれば完成じゃ(図2)」

図2●プログレスバーを追加したフォーム
図2●プログレスバーを追加したフォーム

「先生,バーの表示は,どうやって操作するんですか?」
「プログレスバーのバーの長さは,ProgressBarオブジェクトのValueプロパティの値で決まる(リスト1)。よって,ループの中でValueプロパティの値を変更することで,バーの長さが,処理した量に応じて延びていくんじゃ」

Private Sub CommandButton1_Click()

~略~

  Me.ProgressBar1.Value = 0  '<-----------------------(1)

~略~

  For i = LBound(myFile_Name) To UBound(myFile_Name)  '<--------(2)

~略~

    Me.ProgressBar1.Value = (i / UBound(myFile_Name)) * 100  '<-(3)
  Next i

~略~

End Sub
リスト1●プログレスバーの表示を操作する部分だけの抜粋

 まずは,マクロを実行する前にプログレスバーのバーを消します(1)。(2)は繰り返し処理のループです。このループの中で,プログレスバーの長さを変更して,処理が終ったパーセンテージを表します。バーの長さは,Valueプロパティの値が0の時ゼロ,100の時FULLになるので,(3)で終わった処理のパーセンテージを計算して代入します。

図3●マクロ実行中の様子。プログレスバーがリアルタイムに伸びていく
図3●マクロ実行中の様子。プログレスバーがリアルタイムに伸びていく
[画像のクリックで拡大表示]

「先生,ユーザーフォームが表示されたとき,プログレスバーのバーはありませんよ。(1)のステートメントは無駄じゃありませんか?」
「うむ,確かに最初に表示されたときは,バーはナッシングじゃ。1回こっきり使い捨てのユーザーフォームなら問題はない。しかし,このユーザーフォームを繰り返し使うとしたら?」
「あ! 二回目の実行の時,バーがFULLになった状態から始まります」
「じゃろ? だから(1)のステートメントが必要なんじゃ」
「なるほど。では,(3)の計算式を解説してください」
「これはパーセンテージを計算する式じゃ。解説するほどのものではないと思うが?」
「UBound(myFile_Name)って,何ですか?」
「ふむ,なるほど。後で全コードを開示するが,このマクロは,集計の対象となるファイルの名前をGetOpenFilenameメソッドでMultiSelectオプションをTrueに設定して取得し,それをVariant型の変数(myFile_Name)に代入する(図4)。従ってUBound(myFile_Name)=取得したファイル名の数=処理するファイルの数となるんじゃ。これがパーセンテージの母数となる」

図4●GetOpenFilenameメソッドでMultiSelectオプションをTrueにすると複数のファイルを選択できる
図4●GetOpenFilenameメソッドでMultiSelectオプションをTrueにすると複数のファイルを選択できる
[画像のクリックで拡大表示]