Slide 1

Slide 1 text

EXCELのその先へ RPA勉強会!人気No.1EXCEL関数 VLOOKUPをUiPathで実現!

Slide 2

Slide 2 text

はなっち!とは…  2019年10月 UiPath Japan MVP 2019 認定  2020年10月 UiPath Japan MVP 2020 認定  2021年10月 UiPath Japan MVP 2021 認定されるか!?  2020年11月 定年退職  同 年 同 月 FUJITSU UT社と契約  お客様先でRPAサポート&開発  Twitter:hjmkzk  Qiita:@HANACCHI  FaceBook:hajime.kozaki

Slide 3

Slide 3 text

「現」Aファイルの情報を、Bファイルに追記したいんです。 「私」あ!はい!(BファイルをDataTableにして、件数を求めて、+1して...) とりあえず、フォーマット確認したいので、ファイル共有ください ・・・ 「私」どれどれ。。。あ!リンクの確認が出てきてます! 「現」あ!言い忘れました!その列にはVLOOKUP関数を、上のセルからコピーしているんです 「私」あぁ、でしたら、その機能もロボットにやらせましょう! 「現」え!出来るんですか? ある日、現場担当者から、こんな依頼がありました。

Slide 4

Slide 4 text

Twitterに、こんなハッシュタグがありました#Excel関数天下一武道会

Slide 5

Slide 5 text

Today’s EXCELのその先へ 1. Studio Advance • VLookup関数のように、マスタ上のデータを参照したい! • 「データテーブルの結合」で、マスタ上のデータを参照したい! • マスタ上のデータをUNIQUEにしたい! • UNIQUE後の加工処理 【発展】 • キーから、マスタの行番号、わかってんでね? • DataTable.ImportRowメソッドを使って、変わった事が出来る!?

Slide 6

Slide 6 text

Today’s EXCELのその先へ 2. Studio Advance • Sum関数/SubTotal関数のように、キー毎の合計値を求めたい! 3. まとめ

Slide 7

Slide 7 text

EXCELのその先へ VLookup関数のように、マスタ上のデータを参照したい! Studio Advance

Slide 8

Slide 8 text

VLookup関数のように、マスタ上のデータを参照したい! 列1にある値をもって、マスタ列1を検索し、マスタ値を参照する 列1と列2にある値をもって、マスタ列1とマスタ列2を検索し、マスタ値を参照する ⇒タブ記号(CHAR(9))で結合しないと、”A”+”AA”と”AA”+”A”が同じ値になってしまう! ⇒参照する側は、CHAR(9)で結合できるが、参照される側は、 CHAR(9)で結合したセルを左列に準備が必要!

Slide 9

Slide 9 text

DataTable型  1以上の複数の列を持つ。列にはデータの型属性を保有している  0以上の複数の行を持つ  0から始まるn行目の、 0から始まるn列番号あるいは列名で、値を参照/設定できる DataTable 列番号 0 1 2 列名 列1 列2 列値 ↓行目 0 A AA 1 AA B 2 B B 3 C X 0から始まる3行目の、0から始まる1列番号は、 DataTable.Rows(3).Item(1)で参照できる(“X”が参照できる) DataTable.Rows(3).Item(“列”)でもOK! 参考

Slide 10

Slide 10 text

DataTable型  フィルタで抽出/除外が出来る ⇒「データテーブルのフィルタ」  それぞれキーを指定し、条件に合致した行を結合することが出来る ⇒「データテーブルの結合」  1つのキーを指定して、並び替えする事が出来る。 複数キーの場合は、下位キーから順に並び替えする事で実現出来る。 ⇒「データテーブルの並び替え」  二つのDataTableをマージする事が出来る。 ⇒「データテーブルのマージ」  そのままEXCELブック、CSVファイルなどに出力できる ⇒「範囲へ書込み」「CSVへ書込み」 参考

Slide 11

Slide 11 text

「データテーブルの結合」で、マスタ上のデータを参照したい! 結合型  Inner:入力データテーブル1と、入力データテーブル2とのキーが合致した行を、 横に並べて出力データテーブルに出力する

