【VBA】ステータスバーに進捗状況を表示!VBA初心者でも簡単に使えるStatusBarの使い方
VBAマクロを実行すると画面が固まったように見えて不安になる。。。
こんな経験をしたことはありませんか?
こんな問題は、
VBAのApplication.StatusBarプロパティの導入で解決
することができます。
Application.StatusBarプロパティを使えば、処理の進捗状況をリアルタイムで表示できるんです。
この記事では、VBAのステータスバー機能を使って、ユーザーに安心感を与える進捗表示の方法を初心者向けに解説。
基本的な文字表示から、パーセント表示やプログレスバー風の見た目まで、コピペで使えるサンプルコードを紹介します。
この記事を読み終える頃には、あなたのVBAスキルは確実にワンランクアップしているはずです。
VBAのStatusBar(ステータスバー)とは?基本概念を理解しよう
VBAのStatusBarは、Excelで長時間の処理を実行する際に、ユーザーに現在の作業状況を知らせる重要な機能です。
プログラムが動いているのか止まっているのか分からない状況を解消することができます、
処理に時間のかかる複雑なVBAマクロを作成する際には必須のテクニックなので、自由に扱えるように使い方をマスターしておきましょう。
Excelのステータスバーの場所と役割
Excelのステータスバーは、画面の一番下に表示されている情報バーのことです。
通常は「準備完了」や選択したセルの合計値などが表示されています。
この部分にVBAから独自のメッセージを表示することで、マクロの実行状況をリアルタイムでユーザーに伝えることができます。
データ処理やファイル操作など、時間のかかる作業中に「現在○○を処理中です」といったメッセージを表示すれば、ユーザーは安心して待つことができるでしょう。
VBAでステータスバーを操作するメリット
VBAでステータスバーを活用する最大のメリットは、マクロ実行中の進捗状況をユーザーに知らせ安心感を与えることです。
長
時間の処理中でもユーザーは現在の状況を把握でき、フリーズしたと勘違いしてプログラムを強制終了させる心配がありません。
さらに、処理の進行度を表示することで、残り時間の目安も分かりやすくなります。
企業で使用するマクロやツールでは、この機能があるかないかで使いやすさが大きく変わるため、マクロをよく使用する現場では必須の技術として重宝されています。
Application.StatusBarプロパティの基本構文
VBAでステータスバーを操作するには、Application.StatusBarプロパティを使用します。
基本構文がこちら
Application.StatusBar = "表示したいメッセージ"
この一行のコードで、Excelの画面下部に任意のテキストを表示できます。
Application.StatusBar = "データを処理中です..."
このコードを実行すると、Excelのステータスバーに「データを処理中です…」というメッセージが表示されます。
Application.StatusBar = Falseと設定すれば、表示をリセットして元の状態に戻すことも可能です。
VBA初心者でも3分で覚える!ステータスバーの基本的な使い方
ステータスバーの操作は、VBA初心者でも簡単にマスターできる機能です。
基本的な使い方を覚えれば、すぐに実践で活用できるようになります。
文字列の表示からリセット方法まで、段階的に学習していけば短時間で習得可能です。
まずはこの基本操作から始めて、徐々に高度なテクニックを身につけていきしょう。
文字列メッセージを表示する方法
ステータスバーに文字列を表示する方法は非常に簡単で、Application.StatusBarプロパティに表示したい文字列を代入するだけです。
変数を使って動的にメッセージを変更することも可能で、処理の内容に応じて適切な情報を表示できます。
Sub StatusBarSample()
Application.StatusBar = "処理を開始します"
Application.Wait Now + TimeValue("00:00:02")
Application.StatusBar = "データを読み込み中..."
Application.Wait Now + TimeValue("00:00:02")
Application.StatusBar = "処理が完了しました"
Application.Wait Now + TimeValue("00:00:01")
Application.StatusBar = False
End Sub
このコードは、まず「処理を開始します」というメッセージを表示し、2秒待機後に「データを読み込み中…」に変更します。
さらに2秒後に「処理が完了しました」を表示し、最後にステータスバーをリセットしています。
実行結果がこちら
Application.Waitを使用することで、実際の処理時間をシミュレートしています。
ステータスバーの表示をリセット(初期化)する方法
ステータスバーのメッセージをリセットして元の状態に戻すには、Application.StatusBarにFalseを設定します。
これにより、Excelの標準的なステータス表示に戻ります。
処理完了後は必ずリセットを行うことが、VBA開発におけるマナーなので忘れないよう注意しましょう。
Sub ResetStatusBar()
Application.StatusBar = "カスタムメッセージを表示中"
MsgBox "メッセージを確認してください"
' ステータスバーをリセット
Application.StatusBar = False
MsgBox "ステータスバーがリセットされました"
End Sub
このコードでは、最初にカスタムメッセージを表示し、ユーザーに確認してもらった後、Application.StatusBar = Falseでリセットしています。
実行結果がこちら
リセット処理を忘れると、マクロ終了後もメッセージが残り続けるため、必ず実装するようにしましょう。
初心者が陥りがちなエラーとその対処法
VBA初心者がステータスバーを使用する際によく遭遇するエラーは、
メッセージが表示されない、または処理完了後にメッセージが残り続ける
といった問題です。
これらの問題は、適切な構文の理解と、リセット処理の実装で解決できます。
また、長い文字列を表示しようとすると、画面幅の制限で途切れてしまうことがあるため、簡潔で分かりやすいメッセージを心がけることが重要です。
Sub ErrorHandlingSample()
On Error GoTo ErrorHandler
Application.StatusBar = "エラーハンドリング付きの処理を実行中"
' 意図的にエラーを発生させる
Dim result As Double
result = 1 / 0
Application.StatusBar = "処理完了"
Exit Sub
ErrorHandler:
Application.StatusBar = "エラーが発生しました"
Application.Wait Now + TimeValue("00:00:02")
Application.StatusBar = False
MsgBox "エラー: " & Err.Description
End Sub
このコードでは、On Error GoToを使用してエラーハンドリングを実装しています。
エラーが発生した場合でも、ErrorHandlerラベルでステータスバーの適切なリセット処理を行っているため、メッセージが残り続ける問題を回避できます。
実行結果がこちら
還暦時「エラー無視の注意点」では、Resume Nextを安全に使う実践テクニックが紹介されています。
[blogcard url="https://mamemametochan.com/excel-125/"]
実践!VBAで進捗状況を見える化するサンプルコード集
実際の業務でステータスバーを活用する場合、単純なメッセージ表示よりも進捗状況を数値やグラフィカルに表示する方が効果的です。
処理回数のカウント表示やパーセンテージでの進捗率表示など、様々な方法でユーザーに分かりやすい情報を提供できます。
これらのテクニックをマスターすることで、実務向けの効率化マクロの作成ができるようになります。
処理回数をカウント表示するコード例
ループ処理で大量のデータを扱う際は、現在何件目を処理しているかをカウント表示することで、進捗状況を明確に伝えることができます。
ユーザーは残り件数を把握できるため、処理完了までの時間を予測しやすくなります。
Sub ProcessCountDisplay()
Dim totalCount As Long
Dim currentCount As Long
totalCount = 1000
For currentCount = 1 To totalCount
' 実際の処理をここに記述(例:セルの値を変更)
Cells(currentCount, 1).Value = "データ" & currentCount
' 10件ごとにステータスバーを更新
If currentCount Mod 10 = 0 Then
Application.StatusBar = currentCount & " / " & totalCount & " 件処理完了"
DoEvents
End If
Next currentCount
Application.StatusBar = "全 " & totalCount & " 件の処理が完了しました"
Application.Wait Now + TimeValue("00:00:02")
Application.StatusBar = False
End Sub
このコードでは、1000件のデータ処理を行いながら、10件ごとにステータスバーの表示を更新しています。
currentCount変数で現在の処理件数を管理し、「○○ / 1000 件処理完了」という形式で進捗を表示。
DoEventsを使って、画面の更新を強制的に実行しリアルタイムでの表示更新をする処理も組み込まれています。
実行中の様子がこちら
パーセント表示で進捗率を分かりやすく表示
進捗状況をパーセンテージで表示することで、直感的に残り時間を把握できるようになります。
特に処理時間が予測しにくい複雑な作業では、パーセント表示が非常に効果的です。
Sub PercentageDisplay()
Dim totalItems As Long
Dim currentItem As Long
Dim percentage As Integer
totalItems = 500
For currentItem = 1 To totalItems
' 実際の処理(例:ファイル操作)
Application.Wait Now + TimeValue("00:00:01")
' パーセンテージを計算
percentage = Int((currentItem / totalItems) * 100)
' 5%刻みでステータスバーを更新
If currentItem Mod 25 = 0 Then
Application.StatusBar = "進捗状況: " & percentage & "% 完了 (" & currentItem & "/" & totalItems & ")"
DoEvents
End If
Next currentItem
Application.StatusBar = "処理完了: 100% (全" & totalItems & "件)"
Application.Wait Now + TimeValue("00:00:02")
Application.StatusBar = False
End Sub
このコードでは、Int((currentItem / totalItems) * 100)でパーセンテージを計算し、「進捗状況: ○○% 完了」という形式で表示しています。
25件ごと(5%刻み)に更新することで、画面の更新頻度を調整し、処理速度とのバランスを取っています。
実行結果がこちら
プログレスバー風の棒グラフ表示テクニック
文字だけでなく、記号やバーを使ってグラフィカルな進捗表示を作成することも可能です。
視覚的に分かりやすい表示は、ユーザーの満足度を大幅に向上させます。
Sub ProgressBarDisplay()
Dim totalSteps As Long
Dim currentStep As Long
Dim progressBar As String
Dim barLength As Integer
Dim filledLength As Integer
totalSteps = 100
barLength = 20
For currentStep = 1 To totalSteps
' 実際の処理
Application.Wait Now + TimeValue("00:00:01")
' プログレスバーの表示を更新
filledLength = Int((currentStep / totalSteps) * barLength)
progressBar = "[" & String(filledLength, "■") & String(barLength - filledLength, "□") & "] "
progressBar = progressBar & Int((currentStep / totalSteps) * 100) & "%"
Application.StatusBar = progressBar
DoEvents
Next currentStep
Application.StatusBar = "[" & String(barLength, "■") & "] 100% 完了"
Application.Wait Now + TimeValue("00:00:02")
Application.StatusBar = False
End Sub
このコードでは、String(filledLength, “■")で完了部分を黒い四角、String(barLength – filledLength, “□")で未完了部分を白い四角で表現しています。
進捗に応じて黒い四角が増加し、視覚的に分かりやすいプログレスバーを作成できます。
実行結果がこちら
VBAステータスバーの応用テクニックと最適化
ステータスバーの基本的な使い方をマスターしたら、次は「処理速度」と「使いやすさ」を両立する応用テクニックを学びましょう。
DoEventsの適切な使用やDisplayStatusBarプロパティの活用、更新頻度の最適化など、プロレベルの実装に必要な知識を身につけることが重要です。
これらのテクニックを活用することで、誰でも簡単に扱える効率化マクロに仕上げることができます。
DoEventsを使った画面更新のタイミング調整
DoEventsは、VBAの処理中に画面の更新やユーザーの操作を受け付けるための重要な関数です。
ステータスバーの表示更新をリアルタイムで行うためには、適切なタイミングでDoEventsを呼び出す必要があります。
ただし、DoEventsを頻繁に呼び出しすぎると処理速度が低下するため、バランスの取れた実装が求められます。
Sub OptimizedDoEvents()
Dim totalRecords As Long
Dim currentRecord As Long
Dim updateInterval As Long
totalRecords = 10000
updateInterval = 100 ' 100件ごとに画面更新
Application.ScreenUpdating = False ' 画面更新を一時停止
For currentRecord = 1 To totalRecords
' 重い処理をシミュレート
Cells(currentRecord, 1).Value = "Record " & currentRecord
Cells(currentRecord, 2).Formula = "=RAND()*1000"
' 指定間隔でステータス更新とDoEvents実行
If currentRecord Mod updateInterval = 0 Then
Application.StatusBar = "処理中: " & currentRecord & "/" & totalRecords & " (" & _
Int((currentRecord / totalRecords) * 100) & "%)"
DoEvents ' 画面更新とユーザー操作を受け付け
End If
Next currentRecord
Application.ScreenUpdating = True ' 画面更新を再開
Application.StatusBar = "処理完了: 全" & totalRecords & "件"
Application.Wait Now + TimeValue("00:00:01")
Application.StatusBar = False
End Sub
このコードでは、Application.ScreenUpdating = Falseで一般的な画面更新を停止し、処理速度を向上させています。
一方で、100件ごとにDoEventsを実行してステータスバーの更新とユーザー操作の受け付けを行い、応答性とパフォーマンスのバランスを取っています。
実行中に強制停止をした様子がこちら
関連記事「DoEventsの使い方」では、マクロ実行中に発生する「応答なし」や「フリーズ」問題を解決する方法が紹介されています。
[blogcard url="https://mamemametochan.com/excel-doevents/"]
処理速度を向上させるDisplayStatusBarプロパティの活用
Application.DisplayStatusBarプロパティを使用することで、ステータスバー自体の表示・非表示を制御できます。
処理速度を最優先にしたい場合は、ステータスバーを一時的に非表示にすることで、わずかながら性能向上を図ることができます。
Sub StatusBarOptimization()
Dim originalDisplayStatus As Boolean
Dim i As Long
' 元の設定を保存
originalDisplayStatus = Application.DisplayStatusBar
' 高速処理が必要な場合はステータスバーを非表示
Application.DisplayStatusBar = False
Application.ScreenUpdating = False
' 高速処理部分
For i = 1 To 5000
Cells(i, 1).Value = i * 2
Next i
' ステータスバーを再表示して進捗表示
Application.DisplayStatusBar = True
For i = 5001 To 10000
Cells(i, 1).Value = i * 2
If i Mod 250 = 0 Then
Application.StatusBar = "後半処理中: " & (i - 5000) & "/5000"
DoEvents
End If
Next i
' 設定を元に戻す
Application.DisplayStatusBar = originalDisplayStatus
Application.ScreenUpdating = True
Application.StatusBar = False
End Sub
このコードでは、処理の前半部分でDisplayStatusBarをFalseに設定して高速処理を行い、後半では再びTrueにして進捗表示を行っています。
originalDisplayStatus変数で元の設定を保存し、処理終了後に復元することで、ユーザーの環境設定を尊重しています。
ループ処理での効率的なステータス更新頻度の設定
大量データを処理する際は、ステータスバーの更新頻度を適切に設定することが重要です。
更新頻度が高すぎると処理速度が低下するので注意しましょう。
データ量に応じて動的に更新間隔を調整することが重要です。
Sub DynamicUpdateInterval()
Dim totalItems As Long
Dim currentItem As Long
Dim updateInterval As Long
Dim lastUpdate As Long
totalItems = InputBox("処理件数を入力してください", "データ処理", "1000")
' データ量に応じて更新間隔を動的調整
Select Case totalItems
Case Is <= 100
updateInterval = 10 ' 小規模:10件ごと
Case Is <= 1000
updateInterval = 50 ' 中規模:50件ごと
Case Is <= 10000
updateInterval = 100 ' 大規模:100件ごと
Case Else
updateInterval = 500 ' 超大規模:500件ごと
End Select
Application.ScreenUpdating = False
lastUpdate = 0
For currentItem = 1 To totalItems
' 実際の処理
Cells(currentItem, 1).Value = "Item" & currentItem
' 動的間隔でステータス更新
If currentItem - lastUpdate >= updateInterval Or currentItem = totalItems Then
Application.StatusBar = "処理進捗: " & currentItem & "/" & totalItems & " (" & _
Format((currentItem / totalItems), "0%") & ") " & _
"更新間隔:" & updateInterval
DoEvents
lastUpdate = currentItem
End If
Next currentItem
Application.ScreenUpdating = True
Application.StatusBar = False
End Sub
このコードでは、処理件数に応じてSelect Case文で最適な更新間隔を設定しています。
小規模なデータでは頻繁に更新してきめ細やかな進捗表示を行い、大規模なデータでは更新頻度を下げて処理速度を優先する仕組みに設定。
lastUpdate変数を使用して前回の更新からの経過件数を管理し、効率的な更新制御を実現しています。
VBA初心者が効率化マクロを導入する方法
VBAなんて扱ったことないけど、処理状況を一目で確認できる効率化マクロを導入したい!
こんな問題を解決する方法がこちら
- マクロの開発を外注に依頼する
- マクロが設定されたエクセルファイルをダウンロードする
- 参考書やネットでVBAスキルを身に付ける
VBAスキルを身に着ける前は、「マクロ開発の外注」で対応していましたが、
今では自分で効率化マクロをサクッと導入しちゃいます。
完成されたマクロを使ってエクセル業務を処理する
↓
作業効率が2倍以上アップ!!
↓
便利すぎて自分でもマクロを設定したいと考え始める
↓
参考書やネットの情報でVBAスキルを身に付ける
↓
マクロ開発を代行できる程のスキルを習得
VBAは
他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい
という特徴があります。
外注した方が楽だけど、費用がかかる。自分で導入すれば費用は0円だけど時間がかかる。。
いずれにせよ、効率化マクロを導入できれば作業効率が飛躍的にアップするのは間違いありません。
あなたに合った方法で導入しちゃいましょう。
マクロ開発を外注に依頼する
マクロ開発を外注に依頼する方法は
VBAを全く扱えない方でもエクセル作業を自動化できる最も簡単な方法
です。
「こんなデータ抽出作業を自動化したい」「作った資料を自動的にPDFで保存したい」「決まった様式に写真を自動で貼り付けたい」
こんな感じで実現したい内容を依頼するだけで業務内容に合ったマクロを開発してくれます。
ガッツポーズの人
デメリットは、費用がかかることだけ。
開発内容、依頼先によってかかる費用は大きく異なります。
私が会社員の頃利用していた業者さんは1マクロあたり2万円~3万円の費用がかかりました。
疑問がある人
ちなみに、マメBlogでもエクセルマクロ開発代行サービスを承っています。
開発内容の確認、VBAコードの設定、動作確認後の調整、など全ての工程を私(マメ父ちゃん)が行っているので、
費用が安い!スピード納期!!
でやらせてもらっています。
ほとんど独学で身に付けたVBAスキルなので、内容によっては開発できないこともあるのでご了承ください。
ご相談、見積もり依頼は完全無料ですので気になる方は下記のリンクよりお問合せ下さい。
マクロが設定されたエクセルファイルをダウンロードする
VBA初心者でも『マクロが設定されたエクセルファイルをダウンロード』することで、
すぐに使っているエクセルにマクロを導入することができます。
VBA初心者でも形になっているマクロをゲットできる、費用が安い、
というメリットがあります。
しかし、
想定するマクロを見つけることが難しい、業務内容に合わせるためのアレンジが必要
というデメリットもあります。
ガッツポーズの人
個人ブログやファイルを販売できるサイト「note」や「Tips」ではいろんなマクロの情報が掲載されているので是非参考にしてみてください。
今までマメBlogで受注した効率化マクロを下記のnoteで掲載していますので併せてチェックしてみてください。
参考書やネットでVBAスキルを身に付ける
先程も紹介しましたが、
VBAは他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい
プログラミングです。
言い換えると、
情報量が豊富なので自分で勉強できちゃう
ということです。
私のVBAスキルはほとんど独学で身に付けたもので、
考えた処理のほとんどをVBAで表現できるレベルにまで到達した!
と思っています。
私の作ったマクロをプロのプログラマーが見れば、
お前の書くコードはインチキだ!「変数の宣言」とか「引数」を正しく使えよ!!
と感じるはずです。
でも、
私からすればどうでもいい!!!想定した内容を正しく処理できればよくないですか!?
独学であっても『ステータスバーを導入したマクロ』『全てのシートをPDF出力するマクロ』『連番を振るマクロ』など、
業務内容に合ったマクロを開発できるようになれます。
独学でVBAスキルを身に付けるコツは、
エラーが発生してもいいからひたすらコードを書く、なんでもいいからエクセル作業をマクロ化してみる
です。
とは言っても、全くの知識0の方は何をすればいいかわからないですよね。
VBA知識0の初心者の方は、参考書『たった1秒で仕事が片づくExcel自動化の教科書【増強完全版】
VBAの知識0の方でもすいすい読み進められる内容になっています。
やさしい内容にも関わらず「え!!VBAを使えばこんなことできるの!?」と感動すると思います。
実際に私はこの参考書を読んでからVBAの勉強を始めました。
ひらめく人
VBAの魅力を発見した後は、
ひたすら自動化したい内容のコードを書くだけ
です。
【VBA ステータスバー】【VBA 処理状況 確認】でネット検索すれば知りたいコードをすぐにゲットできます。
実現したい処理に向かって、「調べる→書いてみる→エラーを改善する→調べる」を繰り返していると
自然といろんなマクロが作れるようになっているはずです。
VBAに興味が湧いてきたという方は今からVBA学習をスタートさせちゃいましょう。