範囲内の特定の文字列セルを別ファイルに書き出したい

お世話になっております。

範囲内の特定の文字列が含まれるセルの内容を別ファイルに順次書き出したいと考えております。
以下にケースの一例を示します。

①以下のような表を範囲選択し、その中から「りんご」の付くセルのみ全取得する
1

②別ブック、メモ帳等に1行ずつセル内容を転記する(順番はバラバラでも可)
2

検索アクティビティ等を使用してみましたが、最初のセル位置しか取得できないので上手くいきません。
繰り返し(各行)も試そうとしましたが、書いてある列がバラバラな上に、データ量によっては時間がかかってしまします。

条件に合致したセルの値のみ効率良く取り出せる方法がありましたら、ご教示よろしくお願いします。

こんにちは

やり方はいろいろあるかと思いますが、2案ほど

1.ReadRange + LINQ

範囲を読み込みアクティビティでDataTableとして取り込みます。(仮に dt とします。)

以下の式でList<String>として抽出します。

listStr = dt.AsEnumerable.SelectMany(Function(r) dt.Columns.Cast(Of DataColumn).Select(Function(c) if (r(c).ToString.StartsWith("りんご"),r(c).ToString,""))).Where(Function(x) not String.IsNullOrEmpty(x.toString)).ToList

2. 範囲選択+Copy + Matches

範囲選択でデータのある範囲を選択状態にして、SendHotKey(Ctrl+c)でコピーします。
クリップボードにデータが格納されるので、クリップボードから取得アクティビティで
文字列として取り込みます。
一致する文字列アクティビティを用い抽出します。
パターンは例えば、"りんご\S*" とします。(データにスペースが含まれる場合はパターンを変更する必要があります。)

1、2ともリストあるいはIEnumerableで抽出できていると思うので、あとはこの順に
セル書き込みかDataTableに反映して書き込めばよいと思います。

1 Like

Yoichi様

回答ありがとうございます。
実際のテストデータで1.の方法を試してみたのですが、目的のセルが取得できた一方、幾つかのセルが取得できませんでした…
未取得データを確認したところ、例えば「〇〇りんご」といったような特定ワード前に文字列が含まれているものが取得できませんでした。(Startswithの部分を変えようとしてみましたが上手くいきませんでした)
上記のような前後の文字列に左右されず、式を使用することは可能でしょうか?

こんにちは

StartsWithの代わりにContainsを使ってみてください。

listStr = dt.AsEnumerable.SelectMany(Function(r) dt.Columns.Cast(Of DataColumn).Select(Function(c) if (r(c).ToString.Contains("りんご"),r(c).ToString,""))).Where(Function(x) not String.IsNullOrEmpty(x.toString)).ToList
1 Like

Yoichi様

StartswithをContainに置き換える方法を試してみましたが、
全く関係のない位置のセルを1行ずつ取得する動作になってしまいました…
テストデータの方ではシートの移動を挟み、各シート毎に同じワードで検索するという処理を行っているのですが、その辺りも原因だったりするのでしょうか?

こんにちは

状況が正確に把握できないのですが、もし実際の式や、データ、ワークフロー、スクリーンショット等共有可能でしたら、共有いただけると良いかもしれません。

Yoichi様

デバッグで原因箇所を確認したところ、此方のミスでした。申し訳ありません。
原因としては、検索ワードをデータテーブルに格納して繰り返しを行っていた際に、取得したテーブル内に検索ワード以外(空白や"."等の必要のない項目)の行が混ざっており、そのワードで検索していた…というものでした。
不要なワードを除外することにより、無事に目的のセルのみ抽出することができました。

ありがとうございました。

1 Like

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