DeepLで一括翻訳するアプリケーションをExcelだけで翻訳できるように技術的に工夫した点

### Simple Translator(外国語翻訳ツール)のページはこちら
https://qiita.com/generalfujiki/items/c2a6931f86a0513c6580

# 概要

以前、外国語の翻訳を一括(連続)で行う上記のアプリケーション(以下、翻訳ツール)を作りましたが、技術的に工夫した点を説明していなかったので新しく記事を作成しました。翻訳ツールを作っていくうちにどういうところを工夫したのかを以下に記載していきます。一種のポエムです。これからアプリケーションを作る人のヒントになるかどうか分かりませんが、自身がつまづいてしまったことに対して、具体的に技術的に工夫した点を以下に記載し、一つ一つを説明していきます。

# 技術的に工夫した点
- Excelだけあれば翻訳できるようにした
- バージョンが古いExcel(Excel 2010)で動くようにした
- Pythonを使わないようにした
- Internet Explorerを使わないようにした
- Selenium Basicを使わないようにした(他の方の力をお借りしました)
- Web Driverを自動更新するようにした(他の方の力をお借りしました)
- コピー＆ペースト、整形、翻訳の手順で最終結果を得られるようにした
- 最大5000文字に近い文字列ではなく短文の外国語を翻訳するようにした
- 翻訳文、原文の順序を変更できるようにした
- 翻訳結果をHTMLで表示されるようにした
- 翻訳先言語を指定できるようにした
- PDFをWordで開きテキストを取得できるようにした
- PDF論文の改行の問題が発生しないようにした
- テキストボックスに特許文献番号を入力することにより特許文献情報を取得できるようにした
- DeepLでの一括翻訳中に打ち切られないようにした
- プログレスバーを表示するようにした

## 環境面

### Excelだけあれば翻訳できるようにした

どこの職場でもMicrosoftのExcelはインストールされているので、Excelだけで翻訳ツールが動くようにしました。

### バージョンが古いExcel(Excel 2010)で動くようにした

翻訳ツールを動かす過程で原文をエンコードするのにワークシート関数「WorksheetFunction.EncodeURL」を使っていましたが、「WorksheetFunction.EncodeURL」はExcel 2010より新しいExcelでないと使えませんでした。古いExcelで動作させた場合、ワークシート関数「WorksheetFunction.EncodeURL」が存在しないためエラーが出てしまい、翻訳できませんでした。当初、Excel 2016、Excel 2019でしか使っていなかったため、古いExcelには対応しようと思いませんでしたが、古いExcelしか持っていない人は翻訳ができないことにガッカリしてしまうため、古いExcelにも対応した方が良いと思いました。幸い、Excel 2010を購入して持っていたので、Excelのバージョンを判定する関数を追加し、Excel 2010より新しいバージョンのExcelでは「WorksheetFunction.EncodeURL」でエンコードを行い、Excel 2010以前のバージョンのExcelでは「ScriptControl」クラスの「encodeURIComponent」でエンコードを行うようにしました。

### Pythonを使わないようにした

開発者の間ではPythonが流行っていますが、一般的な労働者はPythonを使える開発者だけに限りません。また、PythonをPCにインストールすることが制限されている職場が多いと思うので、Pythonを使わないでも動くツールにしました。

### Internet Explorerを使わないようにした

Excel VBAからInternet Explorerを呼び出してDeepLのサイトにアクセスして翻訳結果を取得できるようでしたが、Internet Explorerが使えなくなると聞いたので、Google ChromeとWeb Driverだけで動くように作りました。

### Selenium Basicを使わないようにした

以前はSelenium Basicを使用してWeb Driverを動かし一括(連続)でDeepL翻訳していました。しかし、Selenium Basicはインストールする必要があり、ソフトウエアのインストールに制限のある職場ではSelenium Basicが使えません。どうにかしてSelenium BasicをインストールしないでWeb Driverが使えないか困っていたところ、以下の記事を見つけました。こちらの「TinySeleniumVBA」を使用したところ、Selenium BasicをインストールせずにWeb Driverを動作させることができました。ありがとうございます。