Slide 12

Slide 12 text

「データテーブルの結合」で、マスタ上のデータを参照したい! 結合型  Inner:入力データテーブル1と、入力データテーブル2とのキーが合致した行を、 横に並べて出力データテーブルに出力する  Left:入力データテーブル1と入力データテーブル2とのキーが合致した行を、横 に並べて出力データテーブルに出力する。 更に、入力データテーブル1のうち、入力データテーブル2とのキーが合致しな かった行も出力データテーブルに出力する。

Slide 13

Slide 13 text

「データテーブルの結合」で、マスタ上のデータを参照したい! 結合型  Inner:入力データテーブル1と、入力データテーブル2とのキーが合致した行を、 横に並べて出力データテーブルに出力する  Left:入力データテーブル1と入力データテーブル2とのキーが合致した行を、横 に並べて出力データテーブルに出力する。 更に、入力データテーブル1のうち、入力データテーブル2とのキーが合致しな かった行も出力データテーブルに出力する。  Full:入力データテーブル1と入力データテーブル2とのキーが合致した行を、横 に並べて出力データテーブルに出力する。 更に、入力データテーブル1のうち、入力データテーブル2とのキーが合致しな かった行も出力データテーブルに出力する。 更に、入力データテーブル2のうち、入力データテーブル1とのキーが合致しな かった行も出力データテーブルに出力する。

Slide 14

Slide 14 text

「データテーブルの結合」で、マスタ上のデータを参照したい! 実際のDataTableの行順ではありません

Slide 15

Slide 15 text

「データテーブルの結合」で、マスタ上のデータを参照したい! 実際のDataTableの行順ではありません

Slide 16

Slide 16 text

「データテーブルの結合」で、マスタ上のデータを参照したい! 実際のDataTableの行順ではありません

Slide 17

Slide 17 text

「データテーブルの結合」で、マスタ上のデータを参照したい! 実際のDataTableの行順ではありません 左DataTable側の件数が増えてしまう • 無論、この結果がすべて「よくない」訳ではありません。 • 1商品のn部品を集計するなどの業務要件では「正しい挙動」ですね

Slide 18

Slide 18 text

「データテーブルの結合」で、マスタ上のデータを参照したい! 実際のDataTableの行順ではありません • マスタはキーでUNIQUEになるようにしなければならない! その際、最初に現れた行を採用するか、最後に現れた行を採用するか、決める必 要がある! • キーの存在を確認するのであれば、最初のキー、最後のキーは関係なくなるが、 UNIQUEにする必要はある! 左DataTable側の件数が増えてしまう

Slide 19

Slide 19 text

マスタ上のデータをUNIQUEにしたい!

Slide 20

Slide 20 text

「範囲を読み込み」アクティビティ で読み込んだDataTableのイメージ 順 処理 結果 上から順に コレクションに無かったら キー,行番号追加 B,Bは、5行目を採用 上から順に コレクションに無条件に キー,行番号上書き B,Bは、7行目を採用 上から順に コレクションに無かったら キー追加 B,Bは、存在する 上から順に コレクションに無条件に キー上書き。 終わったら、.Distinct.ToList B,Bは、存在する 下から順に コレクションに無条件に キー,行番号上書き B,Bは、5行目を採用 マスタ上のデータをUNIQUEにしたい! • 行位置を使用するには、Dictionary(Of String, Int32)型を使用します ⇒代入アクティビティで、初期化する必要がある(New Dictionary(Of String, Int32)) • 存在だけでいい場合には、List(Of String)型を使用します ⇒代入アクティビティで、初期化する必要がある(New List(Of String)) (0) (1) (2) (3) (4) (5)

Slide 21

Slide 21 text

