データテーブルのデータ行を削除したい

データテーブルを繰り返し処理で検索して検索結果がなければそのデータ行を削除したいのですが、エラーが出てしまいます。
解決方法を教えてください。

ループ中にデータテーブルの行を削除するとエラーが発生する理由 :rotating_light:

データテーブルを For Each Row などで繰り返し処理中に行を削除すると、データテーブルの構造が変更されるため、処理中のインデックスがずれてエラーが発生します。
これは 「ループ中にデータを削除すると、参照しているインデックスが変わるため、正しく処理できなくなる」 というプログラミングの一般的なルールによるものです。


:white_check_mark: 解決策

ループ中に直接削除するのではなく、削除対象の行を記憶して、後で削除するのが安全な方法です。

:one: 削除対象の行番号をリストに記録する
For Each Row in DataTable で条件に合致する行の RowIndex をリストに追加

:two: 記憶したリストを繰り返し処理し、行を削除する
For Each を使い、Remove Data Row で記憶した行を削除


この方法なら、データテーブルの構造を変更する前に削除対象を確定できるため、安全に行の削除が可能です! :bulb:

1 Like

こんにちは。

基本的には @takehiro.ichikura 様の書かれているとおりの考え方で大丈夫だと思います。

あるいは今回提示のケースに限れば、繰り返しに入る前に
「データテーブルをフィルター」で削除対象のデータ行を消してしまうのも手かもしれませんね。

ご回答ありがとうございます。
どのアクテビティを使えばよいかが分からず、
お手数ですがアクテビティ名称を教えてもらえますでしょうか。 :man_bowing:

こんにちは

実現したいことは2つのDataTableのマッチングかと思いますので、方法はいろいろあるのですが、LINQ使った例をアップしておきます。(他にもDataTableをJoinする方法等も考えられます)

Sample20250130-2.zip (16.2 KB)

繰り返し処理の中で検索して見つからなかった行のインデックスをリストに入れて、
その後、別の繰り返し処理の中で行を削除しようとしましたがエラーになりました。。

1 Like

こんにちは

DeleteListはList<Int32>で作成しておけば、整数を格納できますので
そのようにした方が良いと思います。また追加すべきはCurrentIndexです。

その上でReverseメソッド等このリストを逆順にした上で
繰り返しアクティビティでCurrentNumberを行削除アクティビティの行インデックスに直接指定できると思います。

ご回答ありがとうございます。
アドバイスいただいた箇所を修正しました。
リストはInt32型にし、リストに追加するのはCurrentIndexにしました。

データテーブルの行を削除する前にリストを並び替える方法が分かりません。。
申し訳ありませんがご教示お願いいたします。

InvokeMethodを以下の様に使用します。

ありがとうございます。
エラーが出てしまいました。。パラメータを設定する必要ありますか??



変数の型があっていないですね。

変数パネルで型は List<Int32> を定義して

最初の方に、代入アクティビティで

deleteList = New List(Of Int32)()

としてみてください。(この場合、リスト作成アクティビティは不要です)

ありがとうございます。エラー消えました。
最後に下図の黄色の行インデックスには何を入れればよいでしょうか?

currentXXXXが自動生成されていると思うので、それを入力ください。
あわせて繰り返しアクティビティの型がInt32になっていることも確認ください。

ありがとうございます。currentNumberですね。

データ行を削除アクテビティに入れましたが、なぜか削除できていないみたいなので、これから原因考えます。。

解決しました!
最後までご指導いただきありがとうございました。 :laughing:

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