Power Automate Desktop(以下PAD)では、Excelのシートをデータテーブルとして読み込み、重複行を除いてからシートに書き戻すことで、重複を削除できます。
このとき見落としやすい点が2つあります。
- 古いデータを消さずに書き戻すと、シートの下のほうに元の行が残る
- 何件消えたかを記録しないと、正しく動いたか判断できない
この記事では、この2点を組み込んだフローを順番に組み立てます。
PADのアクション名や置き場所は、バージョンによって変わることがあります。アクションが見つからないときは、アクションウィンドウの検索欄にキーワード(「重複」「ワークシート」など)を入れて探してください。
フロー全体の流れ
| 順番 | アクション | 役割 |
|---|---|---|
| 1 | Excel の起動 | 対象のブックを開く |
| 2 | Excel ワークシートから読み取る | シートの内容をデータテーブルに入れる |
| 3 | 変数の設定 | 削除前の行数を記録する |
| 4 | データ テーブルから重複する行を削除する | 重複行を除く |
| 5 | 変数の設定 | 削除後の行数を記録する |
| 6 | 古いデータの消去 | 書き戻す前に元の行を消す |
| 7 | Excel ワークシートに書き込む | 結果をシートに書き戻す |
| 8 | Excel を閉じる | 別名で保存して閉じる |
準備: 元ファイルと表の形を確認する
フローを動かす前に、次の点を確認します。
- 元ファイルのコピーを取る: 最初は必ずコピーで試します。保存も、元ファイルの上書きではなく別名にします
- 見出しが1行目に1行だけある: A1から表が始まり、見出しの上にタイトル行などがない
- 途中に空行や結合セルがない: 読み取りの範囲がずれる原因になります
- 数式の列がない: 書き戻すと、数式は計算結果の値に置き換わります。数式を残したい列がある場合、このフローは向きません
- 対象のブックを手作業で開いていない: 開いたままだと、フローが別のExcelを起動したり、保存に失敗したりすることがあります
手順1: Excelを起動してシートを読み取る
- 「Excel の起動」を追加し、「次のドキュメントを開く」を選んで、対象ファイルのパスを指定する。生成される変数は
%ExcelInstance%のままでかまいません - 対象のシートが最初に表示されるシートでない場合は、「アクティブな Excel ワークシートの設定」でシート名を指定する
- 「Excel ワークシートから読み取る」を追加し、次のように設定する
- 取得: 「ワークシートに含まれる使用可能なすべての値」
- 詳細: 「範囲の最初の行に列名が含まれています」をオンにする
- 生成される変数:
%ExcelData%
「範囲の最初の行に列名が含まれています」をオフにすると、見出し行もデータの1行として扱われます。件数が1件ずれ、書き戻したときに見出しの位置も変わるため、オンにしておきます。
詳細設定には「セルの内容をテキストとして取得」という項目もあります。オンとオフで、日付や先頭が0のコードの読み取り方が変わります。どちらを選んだ場合も、書き戻した後に日付・コード・金額の表示が変わっていないかを確認してください。
手順2: 削除前の行数を記録する
「変数の設定」を追加し、次のように設定します。
- 変数:
%BeforeCount% - 値:
%ExcelData.RowsCount%
RowsCount はデータテーブルの行数です。列名ありで読み取っている場合、見出し行は数えられません。
手順3: 重複行を削除する
「変数」グループの中の「データ テーブル」にある「データ テーブルから重複する行を削除する」を追加し、対象のデータテーブルに %ExcelData% を指定します。
このアクションは、すべての列の値が一致する行を重複とみなします。お使いのバージョンで判定する列を指定できるかどうかは、アクションの設定画面で確認してください。すべての列が一致する行同士であれば、どれが残っても内容は変わりません。
アクションの設定画面に「生成された変数」がある場合は、結果がその変数に入ります。その場合は、以降の手順で %ExcelData% の代わりにその変数を使ってください。
続けて、もう一度「変数の設定」を追加します。
- 変数:
%AfterCount% - 値: 重複を除いた後のデータテーブルの
RowsCount(例:%ExcelData.RowsCount%)
全角と半角の違いや、末尾の見えない空白がある行は、別の値として扱われます。消えるはずの行が残る場合は、元のシートでその値に違いがないか確認してください。
特定の列だけで重複を判定したい場合
「顧客IDが同じなら、ほかの列が違っても重複とみなす」のように列を絞って判定したい場合は、ループで重複している行を見つけて削除します。考え方は次のとおりです。
- 「変数の設定」で
%SeenKeys%に|を入れる(一度出てきたキーを記録しておくテキスト) - 「新しいリストの作成」で
%DeleteIndexes%を作る(削除する行の番号を入れるリスト) - 「Loop」で
%LoopIndex%を0から%ExcelData.RowsCount - 1%まで1ずつ増やす- 「変数の設定」で
%Key%に%ExcelData[LoopIndex]['顧客ID']%を入れる - 「If」で
%SeenKeys%が|%Key%|を含むかを判定する- 含む場合: 「項目をリストに追加」で
%LoopIndex%を%DeleteIndexes%に追加する - 含まない場合: 「変数の設定」で
%SeenKeys%に%SeenKeys%%Key%|を入れる
- 含む場合: 「項目をリストに追加」で
- 「変数の設定」で
- 「リストを逆にする」で
%DeleteIndexes%を後ろから並べ直す - 「For each」で
%DeleteIndexes%の番号を順に取り出し、「データ テーブルから行を削除する」でその番号の行を削除する
この方法では、最初に出てきた行が残ります。後ろの行から削除するのは、前の行を先に消すと、それより後ろの行番号が1つずつずれてしまうためです。
区切りに使う | が、キーの値の中に含まれていないことを確認してください。「含む」の判定で大文字と小文字を区別するかどうかは、Ifアクションの設定で確認します。数千行程度までは扱えますが、行数が多いと時間がかかります。この方法は、10行程度のサンプルで、想定どおりの行が残ることを確かめてから使ってください。
手順4: 書き戻す前に古いデータを消す
ここが一番の注意点です。元が120行あり、重複を除いて100行になった場合、そのまま2行目から書き込むと、上の100行は新しいデータで上書きされます。しかし102〜121行目には元のデータが残ったままになります。結果として、重複行がシートに戻ってしまいます。
対処の方法は2つあります。
方法A: 別のシートに書き出す(最初の数回はこちらがおすすめ)
「新しいワークシートの追加」で 重複削除後 のようなシートを作り、そこに書き込みます。元のシートには手を付けないため、結果を見比べてから元のシートに反映するかを決められます。
方法B: 元のシートのデータ部分を消してから書き込む
- 「Excel ワークシートから最初の空の列や行を取得」を追加し、
%FirstFreeColumn%と%FirstFreeRow%を取得する(手順1の読み取りの直後に置くと、元の範囲を確実につかめます) - データ部分を消去する。新しいバージョンでは「Excel ワークシート内のセルをクリアする」のようなアクションで範囲を指定できます。範囲は、開始を1列目・2行目、終了を
%FirstFreeColumn - 1%列目・%FirstFreeRow - 1%行目にします
見出し行(1行目)は消さずに残します。消去用のアクションが見当たらない場合は、方法Aで運用するか、アクションウィンドウで「クリア」「削除」を検索して、範囲を指定できるアクションを探してください。
手順5: シートに書き込む
「Excel ワークシートに書き込む」を追加し、次のように設定します。
- 書き込む値:
%ExcelData% - 書き込みモード: 「指定したセル上」
- 列:
A(または1) - 行:
2
見出しは1行目に残っている前提で、2行目から書き込みます。初めて実行したときは、1行目と2行目に見出しが二重に入っていないかを必ず確認してください。
手順6: 件数を確かめて別名で保存する
「メッセージを表示」か「テキストをファイルに書き込む」で、件数を残します。
削除前: %BeforeCount% 件 / 削除後: %AfterCount% 件 / 削除: %BeforeCount - AfterCount% 件
毎回自動で実行するフローなら、ファイルに書き残しておくと、後から実行の履歴を追えます。
最後に「Excel を閉じる」を追加し、「名前を付けてドキュメントを保存」を選んで、元とは別のファイル名で保存します。
保存したファイルを開いて、次の点を確認します。
- データの行数が
%AfterCount%と一致するか(見出しを除いて数える) - 最終行より下に、古いデータが残っていないか
- 先頭が0のコード、日付、金額の表示が元と同じか
- 削除件数が0件のとき、本当に重複がなかったのか。空白や全角・半角の違いで別の値と判定されていないか
何度か実行して結果が安定してから、元ファイルを上書きする運用に切り替えるかを判断してください。