Dictionary型  ディクショナリ内のキーの型と、ディクショナリ内の値の型 をPairで保有できる変数。  ディクショナリ内のキーに格納される値は常にUNIQUEである。  ディクショナリ内のキーへ値を渡す事で、ディクショナリ内の値が得られる  .Containsで、指定したキーが Dictionary に格納されているかど うかを判断できる。 Dictionary Key(String) Value(Int32) 列1列2 列値 AAA 0 AAB 1 BB 2 CX 3 • Dictionary変数 = New Dictionary(Of String, Int32)で初期化必要! • Dictionary変数(キー)で、値が参照できる! • 繰り返し(コレクションの各要素)の受けの型は、KeyValuePairである https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.dictionary-2?view=net-5.0 (0) (1) (2) (3) 参考

Slide 22

Slide 22 text

Dictionary型/KeyValuePair型の定義方法 参考

Slide 23

Slide 23 text

List型  インデックスを使用してアクセスできる、リスト内の要素の型指定された オブジェクトのリストの変数。  リスト内の要素に格納される値は、格納順である  リストの変数にインデッスクを渡す事で、リスト内の要素の値が得られる  .Containsで、ある要素が List 内に存在するかどうかを判断できる List String 列1列2 AAA AAB BB CX https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.list-1?view=net-5.0 • List変数 = New List(Of String)で初期化必要! • List変数(ix)で、ixで示される位置の値が参照できる! • 繰り返し(コレクションの各要素)の受けの型は、指定属性である (0) (1) (2) (3) 参考

Slide 24

Slide 24 text

List型の定義方法 参考

Slide 25

Slide 25 text

「範囲を読み込み」アクティビティ で読み込んだDataTableのイメージ 順 処理(Dictionary型へ) 結果 上から順に コレクションに無条件に キー,行番号上書き B,Bは、7行目を採用 マスタ上のデータをUNIQUEにしたい! FWDDic(Key) = ix (現在のインデックス...行の位置) Key Value AA 0 AAA 1 AAB 2 BB 3->4->5 (0) (1) (2) (3) (4) (5)

Slide 26

Slide 26 text

「範囲を読み込み」アクティビティ で読み込んだDataTableのイメージ 順 処理(List型へ) 結果 上から順に コレクションに無条件に キー上書き。 終わったら、.Distinct.ToList B,Bは、存在する マスタ上のデータをUNIQUEにしたい! FWDLst = Key (キー値) List AA AAA AAB BB BB BB List AA AAA AAB BB .Distinct (0) (1) (2) (3) (4) (5)

Slide 27

Slide 27 text

「範囲を読み込み」アクティビティ で読み込んだDataTableのイメージ 順 処理(Dictionary型へ) 結果 下から順に コレクションに無条件に キー,行番号上書き B,Bは、5行目を採用 マスタ上のデータをUNIQUEにしたい! RVSDic(Key) = 行総数 - ix - 1 (現在のインデックスが増えれば、計算行位置は減る) Key Value BB 5->4->3 AAB 2 AAA 1 AA 0 (0) (1) (2) (3) (4) (5)

Slide 28

Slide 28 text

UNIQUE後の加工処理

Slide 29

Slide 29 text

ユニーク後の加工処理 「範囲を読み込み」アクティビティ で読み込んだDataTableのイメージ Key Value AA 0 AAA 1 AAB 2 BB 3->4->5 1. 「データ行を追加」アクティビティを使って! ⇒簡単! 2. 「メソッドを呼び出し」アクティビティで、 DataTable.ImportRowメソッドを使って! ⇒変わった事が出来る!? 別のDataTable (0) (1) (2) (3) (4) (5) DIC

Slide 30

Slide 30 text

「範囲を読み込み」アクティビティ で読み込んだDataTableのイメージ Key Value AA 0 AAA 1 AAB 2 BB 3->4->5 別のDataTable ユニーク後の加工処理(データ行を追加) (0) (1) (2) (3) (4) (5) DIC Dictionary BASTDtの列情報のみ KeyValuePair .ItemArray 指定行の、 全ての列の値を 配列にする

Slide 31

Slide 31 text