https://qiita.com/uezo/items/66e20b064ffd5f239b9a

### Web Driverを自動更新するようにした

Web Driverが更新されると、更新されたWeb Driverをダウンロードして以前のWeb Driverを上書きしなければいけませんでした。Web Driverが更新されたときにユーザがWeb Driverを更新する作業は煩わしく面倒なので困っていたところ、以下の記事を見つけました。こちらの「WebDriverManager-for-VBA」を使用したところ、毎回Web Driverを更新するため、ユーザがWeb Driverを上書き更新する必要がなくなりました。ありがとうございます。

https://qiita.com/yamato1413/items/4b982aee46f28358fd39


## 操作面、機能面

### コピー＆ペースト、整形、翻訳の手順で最終結果を得られるようにした

一般的な労働者が行う操作として多いのはコピー＆ペーストやボタンを押す操作であり、コマンドを叩く操作ではありません。コマンドを叩かなくてもコピー＆ペーストとボタンを押すだけで処理が動くようにしました。コピー＆ペーストでExcelに貼り付けられたテキストを整形ボタンを押して整形し、手作業で間違っているテキストを編集し、翻訳ボタンを押せば翻訳処理が実行されるようにしました。

### 最大5000文字に近い文字列ではなく短文の外国語を翻訳するようにした

DeepLが最大5000文字を受け付けるからといって5000文字に近い文字まで翻訳させるのではなく、コピー＆ペーストで区切られる短文の外国語を翻訳するようにしました。あまりに長い文字列を翻訳すると誤訳が発生する確率が高くなります。短文であれば誤訳も少ないし、誤訳しても気づきやすいです。

### 翻訳文、原文の順序を変更できるようにした

Excelシートに貼り付けたテキストを翻訳した場合、隣の列に翻訳結果が表示されることがよくあります。例えば、A列に貼り付けてB列に出力することが多いです。ただ、どちらかというと翻訳結果である翻訳文は左側に表示され、原文は右側に表示されるのが良いと思ったので、好みで翻訳文と原文の順序を変更できるようにしました。

### 翻訳結果をHTMLで表示されるようにした

Excelシートに貼り付けたテキストを翻訳し、Excelのセルに結果を出力した場合にテキストが見切れることがあります。1つのセルに出力されるテキストが多くなり行の高さの最大値を超えると、テキストが見切れてしまいます。テキストが見切れたまま印刷するのは実用的ではないので、翻訳結果をHTML文書で表示するようにしました。HTML文書のテーブルに出力された文字は見切れることがなかったです。

### 翻訳先言語を選択できるようにした

Excelのセルに英語のテキストを貼り付けて翻訳するとき、言語選択コンボボックスで中国語を翻訳先として選べば、翻訳結果は中国語になります。Excelのセルに貼り付けた言語を日本語に翻訳することが多いと思いますが、他の言語に翻訳する必要もあるかもしれないので、DeepLで使える言語を翻訳先として選べるようにしました。ちなみに今現在DeepLが韓国語に対応していないので韓国語は選べません。

### PDFをWordで開きテキストを取得できるようにした

Word必須ですが、外国論文PDFを選択するとWordで開きテキストを取得してExcelのセルに表示するようにしました。外国論文PDFから取得したテキストは修正する箇所があることが多いので、手作業で誤字を修正、テキストの結合などを行った後、翻訳ボタンを押して翻訳処理を実行します。スキャンしたPDFからはテキストを取得できません。OCRなどでテキストをコピーできるようにして、コピーしたテキストをExcelのA2セルに貼り付けて整形して翻訳してください。詳しい使い方は以下の通りです。

https://qiita.com/generalfujiki/items/fa29c27d1f81fcb2b1be

### PDF論文の改行の問題が発生しないようにした

PDF論文をコピー＆ペーストすると余分な改行が入る問題があり、改行を取るためにアドレスバーにコピーした論文のテキストを再度コピーしなおしたり、ツールを使って改行を取るらしいです。本翻訳ツールでは「PDF選択」ボタンでPDFを選択すると、余計な改行が入らずに抽出されたテキストがExcelのセルに表示されます。空白セルは「整形」ボタンを押すことにより削除できます。

