データテーブルをフィルターして特定の列の値を一括更新したい

いつもお世話になっております。

以下画像のようなデータテーブルがある場合、条件として以下の内容を実装したいと考えております。
「「No」が重複していて「状況」が空欄、または【待ち】が記載されていて締切日が空欄の場合、「結果」に【未定】を入力する」
このように複数条件がある場合のフィルター等の処理について実装方法がわからないので教えていただきたいです。
宜しくお願い致します。


test.xlsx (10.1 KB)

@vgmadtg

Try this linq query in invoke code and send dt as in/out argument and send the same dt as dt1 as only in argument

dt.AsEnumerable.ToList.ForEach(sub(r) r("Result") = If((dt1.AsEnumerable.Where(function(x) x("No").Tostring.Equals(r("No").ToString).Count>1 And String.IsNullOrEmpty(r("Status").ToString)) OrElse (r("Status").ToString.Equals("Waiting") And String.IsNullOrEmpty(r("Deadline").ToString)),"Undefined",""))

Cheers

1 Like

Hi @vgmadtg

Can you try the below

Code:

For Each row As DataRow In dtInput.Rows
        Dim noValue As String = row("No").ToString()
        Dim statusValue As String = row("Status").ToString()
        Dim deadlineValue As String = row("Deadline").ToString()

        If (dtInput.Select("No = '" & noValue & "'").Length > 1 AndAlso String.IsNullOrEmpty(statusValue)) OrElse (statusValue = "Waiting" AndAlso String.IsNullOrEmpty(deadlineValue)) Then
            row("Result") = "Undecided"
        End If
Next

Output:

image

Regards,

1 Like

こんにちは

これはNoが重複していなければ、何も記入しないという理解であっていますでしょうか?
この場合重複のカウントをするためにグルーピング等が必要になりますので少々複雑になります。
例えば以下のようになります

dt.AsEnumerable.GroupBy(Function(r) r("No").ToString).Where(Function(g) g.Count>1).SelectMany(Function(g) g).Where(Function(r) r("状況") IsNot Nothing AndAlso (String.IsNullOrEmpty(r("状況").ToString) OrElse r("状況").ToString="待ち")).ToList.ForEach(Sub(r)
r("結果")="未定"
End Sub
)

Sample20240610-1.zip (17.5 KB)

1 Like

ご返信ありがとうございます。
いつもお世話になってあります。

はい。誤認識の通り、Noの重複がない場合は何も記入はしないようにしたいです。
教えていただきありがとうございます。
早速試してみます。

@Yoichi さん

すみません、理解不足で申し訳ないのですがコードを見ると「締切日が空欄の場合」に関する記載がないのですが記載されていなくても考慮されている、ということでしょうか?

すみません。抜けていますね。
以下は元のデータにいくつかケースを追加しましたが、期待する結果は下記であっていますでしょうか?

image

そうであれば以下お試しください

dt.AsEnumerable.GroupBy(Function(r) r("No").ToString).Where(Function(g) g.Count>1).SelectMany(Function(g) g).Where(Function(r) r("状況") IsNot Nothing AndAlso (String.IsNullOrEmpty(r("状況").ToString) OrElse r("状況").ToString="待ち") AndAlso (r("締切日") Is Nothing OrElse  String.IsNullOrEmpty(r("締切日").ToString))).ToList.ForEach(Sub(r)
    r("結果")="未定"
End Sub
)

Sample20240610-1 (2).zip (17.7 KB)

@Yoichi さん
教えていただきありがとうございます。
実行後に気付いたのですが自分の希望していた処理ではないものを依頼しておりました…大変申し訳ございません…

実際に処理したい希望内容は
①データテーブル内に「「No」が重複していて、「状況」が空欄、または【待ち】が記載されていて締切日が空欄、のデータを上から検索する」

②この条件に合致した「No」でフィルターをかけて、その行に対して「結果」に【未定】を入力する。

という処理を実装したいと考えています。さらに複雑にさせてしまい、大変申し訳ございません。
②に関しましては条件等は関係なく、①で取得した「No」に対して「結果」を更新する、というものになります。

もしよろしければこちらの処理方法も教えていただきたいです。
宜しくお願い致します。

「未定」と記入する条件が少々わかりにくいですが、

「No」でグルーピングした複数行に対して、
1行でも(「状態」が”待ち”または空欄)かつ「締切日」が空欄
の行があれば、グルーピングした行のすべての「結果」欄を「未定」にする

であっていますでしょうか?

@Yoichi さん
ご返信ありがとうございます。

はい。ご認識の通りでございます!

以下いかがでしょうか?

dt.AsEnumerable.GroupBy(Function(r) r("No").ToString).Where(Function(g) g.Count>1 AndAlso g.Where(Function(r) r("状況") IsNot Nothing AndAlso (String.IsNullOrEmpty(r("状況").ToString) OrElse r("状況").ToString="待ち") AndAlso (r("締切日") Is Nothing OrElse  String.IsNullOrEmpty(r("締切日").ToString))).Count>0 ).SelectMany(Function(g) g).ToList.ForEach(Sub(r)
    r("結果")="未定"
End Sub
)

Sample
Sample20240610-1 (3).zip (17.7 KB)

@Yoichi さん
教えていただきありがとうございます!
無事出力されるのが確認できました!

本当にありがとうございます…

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.