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

添付の上の画像のデータ(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で整数化して、これを合算しています。

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

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