「範囲を読み込み」アクティビティ で読み込んだDataTableのイメージ Key Value AA 0 AAA 1 AAB 2 BB 3->4->5 別のDataTable ユニーク後の加工処理(ImportRow) DIC Dictionary BASTDtの列情報のみ KeyValuePair ImportRow 指定行を Importする (0) (1) (2) (3) (4) (5)

Slide 32

Slide 32 text

ユニーク後の加工処理(ImportRow) 指定行を Importする

Slide 33

Slide 33 text

「データテーブルの結合」で、マスタ上のデータを参照したい! 実際のDataTableの行順ではありません 左DataTable側の件数が増えてしまう 振り返り

Slide 34

Slide 34 text

「データテーブルの結合」で、マスタ上のデータを参照したい! 実際のDataTableの行順ではありません イメージ

Slide 35

Slide 35 text

発展 キーから、マスタの行番号、わかってんでね?

Slide 36

Slide 36 text

キーから、マスタの行番号、わかってんでね? 「範囲を読み込み」アクティビティ で読み込んだDataTableのイメージ Key Value AA 0 AAA 1 AAB 2 BB 3->4->5 • [元DataTable]から、Keyを構成して、 を作った • には、そのKeyを持つ[元 DataTable]の行位置が格納されている • 参照しようとしている{DataTable}からKeyを構 成して、 から[元DataTable]の行 位置を取得できる! 別のDataTable (0) (1) (2) (3) (4) (5) DIC

Slide 37

Slide 37 text

キーから、マスタの行番号、わかってんでね? TRANDt キー構成 CurrentRow.Item(0).ToString & Controlchars.tab & CurrentRow.item(1).ToString キー存在確認 DIC.Keys.Contains(Key) BASEDT.rows(DIC(Key)).item(2) 値の参照/転記 TRANDt TRANDt.csv

Slide 38

Slide 38 text

発展 DataTable.ImportRowメソッドを使って、変わった事が出来る!?

Slide 39

Slide 39 text

「データ行を追加」アクティビ ティは、列配列を入力にしてい るため、列名は関係しない DataTable.ImportRowメソッドを使って、 変わった事が出来る!? ImportRowメソッドは、行全 体を入力にしていて、Importす るDataTableの列名に依存する 参考

Slide 40

Slide 40 text

Studio Advance EXCELのその先へ Sum関数/SubTotal関数のように、キー毎の合計値を求めたい!

Slide 41

Slide 41 text

Sum関数/SubTotal関数のように、キー毎の合計値を求めたい! 日付順に、売上明細が積みあがっている。 商品CD毎の売上金額を求めたい。 それを各商品CDの最終行に「小計」として挿入したい。 最後に、全ての売上金額の「合計」を挿入したい 商品CD、日付で並び替える

Slide 42

Slide 42 text

Sum関数/SubTotal関数のように、キー毎の合計値を求めたい! 「小計」行、「合計」行を挿入する 「小計」行に、=SubTotal(9,範囲)を入力 「合計」行にも、=SubTotal(9,範囲)を入力

Slide 43

Slide 43 text

Sum関数/SubTotal関数のように、キー毎の合計値を求めたい! 意外と手間!

Slide 44

Slide 44 text

DataTable型  1以上の複数の列を持つ。列にはデータの型属性を保有している  0以上の複数の行を持つ  0から始まるn行目の、 0から始まるn列番号あるいは列名で、値を参照/設定できる DataTable 列番号 0 1 2 列名 列1 列2 列値 ↓行目 0 A AA 1 AA B 2 B B 3 C X 0から始まる3行目の、0から始まる1列番号は、 DataTable.Rows(3).Item(1)で参照できる(“X”が参照できる) DataTable.Rows(3).Item(“列”)でもOK! 参考

Slide 45

Slide 45 text

DataTable型  フィルタで抽出/除外が出来る ⇒「データテーブルのフィルタ」  それぞれキーを指定し、条件に合致した行を結合することが出来る ⇒「データテーブルの結合」  1つのキーを指定して、並び替えする事が出来る。 複数キーの場合は、下位キーから順に並び替えする事で実現出来る。 ⇒「データテーブルの並び替え」  二つのDataTableをマージする事が出来る。 ⇒「データテーブルのマージ」  そのままEXCELブック、CSVファイルなどに出力できる ⇒「範囲へ書込み」「CSVへ書込み」 参考

