transk’s 翻訳ブログ

翻訳がらみの情報など

Python で win32com を使って Excel の重複行を削除する

前に作った .mxliff ファイルを Excel ファイルに出力するプログラムで

transk.hatenablog.com

同じ内容のセグメントが複数出力されていたので

何度も同じ文を見直さなくてはいけなくて

これは重複する行を削除しないと

効率が悪いなと思って

プログラムに機能追加することにした。

 

Excel で .xlsx ファイルを開くと

[データ] > [重複の削除] というメニューがあって

そこで重複行を削除できるようだ。

f:id:transk:20211205185419j:plain

Excel 自体にその機能があるんだから

win32com でもあるんじゃないかなと思って

とりあえず、Excel でその操作をマクロに記録してみた。

ActiveSheet.Range("$A$1:$F$1000").RemoveDuplicates Columns:=Array(1, 2), _
Header:=xlNo

 

RemoveDuplicates というのが win32com にあれば

それを使うことができるが

ネットで検索してもあまりヒットしない。

PythonExcel の重複行を削除する」と検索すると

Excel ファイルを pandas で読み込んで

drop_duplicates で削除して

Excel ファイルに書き戻すという記事があって

それだと確実にできそうだが

pandas に全部読み込んで Excel ファイルに書き戻すというのが

ちょっと無駄な感じがしたので

win32com のほうをコーディングしてみた。

ws.Range("A:F").RemoveDuplicates Columns:=Array(1, 2), Header:=xlNo

 

実行すると Columns でエラーになる。

この書き方は Python じゃないな。

かっこで囲んでみた。

ws.Range("A:F").RemoveDuplicates(Columns:=Array(1, 2), Header:=xlNo)

 

Columns は通ったが

今度は Array でエラーになる。

単純に取ってしまえばいいかなと思って

ws.Range("A:F").RemoveDuplicates(Columns:=(1, 2), Header:=xlNo)

 

としたら正常に実行されてしまった。

xlno はすでに定義してあった(値は 2 で、範囲全体を対象とする)。

わりとあっさりできてしまった。

 

これで重複した行を何度もチェックする必要がなくなった。

ソースとターゲットの両方で重複を確認しているので

同じ文を違う訳し方にしているところは維持される。