注目キーワード
  1. VBA
  2. 関数
  3. ショートカット

【VBA】For~Eachステートメントをマスターしよう!【基本~応用まで】

  • 2019年3月28日
  • 2019年3月28日
  • VBA
  • 51回
  • 0件
VBA NO IMAGE

For~Eachステートメントをマスターしよう!

For~Eachステートメントを使っていますか?
For~Eachステートメントは対象のコレクションに含まれるすべてのオブジェクトに対して同じ処理を実行できるステートメントです。

複数のセルを含むRangeコレクションを対象に、全セルに対して同じ処理を実行する、
といった場合に使用すると簡潔に記述する事ができます。

この記事では、For~Eachステートメントの基本的な使いかたはもちろん

状況に応じた使いかたを紹介します。

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

For~Eachステートメントとは配列やコレクションなどのオブジェクトの集合に対して処理を繰り返し実行できるステートメントです。
For~Nextスタートメントでも配列やコレクションに対した処理を実行できますが、

For~Eachステートメントで記述した方が手短に記述する事が可能になります。

For~Eachステートメントの基本的な記述は次のようになります。

For Each 変数名 In コレクション
処理を記述
Next  変数名

「For Eachステートメント」で「選択範囲」に対して処理を実行する

選択した範囲のすべてのセルに同じ処理を実行したい場合は

For~EachステートメントにSelectionを指定してSelection内のすべてのセルに対して処理を繰り返し実行することができます。

次のコードでは選択した範囲に各セルに文字列”店”を付けています。

Sub test ()
Dim sRange As Range ‘変数sRangeをオブジェクト型で宣言する
 For Each sRange In Selection 
sRange . Value = sRange & “店” ‘Selection内のセルに対して処理を実行する
Next sRange
End Sub

「For Eachステートメント」で「選択範囲の行」に対して処理を実行する

行と列を組み合わせた、セル範囲を表すRangeオブジェクトは、セルの集合としてのRangeコレクションだけではなく、

その範囲の行単位や列単位で区切ったRangeコレクションとしても指定する事ができます。

行単位で区切るときにはRowsプロパティを使い、列単位の場合はColumnsプロパティを使用します。

次のコードでは、選択した範囲を行単位で区切ってRangeコレクションとして、

2行目の値が”野菜”の場合に3行目の値に20を加算する処理を行単位で行います。

Sub test ()
Dim tRow As Range ‘変数tRowをオブジェクト型で宣言する
For Each tRow In Range (“B3:D8”) . Rows
If tRow . Cells (2) . Value = “野菜” Then ‘コレクションの2番目の行の値が”野菜”の場合に処理を実行する
tRow . Cell (3) . Value = tRow . Cells (3) . Value + 20 ‘処理が実行された場合に値に20を加算する
End If
Next tRow
End Sub

「For Eachステートメント」で「すべてのシート名」を変更する

セルの集合以外にもすべてのシートをコレクションに指定してSheetsオブジェクトに対して一括で処理を実行する事も可能です。

次のコードでは作業中のブックに含まれているすべてのSheetsオブジェクトをコレクションにして

すべてのSheetオブジェクトのNameプロパティを操作して

シート名の一部の文字列を別の文字列に置換
しています。

Sub test ()
Dim tSh As Object ’変数tShをオブジェクト型で宣言する
For Each tSh In Sheets
tSh . Name = Replace( tSh. Name, “2018年度” , “2019年度” ) ’シート名をReplaceメソッドを使って置換する
Next tSh
End Sub

「For Eachステートメント」を「複数使用」して処理を実行する

作業中のすべてのブックのすべてのシート名を変更するなどコレクションの中のコレクションを操作するには

For~Eachステートメントを2重で使用する方法があります。

次のコードでは作業中のブックのすべてのシート名を変更する処理を
すべての作業中のブックに対して一括して実行できるコードです。

Sub test ()
Dim tWb As Workbook , tSh As Object ’変数tWbとtShをオブジェクト型で宣言する
For Each tWb In Workbooks
For Each tSh In tWb . Sheets
tSh . Name = Replace ( tSh . Name , “(仮)” , ” ” ) ’シート名をReplaceメソッドを使って変更する
Next tSh
Next tWb ‘次のブックを処理する
End Sub

まとめ

今回は、For~Eachステートメントの基本的な使いかたから応用までを紹介しました。

全てのセル・シート・ブックなどのコレクションに対して処理を実行する場面は非常に多く

手作業で行っていた場合は、非常に時間が短縮できるステートメントなので必ず覚えてください!

 

For~Nextステートメントを覚えたい場合は下記の記事を参考にしてください

【VBA】For~Nextステートメントをマスターしよう!【基本~応用まで】

Do~Loopステートメントを覚えたい場合は下記の記事を参考にしてください

【VBA】Do~Loopステートメントをマスターしよう!【基本~応用まで】

NO IMAGE
最新情報をチェックしよう!