Slide 46

Slide 46 text

Sum関数/SubTotal関数のように、キー毎の合計値を求めたい! RPAでは、どうするか? 使用アクティビティ 1. 準備 最終DataTable領域確保。 元DataTableと列を同一構成にする 2. 「商品CD」「日付」でSORTする 「データ テーブルを並べ替え」を使う 合計をクリア 3. 「商品CD」でUNIQUEな値を求める 「繰り返し (データ テーブルの各行)」を使って、 Dictionary型(Of String, Int32)へ、キー挿入 4. 全Dictionaryを対象に繰り返す 繰り返し (コレクションの各要素) a. UNIQUEな「商品CD」で抽出フィルター を掛ける 「データ テーブルをフィルター」を使う b. 抽出したDataTableで、「金額」の合算 を行う 小計をクリアしたのち、「繰り返し (データ テーブル の各行)」を使って、小計に加算、合計に加算 c. 「小計」を、抽出したDataTableにデー タ行を追加する DataRow型の変数を用意し、 中間DataTableへ「データ行を追加」 d. 最終的なDataTableにマージする 「データ テーブルをマージ」を使う 5. 「合計」をDataTableにデータ行を追加する DataRow型の変数を用意し、 最終DataTableへ「データ行を追加」

Slide 47

Slide 47 text

1. 準備 • New DataTableで、DataTable型を初期 化する • 列の情報はこの時点では構築されていな い。  「データ列の追加」で定義  元Dt.Cloneで、 元Dtの列情報をクローンコピーする New DataTable 列1(Str) 列2(Str) 列値(In32) KOZAKI HAJIME 60

Slide 48

Slide 48 text

DataTable型のハンドリングの注意事項! 1. DataTableから無指定代入 受け側のDataTableの領域は、 送り側のDataTableの領域と同じ ⇒受け側を操作すると送り側も変わる 参考 列1(Str) 列2(Str) 列値(In32) KOZAKI HAJIME 60 列1(Str) 列2(Str) 列値(In32) KOZAKI HAJIME 60 列1(Str) 列2(Str) 列値(In32) KOZAKI HAJIME 60 列1(Str) 列2(Str) 列値(In32) 2. DataTableから.Copy代入 受け側のDataTableの領域は、 送り側のDataTableの領域と別。 ⇒受け側を操作すると送り側も変わらない 3. DataTableから.Clone代入 受け側のDataTableの領域は、 送り側のDataTableの列定義のみが同じ。 ⇒行は代入されない

Slide 49

Slide 49 text

• このアクティビティでは、SORT キーが一つしか指定できない • SORTキーが複数ある場合は、下位キー から並び替えをし、上位キーまで繰り返 す  この場合、「日付」をまずSORTし、 結果を同じDataTable域を流用する  次に、「商品CD」をSORTする 2. 「商品CD」「日付」でSORTする 日付 商品CD 単価 数量 金額 2021/9/6 AX-1 100 1 100 2021/9/6 BX-1 110 2 220 2021/9/6 CX-1 1,000 3 3,000 2021/9/6 DX-1 600 2 1,200 2021/9/7 AX-1 100 2 200 2021/9/7 CX-1 1,000 2 2,000 2021/9/9 DX-1 600 4 2,400 2021/9/9 AX-1 100 3 300 2021/9/9 CX-1 1,000 2 2,000 日付 商品CD 単価 数量 金額 2021/9/6 AX-1 100 1 100 2021/9/7 AX-1 100 2 200 2021/9/9 AX-1 100 3 300 2021/9/6 BX-1 110 2 220 2021/9/6 CX-1 1,000 3 3,000 2021/9/7 CX-1 1,000 2 2,000 2021/9/9 CX-1 1,000 2 2,000 2021/9/6 DX-1 600 2 1,200 2021/9/9 DX-1 600 4 2,400 日付 商品CD 単価 数量 金額 2021/9/6 AX-1 100 1 100 2021/9/6 BX-1 110 2 220 2021/9/6 CX-1 1,000 3 3,000 2021/9/6 DX-1 600 2 1,200 2021/9/7 AX-1 100 2 200 2021/9/7 CX-1 1,000 2 2,000 2021/9/9 DX-1 600 4 2,400 2021/9/9 AX-1 100 3 300 2021/9/9 CX-1 1,000 2 2,000

