shima_m
(Shima M)
February 22, 2022, 9:53am
#1
添付の上の画像のデータ(Excelに格納)から社員ごとの日数を合計し、添付の下の画像のようなデータを作成したいと考えております。
作成手順としては下記をイメージしています。
・上の画像のデータ範囲をデータテーブルとして読み込み
・データテーブルをコピーして、重複部分を削除
・削除した部分を繰り返し処理して、各項目の合計を計算
・計算した結果を「日数」に反映し、下の画像のような表を完成させる
ただ、自分で試したところでは繰り返し処理する部分で「その項目の合計を計算する: 式に定義されていない関数呼び出し が含まれています。」と出てきてしまいます。
色々調べましたが手立てが見つからず、解決方法をご掲示いただければ助かります。
参考にしたサイトは下記になります。
DataTable型の変数.Compute(”sum(カラム名)”, Nothing)
で列の合計を取得出来ます。
オブジェクト型で帰って来るので、string型で取得したい場合は
DataTable型の変数.Compute(”sum(カラム名)”, Nothing).toString
int型で取得したい場合は
Integer.Parse(DataTable型の変数.Compute(”sum(カラム名)”, Nothing).toString)
でとれます!
(このサイトの n-shiumiさんがアップしたファイルを参考にしました)
よろしくお願いします。
shima_m:
添付の上の画像のデータ(Excelに格納)から社員ごとの日数を合計し、添付の下の画像のようなデータを作成したいと考えております。
作成手順としては下記をイメージしています。
・上の画像のデータ範囲をデータテーブルとして読み込み
・データテーブルをコピーして、重複部分を削除
・削除した部分を繰り返し処理して、各項目の合計を計算
・計算した結果を「日数」に反映し、下の画像のような表を完成させる
ただ、自分で試したところでは繰り返し処理する部分で「その項目の合計を計算する: 式に定義されていない関数呼び出し が含まれています。」と出てきてしまいます。
色々調べましたが手立てが見つからず、解決方法をご掲示いただければ助かります。
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
shima_m
(Shima M)
February 23, 2022, 12:15am
#3
ありがとうございます。
必要な列でグルーピング→最後の列を合計という考え方は理解できるのですが、社員番号(社員名と連動)は毎回変動しており、文字で指定するするのは難しいように思われます。
2つの画像のプロセスで、サンプルを提供することなどは可能でしょうか?
データを教えていただけませんか。その周りに何か書きます。
Yoichi
(Yoichi)
February 23, 2022, 8:06am
#5
こんにちは
社員番号と社員名が必ず1: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)
shima_m
(Shima M)
February 24, 2022, 2:39am
#6
成功できました。
ありがとうございます!
代入部分の式として、下記の認識で大丈夫でしょうか?
①日数の集計方法は、社員番号を"GroupBy"でグルーピングすることで
同じ社員番号の行を"Enumerable"として合算する。
②Function部分のアルファベットは列名を定義するための機能であり、
どんな文字で代入しても問題はないか(画像だとr=社員番号、g=社員名?)。
③社員番号でグルーピングしたものを、Parseとして整数表示させSumとして
合算させる
④合算したものを、データテーブルにコピー
VB操作がまだまだ知識不足であり、申し訳ないです。。
Yoichi
(Yoichi)
February 24, 2022, 2:54am
#7
こんにちは
上記はLINQによるものなので、慣れないうちは難しいと思います。
類似の投稿として以下もありますので、アルゴリズムを把握したい、かつLINQは厳しいようでしたら
Dictionaryの例を参考にいただくと良いかもしれません。
こんにちは
いくつか方法が考えられますが、取り急ぎ2例ほど
LINQ GroupBy
[img20220212-2]
Dictionaryを使う方法
[img20220212-3]
ちなみに
①日数の集計方法は、社員番号を"GroupBy"でグルーピングすることで
同じ社員番号の行を"Enumerable"として合算する。
社員番号でグルーピングして、キーを社員番号、それに紐づく要素(この場合DataRow)をシーケンスとして保持します。
②Function部分のアルファベットは列名を定義するための機能であり、
どんな文字で代入しても問題はないか(画像だとr=社員番号、g=社員名?)。
rやgは匿名変数です、変数名はどのようなものでも大丈夫ですが、一般的に型を類推しやすいものを
つけます。上記の場合、rはDataRow, gは System.Linq.IGrouping<TKey,TElement>
になります。
③社員番号でグルーピングしたものを、Parseとして整数表示させSumとして
合算させる
元の型が不明なので、一旦文字列かしてものを、Int32.Parseで整数化して、これを合算しています。
④合算したものを、データテーブルにコピー
shima_m
(Shima M)
February 24, 2022, 8:29am
#8
ご回答ありがとうございます。
折を見て、Dictionaryの例でも試してみます。