Table Of Contents
1.どんな処理を行うのか(要件)
fig-1のような仕入れ表をfig-2のような棚卸表(2月末仕入れ)に集計します。
▼fig-1仕入れ表
▼fig-2棚卸表
2.準備
下記のような変数へ読み込み済みとします。
変数名:内容
dt仕入れ:fig-1の仕入れ表をDataTable型変数にセット。
dic棚卸表:fig-2の棚卸表をDictionary型変数にセット。keyが品名、valueが数量となります。
3.繰り返し(データテーブルの各行)
fig-4のように、アクティビティを配置します。
▼fig-3_繰り返し_データテーブルの各行
保存先(左辺) dic棚卸表(CurrentRow(“品名”).ToString.Trim)
保存する値(右辺) CInt(dic棚卸表(CurrentRow(“品名”).ToString.Trim)) + CInt(CurrentRow(“数量”))
– 解説
— dt仕入れの各行をCurrentRowとして、1行目から繰り返します。
— 例えば、fig-1 仕入れの3行目のとき、CurrentRow(“品名”).ToString.Trim = “みかん”となります。
— CInt()は、括弧内の文字列を整数値(Int32型)に変換します。
— このようにしてdt仕入れのすべての行を繰り返し、”品名”別の合計数量を計算します。
保存先(左辺) dic棚卸表(“みかん”)
保存する値(右辺) CInt(dic棚卸表(“みかん”)) + 仕入れ3行目のみかんの数量
4.繰り返し(前判定)
繰り返し(データテーブルの各行)と同じ処理を、繰り返し(前判定)にて行ってみます。
▼fig-4_前判定繰り返し
– 解説
— “データテーブルの各行を繰り返し”では、現在処理中の行をCurrentRowにて表現することができました。
— “前判定で繰り返し”では、CurrentRowは登場しません。その代わりにintIndexを用いて処理中の行を参照します。
— 繰り返し処理を始める前に、intIndexを初期化します。intIndex = 0
— 前判定条件は、intIndex < inDt仕入れ.RowCountとなります。
— 仕入れデータは、10行です。0からはじまり、9まで、10回繰り返します。
— プログラミングでは、カウントは”0″からはじまります。
— 繰り返したい処理の最後に、intIndex = intIndex + 1とインクリメント(プラス1)して次の行へ移行します。
保存先(左辺) dic棚卸表(dt仕入れ.Rows( intIndex).Item(“品名”).ToString.Trim)
保存する値(右辺) CInt(dic棚卸表(dt仕入れ.Rows( intIndex).Item(“品名”).ToString.Trim))+ CInt(dt仕入れ.Rows( intIndex).Item(“数量”))
5.処理結果
2つの繰り返し処理の結果をExcelへ出力しました。下図のようになります。
どちらも同じ結果となりました。
▼fig-5_繰り返し_データテーブルの各行_結果
▼fig-6_前判定繰り返し_結果
6.データ行を削除するときの注意点
データ行を削除する処理やコレクションを削除する処理を、繰り返しアクティビティで処理するときには注意が必要です。
▼fig-7_データ行を削除するとき
データテーブルの各行を繰り返しアクティビティを使って、”みかん”の行を削除すると仮定します。
– データテーブルの各行を繰り返し(ForEachRow)の場合
1. 開始時に、”RowIndex = 0 ~ 3″まで繰り返すことが決まります。
2. “繰り返し(データテーブルの各行)”では、必ず0行からスタートします。
3. “みかん” 2行のとき削除します。
4. 削除した行を詰めるように、データテーブルが変化します。
5. 3行の処理をしようとすると、すでに上に詰まっているため行が存在しません。※ここで例外が発生します。
6. このように、削除するとメモリ上ではデータが移動してしまいます。
例外発生せず、意図したように処理させるには、最後の行から先頭行へ向かうように繰り返します。
– “データテーブルの各行を繰り返し”や”コレクションの繰り返し”は、先頭行から始めます。
– 最後の行からスタートするには、”繰り返し前判定”か”繰り返し後判定”を使用します。
– 行番号を取り扱うためにInt32型のintIndexを定義し、最後の行からデクリメントします。
– 「デクリメント」とは、1ずつマイナスすることです。
▼fig-8_削除するときは繰り返しを使う
例:繰り返し後判定を使って、”ぶどう”の行を削除する
1. intIndexの初期値は、dt仕入れの行数です。
2. intIndexは0始まりのため、最初にデクリメント(マイナス1)します。
3. 後判定の条件は、0 < intIndexとします。
4. intIndexの推移は下表のようになります。
intIndex dt仕入れ.Rows(intIndex).item(“品名”)
3 いちご
2 みかん
1 ぶどう←これを削除
0 りんご
– 最後の行からスタートすれば、削除後に行が詰まっても追従できます。