こんにちは、blueです。
前回まではExcel文書についてDeepL APIを用いた翻訳を行っていました。
前回までの記事はこちら
今回はWord内の文章についてDeepL APIを用いた翻訳を行います。
この記事を読めば
- DeepL APIを用いて日本語と英語を併記したWord文書を作成できる
ようになります。
筆者は日本語、英語文書についてwebAPI、スクレイピングを用いた翻訳を日々行っています。
VBAを使って効率よく英語文書を読みたいはぜひ参考にしてください。
(以下は筆者がWebAPIに関して最初に書いた記事です。まだWebAPIを使われたことがない方はこちらから読んでいただけると理解しやすくなると思います)
pythonですが会話形式で非常にわかりやすく書かれている書籍です。webAPIやスクレイピングを一から理解できる内容になっています。筆者はこれでWeb APIを勉強しました。
今回の流れ
Word翻訳における今回の流れは以下になります。
- Wordファイルを選択し、開く
- 各段落を取得し、翻訳する
- 原文のあとに改行して翻訳文を付ける
- ファイル名の先頭に(JP-EN)を付けて保存する
今回は英語の文章に日本語文を併記するようにします。
最終的なイメージは以下になります(BeforeとAfter 赤枠が翻訳文)
次から実際のコードについて説明します。
サンプルコード
サンプルコードは以下になります。
なおコード実行中は画面がフリーズしたようになります。
これは複数回のリクエストの処理をしているだけなので待つようにしてください。
Sub WordTranlsation()
Dim FileName As String
Dim wb As Workbook
'Wordファイルを選択する
FileName = Application.GetOpenFilename(FileFilter:="Wordファイル,*.doc*")
If FileName = "False" Then
Exit Sub
End If
'Wordファイルを開く
Dim wd As Word.Application
Dim doc As Document
Set wd = New Word.Application
wd.Visible = True
Set doc = wd.Documents.Open(FileName, False, True)
Dim par As Paragraph
Dim SourceSentense As String '原文
Dim TranslatedSentense As String '翻訳文
'各段落を取得し、翻訳する
For Each par In doc.Paragraphs
SourceSentense = par.Range.Text
If SourceSentense <> Chr(13) Then '改段落のみは処理しない
TranslatedSentense = getTranslation(SourceSentense)
TranslatedSentense = Replace(TranslatedSentense, vbCrLf, "") 'Deeplの場合翻訳文にvbCrLfが含まれている為削除
'段落の末尾に翻訳文を追加する
doc.Range(0, par.Range.End - 1).InsertAfter (vbVerticalTab & TranslatedSentense)
End If
Next
Application.DisplayAlerts = False
doc.SaveAs2 doc.Path & "\(JP-EN)" & Dir(FileName)
Application.DisplayAlerts = True
End Sub
Function getTranslation(ByVal SourceSentense As String) As String
'DeepLで取得したkey
Const APIkey As String = "取得したAPIキー"
Dim http As MSXML2.XMLHTTP60
Set http = New MSXML2.XMLHTTP60
With http
'HTTPリクエスト(POSTメソッド)
Call .Open("POST", "https://api-free.deepl.com/v2/translate?text=" & SourceSentense & "&source_lang=EN&target_lang=JA")
Call .setRequestHeader("Authorization", "DeepL-Auth-Key " & APIkey)
Call .send
Do
If .readyState = 4 Then Exit Do
DoEvents
Loop
'HTTPレスポンスの内容確認
'*成功時:{Res="status":200, "message":"ok"}
'Debug.Print .responseText
'Debug.Print .Status
'ダブルクォーテーションで区切って配列として取得
Dim buf As Variant
Dim TranslatedSentense As String
buf = Split(http.responseText, """")
getTranslation = buf(9)
'Debug.Print TranslatedSentense
End With
End Function
今回のコードは以下の2つで構成されています。
- Sub WordTranslation・・・メインコード
- Function getTranslation・・・DeepL APIを用いた翻訳コード
それぞれについて概略を説明します。
ちなみにWord文書を操作する際は「Microsoft Word 16.0 Object Libray」の参照設定が必要になります。あらかじめ行っておいてください。
Sub WordTranslation
FileName = Application.GetOpenFilename(FileFilter:="Wordファイル,*.doc*")
まずユーザーにファイルを選択させます。
今回はApplication.GetFileNameメソッドを使っていますが、ここについてはFileSystemObject(FSO)でも構いません。
FSOに関する記事はこちら
'各段落を取得し、翻訳する
For Each par In doc.Paragraphs
SourceSentense = par.Range.Text
If SourceSentense <> Chr(13) Then '改段落のみは処理しない
TranslatedSentense = getTranslation(SourceSentense)
TranslatedSentense = Replace(TranslatedSentense, vbCrLf, "") 'Deeplの場合翻訳文にvbCrLfが含まれている為削除
Word文書内の各段落についてテキストを取得しています(par.Range.Textの部分)
その後取得したテキストをgetTranlation関数に渡しています。
doc.Range(0, par.Range.End - 1).InsertAfter (vbVerticalTab & TranslatedSentense)
各段落の最終文字(改段落)の前の一つ前に「改行+翻訳文」を入れています。
ちなみにWordでの改段落、改行は以下を示しています。
doc.SaveAs2 doc.Path & "\(JP-EN)" & Dir(FileName)
最後にファイル名に(JP-EN)をつけて保存しています。
Function getTranslation
翻訳のコードは以下の「日本語から英語に翻訳する際のサンプルコード」とほぼ同じです。
違いは以下です。
- Functionプロシージャ―にしている
- 原文は英語の為Encodeはしていない
- source_langをEN, target_langをJAとしている
日本語を英語に翻訳する場合は2.3に考慮して修正すればOKです。
今回のまとめ
今回はDeepL APIを使ったWord内の文章の翻訳について説明しました。
このコードを使えば、Word文書を日英併記にすることが可能です(DeepL APIへの登録はもちろん必要です)。
ただ使いこなすにはAPIの知識を付けることがさらに重要です。
以下の記事では「Web APIの基礎」についてわかりやすく解説しているのでこちらの記事も是非合わせて読んでみてください。
「APIは自分には難しい」という方には「Seleniumを使ったDeepLでの文章の翻訳」についても解説しています。こちらの記事も併せて読んでみてください。
APIを勉強するには書籍を使うのもおすすめです。VBAでAPIを扱った書籍はなかなかありませんが以下の書籍はAPIを勉強できる初歩的な書籍になっているので是非ご検討ください。
pythonですが会話形式で非常にわかりやすく書かれている書籍です。webAPIやスクレイピングを一から理解できる内容になっています。筆者はこれでWeb APIを勉強しました。
Selenium-VBAでのWebスクレイピングに関する記事はこちらをどうぞ
Web-APIを用いたデータ取得に関する記事はこちらをどうぞ
Web-APIを用いたデータ取得に関する記事はこちらをどうぞ
【VBA】Web APIを使ってデータを取得する(OpenWeatherMap)1
【VBA】Web APIを使って時間別天気予報を取得する(気象庁API)
【VBA】Web APIを使ってLINE通知を行う(LINE Notify)1
【API-VBA】Web APIを使って翻訳をする(DeepL API)
コメント