Excel VBAでループ処理を行う3(For Each)

VBAでの操作

今回はまとまりの中で繰り返し処理をするものについて説明します。

Power Automate Desktopでは「For Each」、Excel VBAでもFor Each ~Nextを使います。

なお今回も前回同様以下のサンプルを処理する中で説明していきます。

今回はテーブル内を処理する方法で記載します。

スポンサーリンク

■Power Automate Desktopでの操作

今回はB3からE14までのテーブルに対して処理するフローを作成しました。1つずつ説明します。

I Excelを起動する・・・対象となるExcelを起動します

II Excelワークシートから読み取り・・・「Excelワークシートから読み取り」を開いて以下のように記載します。

  1. Excelインスタンス・・・起動したファイルの変数を入力します
  2. セルの範囲・・・今回はテーブルを処理する為セルの範囲について処理を行います。
  3. 先頭、最終セル・・・B3~E14セルをまとまりとして取得します。

えられたまとまりをExcelDataという変数として取得しています。これはデータテーブル型のオブジェクトで以下のフロー変数を開くとテーブルが表示されます。

えられたテーブルは1列目に行数が表示された形になっています。この#が繰り返しの基準になります。

III For Each ~・・・「ループ」→lFor Each」を開いて以下のように記載します

反復処理を行う値・・・For Eachではまとまりの部分を指定する必要があるためExcelDataをいれます。

その結果各行がCurrentItemとして変数に設定されるようになります。

IV Excelワークシートに書き込み・・・「Excelワークシートに書き込み」を開いて以下のように記載します

For Eachの最初の処理におけるCurrentItemは以下のようになっています。Datarowという行型のオブジェクトになっています。

  1. Excelインスタンス・・・起動したファイルの変数を入力します
  2. 書き込む値・・・IIIで取得したCurrentItemを利用します。CurrentItem[列番号]と記載することで行型のオブジェクトの指定の列を取得できます。
    ただしPower Automate Desktopでの列番号、行番号は0から始まる為今回は1列目と2列目を取得することとします。
  3. 書き込みモード・・・今回セルは指定する為このままでよいです。
  4. 列・・・列はE列の為5となります。Eでもよいです。
  5. 行・・・行は今回CurrentItem[0]とすることでB列の値=1を取得しています。
    えられた値に対してはその中で加減乗除できます。その為%~%の中で+2してあげることでエクセル上の3列目を指定しています。

この操作によりこれまで同様E3からE14までに姓名が記載されたものができます。

■VBAでの基本コード

VBAでまとまったものを処理する繰り返し処理のコードはFor Each ~Nextとなります。

Dim 変数名 As オブジェクト型
For Each 変数名 in コレクション名
  処理
Next 変数名

コレクションというのがまとまりになります。

■VBAでのコード

Sub ForEach()

'Dim 変数名 As オブジェクト型
'For Each 変数名 in コレクション名
  '処理
'Next 変数名

  Dim rng As Range
  For Each rng In Range("E3:E14")
    rng.Value = rng.Offset(0, -2).Value & rng.Offset(0, -1).Value
  Next rng
    
End Sub

■VBAコードの説明

Dim 変数名 As オブジェクト型

まとまりの中の1つ1つを構成するオブジェクトを変数として宣言します。

この変数に対して処理を行っていきます。

For Each 変数名 in コレクション名
  処理
Next 変数名

For Each ~Nextでは先ほど設定した変数を一つずつ処理します。

なお繰り返す範囲を指定する必要がありそれを in コレクション名で記載します。

処理は変数を使った操作となります。

Dim rng As Range

ここではセルオブジェクトを意味するRangeオブジェクトとしてrngという変数を設定します。rngという名前はRangeオブジェクトで一般的に用いられます。

For Each rng In Range("E3:E14")

For Each rngで各々のRangeオブジェクトに対して処理を行います。

なお繰り返す範囲はRange(”E3:E14”)とします。このオブジェクトの集まりのことをコレクションといいます。

rng.Value = rng.Offset(0, -2).Value & rng.Offset(0, -1).Value

各々のrngオブジェクト(E列)にC列とD列の値を入れます。rangeオブジェクトの位置を移動させるのにはOffsetプロパティを使います。Offset(行方向,列方向)で移動させた後のrangeオブジェクトを取得します。

移動させた後のrangeオブジェクトに対してValueプロパティを使うことで値を取得することができます。

こうして各々のrngに対して処理を行っていきます。

結果としてPowerAutomate Desktopで得られたものと同じ結果が得られます。

■ここでのまとめ

まとまりの中での繰り返し処理はFor Each ~Nextを用います。

For ~Nextと似てはいますがこちらはまとまりが決まっているもの(WorksheetやWorkbook)で力を発揮しますので合わせて使えるようになってもらえればと思います。

コメント

タイトルとURLをコピーしました