【簡単Excelマクロ・VBA】プログレスバー|エクセルオブジェクトの操作 #005
いつもありがとうございます。
ノンプログラマー向け「Excelマクロ・VBA解説シリーズ」へようこそ。
本稿では、プログレスバーを操作する方法を解説いたします。
プログレスバーは、処理の進捗状況を視覚的に示すツールです。特に時間がかかる処理において、進行度を表示することでユーザーに現在の作業状況を知らせ、不安やストレスを軽減する役割を果たします。
エクセルマクロに限らず、進捗状況を表示することはアプリケーションソフトウェアの基本的な機能の一つです。皆さんが普段使用しているアプリケーションでも、多くの場合、進行状況を表示してくれるものが多いと思います。
エクセルマクロでも同様に進捗状況を表示することが可能です。
注)まずは、プログレスバーを使う必要がないように、マクロを高速で動作させる工夫をすることが原則です。プログレスバーは、どうしても処理に時間がかかる場合にのみ実装しましょう。
ことばの意味
- ノンプログラマー
プログラミングを本職としない人たちのことです。 - マクロ
VBAを使って作成される「機能」のことです。 - VBA
Visusal Basic for Application の略で、プログラミング言語のことです。
関連記事
VBAにおけるExcelオブジェクト操作の全体像
VBAにおける「エクセルオブジェクトの操作」の全体像は、以下の記事で解説しております。
本稿では「Excelオブジェクトの操作」の一部である「プログレスバーを操作する方法」を解説いたします。
VBAでプログレスバーを操作する方法
ユーザーフォームの作成
プログレスバーは、ユーザーフォームに含まれるコントロールの一部です。プログレスバーを使用するには、まずユーザーフォームを作成する必要がありますので、以下に解説していきます。
まず、VBE(Visual Basic Editor)の「挿入」メニューから「ユーザーフォーム」を選択し、ユーザーフォームを挿入します。
このようなまっさらのユーザーフォームが挿入されます。
次に、必要なコントロールを配置します。ここでは、進捗状況をテキストで表示する「ラベル」と、視覚的に示す「プログレスバー」を配置します。コントロールは、ツールボックスからドラッグ&ドロップで配置できます。
プログレスバーを表示するときは、ユーザーが待機しているときです。そのため、ユーザーフォームのタイトルを以下のように設定すると、気が利いています。
ラベルとプログレスバーのオブジェクト名は、以下のようになっていますので覚えておきましょう。これらの名前は、コードを実装する際に必要になります。
以上でユーザーフォームの準備は完了です。
ことばの意味
- コントロール・・・ボタンやテキストなどのユーザーフォーム上に配置される部品のことです。
コードの実装
次にコードを実装していきます。
コードは以下の通りです。
Sub ShowProgressBar()
' ユーザーフォームとカウンター変数の宣言
Dim uf As UserForm1 ' プログレスバーを表示するユーザーフォーム
Dim progress_step As Long ' 現在の進捗ステップを示すカウンター
' ユーザーフォームの新しいインスタンスを作成
Set uf = New UserForm1
' プログレスバーの初期設定
With uf.ProgressBar1
.Min = 0
.max = 10 ' プログレスバーの最大値を10に設定
.Value = 0
End With
' ユーザーフォームを非同期で表示
uf.Show vbModeless
For progress_step = 1 To 10
' 処理のメイン部分(例として1秒待機する処理を実装)
Application.Wait Now + TimeValue("0:00:01")
' プログレスバーの進捗を更新
uf.ProgressBar1.Value = progress_step
uf.Label1.Caption = "処理中... " & Int((progress_step / 10) * 100) & "%"
' 画面を更新
DoEvents
Next progress_step
' 処理が終わったらユーザーフォームを閉じる
Unload uf
End Sub
このコードを実行すると、以下のようなプログレスバーが表示されます。進捗状況が0%から100%まで、10ステップで変化します。
解説していきます。
' ユーザーフォームとカウンター変数の宣言
Dim uf As UserForm1 ' プログレスバーを表示するユーザーフォーム
Dim progress_step As Long ' 現在の進捗ステップを示すカウンター
ここでは、変数の宣言をしています。Dim 変数 AS データ型
の構文で宣言します。これにより各変数は、As以降で指定したデータ型のデータを保持できるようになります。
Dim uf As UserForm1
は、UserForm1
という名前のユーザーフォームのインスタンス(実体)を保持するための変数 uf
を宣言しています。この UserForm1
は、前述の「ユーザーフォームの作成」で作成したユーザーフォームのことです。
Dim progress_step As Long
のLong
は整数値を扱うためのデータ型です。
' ユーザーフォームの新しいインスタンスを作成
Set uf = New UserForm1
ここでは、ユーザーフォーム UserForm1
の新しいインスタンス(実体)を作成し、同時に変数 uf
に格納しています。
New
キーワードは、VBAに「このオブジェクトの新しいインスタンスを作成せよ」と指示するものです。UserForm1
は、既にVBAプロジェクト内でデザインされたユーザーフォームのクラス(設計図)です。New UserForm1
によって、UserForm1
の新しいオブジェクトが作成され、そのインスタンスが返されます。
変数 uf
は、先に Dim uf As UserForm1
で宣言された変数で、この変数に新しく作成された UserForm1
のインスタンス(実体)が割り当てられます。以降のコードでは、この uf
変数を通じて UserForm1
のインスタンス(実体)にアクセスし、フォームを表示したり、フォーム上のコントロールを操作したりできます。
' プログレスバーの初期設定
With uf.ProgressBar1
.Min = 0
.max = 10 ' プログレスバーの最大値を10に設定
.Value = 0
End With
ここでは、プログレスバーの初期設定を行っています。
.Min = 0
と .Max = 10
は、それぞれプログレスバーの最小値と最大値を設定しています。
.Value = 0
は、プログレスバーの現在の値を0に設定します。これにより、プログレスバーは最初の状態(進捗なし)からスタートします。
' ユーザーフォームを非同期で表示
uf.Show vbModeless
ここでは、ユーザーフォームを非同期で表示しています。"非同期"とは、ユーザーフォームを表示している間でも、他の操作(例えばExcelシートの編集など)が同時に行える状態を指します。
uf
は、先に Set uf = New UserForm1
で作成したユーザーフォーム UserForm1
のインスタンスを指しています。
Show
メソッドは、ユーザーフォームを表示するために使用されます。uf.Show
とすることで、指定されたフォーム( UserForm1
)が画面に表示されます。
vbModeless
は、ユーザーフォームを「非同期モード」で表示するオプションです。
For progress_step = 1 To 10
' 処理のメイン部分(例として1秒待機する処理を実装)
Application.Wait Now + TimeValue("0:00:01")
' プログレスバーの進捗を更新
uf.ProgressBar1.Value = progress_step
uf.Label1.Caption = "処理中... " & Int((progress_step / 10) * 100) & "%"
' 画面を更新
DoEvents
Next progress_step
ここでは、プログレスバーの更新を行っています。For Next
ステートメントで10ステップの繰り返し処理を実行し、各ステップでプログレスバーを更新しています。
Application.Wait Now + TimeValue("0:00:01")
は、マクロを1秒間停止する処理です。これは例として実装したものであり、実際にはここに実行したい処理を記述します。
uf.ProgressBar1.Value = progress_step
は、プログレスバー ProgressBar1
の値を変数 progress_step
の値に更新しています。progress_step
の値に応じてプログレスバーが更新され、進捗状況が視覚的に確認できます。For Next
ループが進むごとに、プログレスバーが徐々に増加していきます。
uf.Label1.Caption = "処理中... " & Int((progress_step / 10) * 100) & "%"
は、ラベル Label1
に進捗状況をテキストで表示しています。Int
関数は、数値の小数点以下を切り捨てて整数に変換する関数です。
DoEvents
は、VBAが他のイベント(例えば、ユーザーフォームの更新や他のExcel操作)を処理できるようにする命令です。通常、VBAのプログラムが処理を実行している間、その処理が完了するまで他の操作ができなくなります。特に、長時間かかる処理を行っているとき、ユーザーインターフェース(フォームのボタンやラベルなど)が「フリーズ」してしまい、ユーザーが操作できなくなったり、画面が更新されなくなることがあります。DoEvents
は、VBAのプログラムが長時間の処理を実行している間でも、他の操作や画面更新ができるようにするための命令です。これにより、ユーザーインターフェース(例えば、プログレスバーやラベル)がリアルタイムで更新され、ユーザーに対して処理が進行していることを見せることができます。
' 処理が終わったらユーザーフォームを閉じる
Unload uf
ここでは、ユーザーフォームを閉じる処理を行っています。この処理がないと、ユーザーフォームが画面に表示されたままになります。そのため、明示的にフォームを閉じるコマンドを実装する必要があります。
Unload
ステートメントは、指定したユーザーフォームを閉じて、メモリから完全に解放するために使用されます。これは、フォームを閉じるだけでなく、そのフォームが占有していたメモリ領域を解放し、メモリを効率的に使用するためにも重要です。
以上で解説は終了です。
おわりに
ご覧いただきありがとうございました。
本稿では、「エクセルオブジェクトの操作」の中の「ユーザーフォームを操作する方法」を解説いたしました。
お問い合わせやご要望等ございましたら、「お問い合わせ/ご要望」またはコメントにて、ご連絡いただければ幸いでございます。
皆様の人生がより一層素晴らしいものになるよう、少しでもお役に立てれば幸いでございます。
筆者の記事関連経験
- VBA使用経験約20年
実務に使用するマクロを多数作成してきました。 - Python 3 エンジニア認定基礎試験
経済産業省が定めたガイドライン「ITスキル標準(ITSS)」に掲載されている民間資格です。
VBAプログラミングスキルアップのための参考情報
ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。
VBAプログラミングのスキルアップ
学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。
入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるよりは、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。
甲乙つけがたい場合、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
\チェックしてみよう/
\チェックしてみよう/
\チェックしてみよう/
VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
こちらの記事でも紹介しております。もしよろしければご覧ください。