Slide 50

Slide 50 text

3. 「商品CD」でUNIQUEな値を求める • New Dictionary(Of String, Int32)型で、 Dictionary型を初期化する • 対象とするDataTableを対象に、辞書機 能で、UNIQUEな値を求める 日付 商品CD 単価 数量 金額 2021/9/6 AX-1 100 1 100 2021/9/7 AX-1 100 2 200 2021/9/9 AX-1 100 3 300 2021/9/6 BX-1 110 2 220 2021/9/6 CX-1 1,000 3 3,000 2021/9/7 CX-1 1,000 2 2,000 2021/9/9 CX-1 1,000 2 2,000 2021/9/6 DX-1 600 2 1,200 2021/9/9 DX-1 600 4 2,400 Key Value AX-1 0 BX-1 0 CX-1 0 DX-1 0

Slide 51

Slide 51 text

a. UNIQUEな「商品CD」で抽出フィル ターを掛ける b. 抽出したDataTableで、「金額」の合算 を行う c. 合算値を小計とするため、抽出した DataTableにデータ行を追加する d. 最終的なDataTableにマージする 4. 全Dictionaryを対象に繰り返す 日付 商品CD 単価 数量 金額 2021/9/6 AX-1 100 1 100 2021/9/7 AX-1 100 2 200 2021/9/9 AX-1 100 3 300 2021/9/6 BX-1 110 2 220 2021/9/6 CX-1 1,000 3 3,000 2021/9/7 CX-1 1,000 2 2,000 2021/9/9 CX-1 1,000 2 2,000 2021/9/6 DX-1 600 2 1,200 2021/9/9 DX-1 600 4 2,400 Key Value AX-1 0 BX-1 0 CX-1 0 DX-1 0

Slide 52

Slide 52 text

日付 商品CD 単価 数量 金額 2021/9/6 CX-1 1,000 3 3,000 2021/9/7 CX-1 1,000 2 2,000 2021/9/9 CX-1 1,000 2 2,000 日付 商品CD 単価 数量 金額 2021/9/6 DX-1 600 2 1,200 2021/9/9 DX-1 600 4 2,400 • [入力データテーブル]から、フィルタ行 の条件(行の”商品CD”が、UNIQUEな キーと一致)で“保持”されたデータを、 [出力データテーブル]に出力する 4. a. UNIQUEな「商品CD」で抽出フィルターを掛ける 日付 商品CD 単価 数量 金額 2021/9/6 AX-1 100 1 100 2021/9/7 AX-1 100 2 200 2021/9/9 AX-1 100 3 300 2021/9/6 BX-1 110 2 220 2021/9/6 CX-1 1,000 3 3,000 2021/9/7 CX-1 1,000 2 2,000 2021/9/9 CX-1 1,000 2 2,000 2021/9/6 DX-1 600 2 1,200 2021/9/9 DX-1 600 4 2,400 Key Value AX-1 0 BX-1 0 CX-1 0 DX-1 0 日付 商品CD 単価 数量 金額 2021/9/6 AX-1 100 1 100 2021/9/7 AX-1 100 2 200 2021/9/9 AX-1 100 3 300 日付 商品CD 単価 数量 金額 2021/9/6 BX-1 110 2 220

Slide 53

Slide 53 text

