Excelマクロ、VBA

ExcelマクロとVBA入門⑫:For Eachステートメントの使い方を解説

こんにちは、はやぶさです。

日々ExcelやPythonを使って、業務を効率化しています。

前回のExcelマクロとVBA入門シリーズでは、繰り返し処理を扱う「For Nextステートメント」に焦点を当てて解説しました。

ExcelマクロとVBA入門⑪:For Nextステートメントの使い方を解説この記事では、「For Nextステートメント」を深掘りして解説します。For Nextステートメントは、プログラミングの3つの基本構造の1つである「繰り返し処理」を扱うための機能です。For Nextの基本的な使い方から、Stepキーワード、Exit Forステートメント、ネスト(入れ子)の使用方法を解説します。...

今回は続編として、「For Eachステートメント」にスポットを当て、その使用方法やFor Nextとの違いについて深掘りします。

実は、繰り返し処理において私が最も頼りにしているのがこのFor Eachステートメントです。

実務での便利さは格別で、その使いやすさから多くの場面で活用しています。

VBAにおけるプログラミングスキルをさらに向上させたい方々にとって、この記事が貴重な洞察と実用的な知識を提供し、作業のさらなる効率化に役立つことを願っています。

For Eachステートメントとは?

For Eachステートメントは、配列やコレクション内の各要素に対して順番に処理を適用する際に使用されます。

この方法で、各要素に特定の操作を行った後、全要素が処理されると自動的にループが終了します。

これは、ExcelのVBAでワークシートのセルやフォルダ内のファイルリストなど、コレクションに対する操作で特に便利です。

VBAにおける繰り返し処理のステートメント

VBAで繰り返し処理を行うためには、For Next、Do Loop、そしてFor Eachステートメントがあります。

For Nextは決められた回数の繰り返しに用いられ、Do Loopは特定の条件が満たされるまで繰り返します。

一方で、For Eachは集合内の各要素に対して個別の処理を適用する際に最適で、複雑なオブジェクト操作にも対応します。

基本的な使い方

For Eachステートメントは、配列やコレクション内の各要素に対して順に処理を適用する命令です。

リストや配列などの複数のオブジェクトを含むデータ構造から一つずつ要素を取り出し、指定された処理を行うことができます。

ループはコレクションの全要素が処理されると自動で終了します。

基本構文

[コレクション]には処理を適用したいオブジェクトの集合、[要素]には各繰り返しで扱うオブジェクトを記述します。

Nextの後の[要素]は省略可能ですが、可読性を高めるために要素を明示することを推奨されます。

例えば、アクティブなブック内の全ワークシートの名前をメッセージボックスに表示することが可能です:

このコードは、Worksheetsコレクション内の各Worksheetオブジェクトに対して、そのNameプロパティをメッセージボックスで表示します。

要素のデータ型について

For Eachステートメントは、コレクション内の各要素を変数に格納して処理を繰り返します。

この際、各要素を格納する変数のデータ型としては、オブジェクト型またはVariant型を使用する必要があります。

オブジェクト型を指定

要素がオブジェクトの場合、該当のオブジェクト型、より汎用性の高いObject型、または何でも代入できるVariant型を指定します。

オブジェクト特有のデータ型を指定すると、「コード補完」機能が利用可能になります。

ピリオドを入力するだけで自動的にメニューが表示され、開発者は全ての機能を熟知していなくても、必要なメソッドやプロパティをすぐに見つけてコードに追加できます。

これにより、コーディングが迅速になり、タイピングミスが減少します。

Variant型を指定

要素のデータ型に関わらず、変数としてVariant型を指定すれば、問題なく処理を実行できます。

非オブジェクト型の指定時のエラー

要素の変数にLong型を指定すると、コレクションの内容にかかわらずエラーが発生します。これは、文字列や日付など他のデータ型を指定した場合も同様です。

Exit Forステートメントの活用法

Exit Forステートメントは、条件に応じてループを途中で終了させるために使用されます。

特定の条件が満たされた時点でループ処理を停止させることができるため、IFステートメントなどの条件分岐と共に使用することが一般的です。

この例では、ワークシート名の末尾が「2」である最初のシートを見つけたら、その名前を表示してループを終了します。

For Nextとの比較

For NextとFor Eachは、繰り返し処理を実行するための異なるアプローチを提供します。

同様の処理を、両方のステートメントで実行して違いを比較してみましょう。

For Nextステートメント

For Nextは、カウンター変数を使用してループを制御し、明確な回数の繰り返しを実行します。特定の範囲内で操作を行う必要がある場合に適しています。

この方法では、要素数を事前に知る必要があります。

For Eachステートメント

For Eachは、コレクションや配列内のすべての要素を自動的に走査し、それぞれに対して操作を実行します。要素の数やインデックスを知る必要がありません。

この方法では、コレクションのサイズに関わらず、すべての要素を処理できます。

まとめ

この記事では、For Eachステートメントの基礎から応用まで幅広く、その使用法と具体例を紹介しました。

For Eachは、配列やコレクション内の要素を一つずつ処理するための繰り返し処理に特化したステートメントです。

この機能は、ExcelのVBAを用いてワークシートのセルやフォルダ内のファイルリストなど、様々なコレクションに対する操作を簡単かつ効率的に行うのに非常に便利です。

キーポイント

  • For Eachステートメントとは?: 配列やコレクション内の各要素を順に処理する、繰り返し処理のためのステートメントです。
  • 要素のデータ型について: 格納する変数のデータ型は、オブジェクト型またはVariant型が必要です。
  • Exit Forステートメントの活用法: ループを条件に応じて途中で終了させるために使用します。
  • For Nextとの比較:
    • For Next: カウンター変数を用いてループを制御し、明確な回数での繰り返しを実行します。要素数を事前に知る必要があります。
    • For Each: コレクションや配列内のすべての要素を自動的に走査し、各要素に対して操作を行います。要素の数やインデックスを知る必要がないため、より柔軟に使用できます。

プログラミングは学習と実践の繰り返しです。諦めずに継続することで、やがては複雑な問題も解決できるようになります。

この記事が、Excel VBAの世界への興味をさらに深め、日々の作業を効率化するためのツールとしてExcelマクロとVBAを活用する一助となることを願っています。

はやぶさ
中小企業の中間管理職をしており、ExcelマクロやPythonを活用して業務の自動化に取り組んでいます。

今働いている職場を、ITの力でより良い環境にできるよう、知識や経験を共有していきたいと考えています。