【簡単エクセル/Excel VBA マクロ】プログレスバー|エクセルオブジェクトの操作 #005

アフィリエイト広告を利用しています。
Information
運営者・ポテ

いつもありがとうございます

皆さん、こんにちは。ご覧いただきありがとうございます。

“日々の業務にちょうどいい自動化を”──

業務改善アプリケーションの作成を行っている「ソフトデザイン工房」 です。

ノンプログラマー向け「Excel VBA マクロ解説シリーズ」へようこそ。

この記事では、プログレスバーを操作する方法を解説します。

プログレスバーは、処理の進捗状況を視覚的に示すツールです。

たとえば次のようなものです。

プログレスバーの例

特に時間がかかる処理において、進行度を表示することでユーザーに現在の作業状況を知らせ、不安やストレスを軽減する役割を果たします。

エクセルマクロに限らず、進捗状況を表示することはアプリケーションソフトウェアの基本的な機能の一つです。

皆さんが普段使用しているアプリケーションでも、多くの場合、進行状況を表示してくれるものが多いと思いのではないでしょうか。

エクセルマクロでも同様に進捗状況を表示することが可能です。

注)まずは、プログレスバーを使う必要がないように、マクロを高速で動作させる工夫をすることが原則です。プログレスバーは、どうしても処理に時間がかかる場合にのみ実装しましょう。

この記事が、あなたのVBAマクロの価値をさらに高める一助となれば幸いです。

VBAを活用して、自分自身や身近なコミュニティに合ったアプリケーションを作成し、仕事量は半分に、成果は2倍に──そんな未来を目指すあなたを応援しています。

VBAにおけるExcelオブジェクト操作の全体像

VBAにおける「エクセルオブジェクトの操作」の全体像は、以下の記事で解説しています。

この記事では「Excelオブジェクトの操作」の一部である「プログレスバーを操作する方法」を解説します。

VBAでプログレスバーを操作する方法

ユーザーフォームの作成

プログレスバーは、ユーザーフォームに含まれるコントロールの一部です。

Information

コントロール
ボタンやテキストなどのユーザーフォーム上に配置される部品のことです。

プログレスバーを使用するには、まずユーザーフォームを作成する必要がありますので、まず最初にユーザーフォームの作成手順を解説します。

ユーザーフォームの挿入

まず、VBE(Visual Basic Editor)の「挿入」メニューから「ユーザーフォーム」を選択し、ユーザーフォームを挿入します。

そうすると、このようなまっさらのユーザーフォームが挿入されます。

まっさらなユーザーフォーム
コントロールの配置

次に、必要なコントロールを配置します。

ここでは、進捗状況をテキストで表示する「ラベル」と、視覚的に表示する「プログレスバー」を配置します。

コントロールは、ツールボックスからドラッグ&ドロップで配置できます。

運営者・ポテ

ここ↓がポイント!

プログレスバーはデフォルトではツールボックスに表示されていないため追加する必要があります

まず、ツールボックスの右クリックメニューから「その他のコントロール」をクリックします。

右クリックメニュー

次に、「Microsoft ProgressBar Control」コントロールにチェックを入れて、OKをクリックします。これで、ツールボックスへプログレスバーが表示されるようになります。

プログレスバーの追加

もし、「そもそもツールボックスが表示されてないよ!」という方がいれば、以下の表示メニューから表示させることができるので、慌てないでくださいね!

ツールボックスの表示
プログレスバーのタイトルの設定

プログレスバーを表示するときは、ユーザーが待機しているときです。

そのため、ユーザーフォームのタイトルを以下のように設定すると、気が利いています。

なお、ラベルとプログレスバーのオブジェクト名は、下図のようになっていますので覚えておきましょう。これらの名前は、コードを実装する際に必要になります。

以上でユーザーフォームの準備は完了です。

運営者・ポテ

ありがとうございます!

コードの実装

次にコードを実装していきます。

【コード】

コードは次の通りです。

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に「このオブジェクトの新しいインスタンスを作成せよ」と指示するキーワードです。


Information

キーワード
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 ステートメントは、指定したユーザーフォームを閉じ、同時にメモリから完全に解放するための命令です。