• 「金額」から「小計」の合計を求める前 に、「小計」をクリアする • 先行アクティビティの、商品CDで抽出 した[出力データテーブル]の全行を対象 に、「金額」をInt32に変換した結果を、 「小計」に加算する • 同様に、「合計」にも加算する 4. b.抽出したDataTableで、「金額」の合算を行う 日付 商品CD 単価 数量 金額 2021/9/6 AX-1 100 1 100 2021/9/7 AX-1 100 2 200 2021/9/9 AX-1 100 3 300 0 100 300 600 日付 商品CD 単価 数量 金額 2021/9/6 BX-1 110 2 220 0 220

Slide 54

Slide 54 text

• 格納するDataTable(TEMPDT)のメソッ ド.NewRowを使用し、新しい行の領域 を確保する ⇒GOALRowが新しい領域 • その領域の”商品CD”列に”小計”を代入す る • 続けて、”金額”列に、小計を代入する • 「データ行の追加」を使用し、格納する DataTable(TEMPDT)に、新しい行の領 域を追加する 4. c.「小計」を、抽出したDataTableにデータ行を追加する 日付 商品CD 単価 数量 金額 2021/9/6 AX-1 100 1 100 2021/9/7 AX-1 100 2 200 2021/9/9 AX-1 100 3 300 日付 商品CD 単価 数量 金額 .NewRow ”小計” 600 日付 商品CD 単価 数量 金額 2021/9/6 AX-1 100 1 100 2021/9/7 AX-1 100 2 200 2021/9/9 AX-1 100 3 300 小計 600 「データ行の追加」 600

Slide 55

Slide 55 text

• 格納するDataTable(TEMPDT)を最終的 なDataTable(GOALDT)にマージ(追 記)する 4. d.最終的なDataTableにマージする 日付 商品CD 単価 数量 金額 2021/9/6 AX-1 100 1 100 2021/9/7 AX-1 100 2 200 2021/9/9 AX-1 100 3 300 小計 600 日付 商品CD 単価 数量 金額 2021/9/6 AX-1 100 1 100 2021/9/7 AX-1 100 2 200 2021/9/9 AX-1 100 3 300 小計 600 日付 商品CD 単価 数量 金額 日付 商品CD 単価 数量 金額 2021/9/6 AX-1 100 1 100 2021/9/7 AX-1 100 2 200 2021/9/9 AX-1 100 3 300 小計 600 日付 商品CD 単価 数量 金額 2021/9/6 BX-1 110 2 220 小計 220 日付 商品CD 単価 数量 金額 2021/9/6 AX-1 100 1 100 2021/9/7 AX-1 100 2 200 2021/9/9 AX-1 100 3 300 小計 600 2021/9/6 BX-1 110 2 220 小計 220 TEMPDT GOALDT GOALDT

Slide 56

Slide 56 text

• 格納するDataTable(GOALDT)のメソッ ド.NewRowを使用し、新しい行の領域 を確保する ⇒GOALRowが新しい領域 • その領域の”商品CD”列に”合計”を代入す る • 続けて、”金額”列に、合計を代入する • 「データ行の追加」を使用し、格納する DataTable(GOALDT)に、新しい行の領 域を追加する 5. 「合計」を、DataTableにデータ行を追加する  スクリーンショットは横着して、「TEMPDT」、 「小計」のものを流用(^^♪  アニメーションも省略(^^♪

Slide 57

Slide 57 text

DataTableを、CSVファイル、EXCELファイルにする

Slide 58

Slide 58 text

まとめ

Slide 59

Slide 59 text

• 入力のレイアウト、列内の値の属性(UNIQUEか?)などをしっかり 把握出来ていれば、どう処理すればいいか、検討がしやすくなる。 ⇒「データテーブルの結合」など • DataTable型の扱い方をしっかり把握出来ていれば、どう処理すれば いいか、検討がしやすくなる。 ⇒「データテーブルのフィルタ」「データテーブルの並び替え」など • 但し、その処理の方法に正解はなく、データの件数、ロボの拡張性、 開発者の癖によってアプローチは異なる。 ⇒List型を使うか、Dictionary型を使うか…など まとめ