データテーブルの集計方法について

添付の上の画像のデータ(Excelに格納)から社員ごとの日数を合計し、添付の下の画像のようなデータを作成したいと考えております。

作成手順としては下記をイメージしています。
・上の画像のデータ範囲をデータテーブルとして読み込み
・データテーブルをコピーして、重複部分を削除
・削除した部分を繰り返し処理して、各項目の合計を計算
・計算した結果を「日数」に反映し、下の画像のような表を完成させる

ただ、自分で試したところでは繰り返し処理する部分で「その項目の合計を計算する: 式に定義されていない関数呼び出し が含まれています。」と出てきてしまいます。
色々調べましたが手立てが見つからず、解決方法をご掲示いただければ助かります。

参考にしたサイトは下記になります。

(このサイトの n-shiumiさんがアップしたファイルを参考にしました)

よろしくお願いします。

画像1

画像2

HI @shima_m

以下で試すことができます。必要な列でグループ化し、最後の列を合計します

(From p In DT1.AsEnumerable()
Group p By
c1=p("Column1"),
c2=p("Column2")
Into Group
Select DT1.Rows.Add({c1,c2,Group.sum(Function(x) 
convert.ToInt32(x("Column3").ToString))})).CopyToDataTable

Thanks,
Prankur

ありがとうございます。
必要な列でグルーピング→最後の列を合計という考え方は理解できるのですが、社員番号(社員名と連動)は毎回変動しており、文字で指定するするのは難しいように思われます。

2つの画像のプロセスで、サンプルを提供することなどは可能でしょうか?

データを教えていただけませんか。その周りに何か書きます。

こんにちは

社員番号と社員名が必ず1:1で紐づいているなら、グルーピングの対象は社員番号だけでよいかと思います。

以下サンプルです。

img20220223-1

dt = dt.AsEnumerable.GroupBy(Function(r) r("社員番号").ToString).Select(Function(g) dt.Clone.LoadDataRow({g.Key,g.First().Item("社員名"),g.Sum(Function(r) Int32.Parse(r("日数").ToString))},False)).CopyToDataTable()

Sample20220223-1.zip (2.8 KB)

成功できました。
ありがとうございます!

代入部分の式として、下記の認識で大丈夫でしょうか?

①日数の集計方法は、社員番号を"GroupBy"でグルーピングすることで
同じ社員番号の行を"Enumerable"として合算する。

②Function部分のアルファベットは列名を定義するための機能であり、
どんな文字で代入しても問題はないか(画像だとr=社員番号、g=社員名?)。

③社員番号でグルーピングしたものを、Parseとして整数表示させSumとして
合算させる

④合算したものを、データテーブルにコピー

VB操作がまだまだ知識不足であり、申し訳ないです。。

こんにちは

上記はLINQによるものなので、慣れないうちは難しいと思います。

類似の投稿として以下もありますので、アルゴリズムを把握したい、かつLINQは厳しいようでしたら
Dictionaryの例を参考にいただくと良いかもしれません。

ちなみに

①日数の集計方法は、社員番号を"GroupBy"でグルーピングすることで
同じ社員番号の行を"Enumerable"として合算する。

社員番号でグルーピングして、キーを社員番号、それに紐づく要素(この場合DataRow)をシーケンスとして保持します。

②Function部分のアルファベットは列名を定義するための機能であり、
どんな文字で代入しても問題はないか(画像だとr=社員番号、g=社員名?)。

rやgは匿名変数です、変数名はどのようなものでも大丈夫ですが、一般的に型を類推しやすいものを
つけます。上記の場合、rはDataRow, gは System.Linq.IGrouping<TKey,TElement>
になります。

③社員番号でグルーピングしたものを、Parseとして整数表示させSumとして
合算させる

元の型が不明なので、一旦文字列かしてものを、Int32.Parseで整数化して、これを合算しています。

④合算したものを、データテーブルにコピー

2 Likes

ご回答ありがとうございます。
折を見て、Dictionaryの例でも試してみます。

Hi @shima_m

You can follow the below steps to achieve it,
→ Use the Read range workbook activity to read the excel and store in a datatable called dt_ExcelData.
→ Then use the assign activity and create a list of String datatype variable called List_UniqueValues. Then give the below expression,

- Assign -> dt_ExcelData.AsEnumerable.Select(Function(X) X("Value").ToString).Distinct.tolist()

→ After assign activity use the For each activity to iterate the each element in the List_UniqueValues.
→ Inside for each insert the for each row in datatable activity to iterate the each row in the dt_ExcelData.
→ Inside For each row in datatable activity insert the If activity and give the below condition,

- Condition -> (Not(List_ProcessedValues.Any(Function(X) X.ToString.Equals(CurrentRow("Value").ToString)))) AndAlso currentText.Equals(CurrentRow("Value").ToString)

→ Inside then block insert the Assign activity and give expressions as below,

- Assign -> CurrentRow("Total") = dt_ExcelData.AsEnumerable().Where(Function(X) X("Value").ToString() = currentText).Sum(Function(Y) cdbl(Y("Cost"))).ToString()

→ Create one more List of String datatype variable called List_ProcessedValues.
→ After assign activity use the Append items to collection activity to append items to List ‘List_ProcessedValues’.
→ After for each activity insert the Write range workbook activity to write the output datatable to excel.

Check the below workflow for better understanding,
Main.xaml (14.2 KB)

Input -

Output -

Note: Change the column names as required.

Hope it helps!!