この処理がない場合、フォームは画面に表示されたまま残り続けてしまいます。そのため、処理の最後に明示的に Unload を実行し、フォームを破棄する必要があります。

この処理がないと、ユーザーフォームが画面に表示されたままになります。そのため、明示的にフォームを閉じるコマンドを実装する必要があります。

フォームを閉じるだけでなく、占有していたメモリ領域も解放されるため、メモリ管理の観点でも重要です。

運営者・ポテ

以上で解説は終了です。ご覧いただきありがとうございました。

VBAスキルアップの参考情報

近年は、ChatGPTをはじめとするAIの登場によって、学習のスタイルが大きく変わりました。

分からないことがあれば、AIに尋ねれば答えがすぐに見つかる時代です。

とはいえ、AIを使いこなすには、自分自身の基本的な知識や理解力が欠かせません。

全体像をつかむためには、やはり書籍などで体系的に学んでおくことが今でも有効です。

そのうえでAIを活用すれば、自分の理解度に合わせた的確な解説や、応用のヒントを得ることができます。

「学んで基礎を築く → AIで補い発展させる」──このサイクルを重ねることで、VBAスキルは着実に高まっていくでしょう。

VBAのスキルアップ

VBAを学び始めるなら

入門書は、どれを選んでも大きな差はないように感じます。

どれを選ぶかに悩むことに時間をかけるよりも、まずは手頃な一冊を手に取って進めてみるのがおすすめです。

もし迷ったときには、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。

基礎を超えて力をつけたいなら

私は上級者を目指していましたので、入門書にとどまらず、このような内容の濃い一冊を選んで学んでいました。

今は誰でもAIを活用できる時代になりましたが、上級者を目指す方にとっては、AIをより上手に活用するという意味でも、こうした本は今なお価値があります。

このレベルの本を一冊持っておくことに、損はないでしょう。


資格で能力を証明したいなら

VBAのプログラミング能力を客観的に示したい場合には「VBAエキスパート試験」があります。

特に「スタンダード」の方は上級者向けです。

あなたが社内業務の改善を行う立場であっても、VBAで作成したシステムをお客様に納める立場であっても、この資格は信頼や安心につながるでしょう。

以下の公式テキストが販売されています。



プログラミングの一般教養

「独学プログラマー」というプログラミングの魅力を解説した書籍があります。

これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。

今はAIにコードを尋ねれば、答えが返ってくる時代です。

しかし、この本からは「コード」以上に、プログラミングに向き合う姿勢や考え方を学ぶことができるでしょう。


こちらの記事でも紹介しています。もしよろしければご覧ください。

【初心者歓迎】無料相談受付中 

運営者・ポテ

いつもありがとうございます!

限られた時間をより良く使い、日本の生産性を高めたい──

みんなの実用学を運営するソフトデザイン工房では、業務整理や業務改善アプリケーション作成のご相談を承っております。

お気軽にご相談ください。


こちらの記事でも紹介しております。

【初心者歓迎】無料相談受付中 

運営者・ポテ

いつもありがとうございます!

限られた時間をより良く使い、日本の生産性を高めたい──

みんなの実用学を運営するソフトデザイン工房では、業務整理や業務改善アプリケーション作成のご相談を承っております。

お気軽にご相談ください。


こちらの記事でも紹介しております。

おわりに

運営者・ポテ

ご覧いただきありがとうございました!

本稿では、「エクセルオブジェクトの操作」の中の「ユーザーフォームを操作する方法」を解説しました。

お問い合わせやご要望がございましたら、「お問い合わせ/ご要望」フォームまたはコメント欄よりお知らせください。

この記事が皆様のお役に立てれば幸いです。

なお、当サイトでは様々な情報を発信しております。よろしければトップページもあわせてご覧ください。

この記事を書いた人

運営者・ポテソフトデザイン工房|日々の業務にちょうどいい自動化を
■人生を追求する凡人 ■日本一安全で、気の向くままに自分の時間を過ごせる、こだわりのキャンプ場を作るのが夢 ■ソフトデザイン工房運営(個人事業者) - 業務改善アプリケーションをご提供 ■人生は時間そのもの。ひとりでも多くの人が「より良い人生にするために時間を使って欲しい」と願い、仕事のスキルの向上、余暇の充実、資産形成にチャレンジ。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です