### テキストボックスに特許文献番号を入力することにより特許文献情報を取得できるようにした

需要の少ない特許文献情報を特許文献番号から取得できるようにしました。例えばテキストボックスに「US5255452A」を入力し検索ボタンを押し整形して翻訳してみてください。重力から解放されます。詳しい使い方は以下の通りです。

https://qiita.com/generalfujiki/items/70ba11adfbf8479cc169

## 処理面

### DeepLでの一括翻訳中に打ち切られないようにした

Web Driverのインスタンスを生成してDeepLのサイトで翻訳を繰り返すと、途中で接続が打ち切られ翻訳が途切れてしまうので、300秒ごとに生成したインスタンスを破棄し、新たにインスタンスを生成して続きからDeepLのサイトで翻訳を繰り返すようにしました。

### プログレスバーを表示するようにした

翻訳処理を行っているときに進捗が分からないのでプログレスバーで進捗を表示するようにし、キャンセルできるようにしました。キャンセルすると途中までの翻訳結果が表示されます。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 最後に実際の翻訳ツールに必要な環境と使い方を載せておきます。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
# 必要なもの

### OS

- Microsoft Windows 10 または Microsoft Windows 11

### ソフトウェア

- Google Chrome
- Microsoft Excel 2010、Microsoft Excel 2016、Microsoft Excel 2019（Excel 2013、Excel 2021 は未確認）
- Chrome Driver(自動で保存、更新されます)

# 使い方

- [Simple Translator の zip ファイル][b]← クリックしてダウンロードします。
- 上記 1.でダウンロードした zip ファイルを解凍し、SimpleTranslator フォルダ内の SimpleTranslator.xlsm を開きます。
- 言語選択コンボボックスを選択します。
   ![img001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110312/c2fa222e-510e-6d6f-6e9e-51c84925cac5.png)
- 翻訳先の言語を選択します。
   ![img002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110312/948e008f-2fde-c6df-1f85-02c537c75429.png)
- 表示順を「翻訳文 → 原文」「原文 → 翻訳文」のどちらにするかのラジオボタンを選択します。
   ![img003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110312/0248c380-ce11-1721-514b-326b33e05c0f.png)
- [サンプルページ][c]に表示された英文をマウスでなぞってコピーします。
   ![img004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110312/2fd6e7f0-2dc9-5b0c-03fd-6e8185791f96.png)
- Excel のシート A2 で右クリックし、「貼り付けのオプション」で左から 2 番目のアイコンを選びます。
   ![img005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110312/d5131623-3cf2-b319-7f8e-8a314045683d.png)
- 空白行を詰めるための「整形ボタン」を押します。
   ![img006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110312/dee4d9a2-62c3-6d6a-b5d9-512a510c6f0b.png)
- 「翻訳(HTML)ボタン」を押します。
   ![img007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110312/4afd3998-db45-b4dd-bded-7a284ff3497a.png)
- 「名前を付けて保存」ダイアログが表示されます。
   ![img008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110312/0bcd0938-129a-d208-337c-2fdf68bef0f1.png)
- 名前を入力し保存します。ここでは「sample」と入力し「保存ボタン」を押します。
   ![img009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110312/0cd85b82-4404-0842-8339-872a622d51df.png)
- 翻訳が開始され、プログレスバーが表示されるのでしばらく待ちます。
   ![img010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110312/138d4bf8-6014-312d-5045-cf24899e19fb.png)
- 翻訳が完成するとブラウザが立ち上がり翻訳結果が出力されます。
   ![img011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110312/dd0f6476-9a84-8d07-3223-c7965f7d8d06.png)
- 翻訳結果は HTML の形式でアプリケーションと同じ場所のディレクトリに作成されます。

[b]: https://github.com/masatofujiki/SimpleTranslator/archive/refs/tags/v1.3.1.zip
[c]: https://www3.nhk.or.jp/nhkworld/en/news/backstories/1622/