スポンサーリンク

【API-VBA】Web APIを使ってWord文書を翻訳をする(DeepL API)

VBAスクレイピング

こんにちは、blueです。

前回まではExcel文書についてDeepL APIを用いた翻訳を行っていました。

前回までの記事はこちら

今回はWord内の文章についてDeepL APIを用いた翻訳を行います

この記事を読めば

  • DeepL APIを用いて日本語と英語を併記したWord文書を作成できる

ようになります。

筆者は日本語、英語文書についてwebAPI、スクレイピングを用いた翻訳を日々行っています。

VBAを使って効率よく英語文書を読みたいはぜひ参考にしてください。

(以下は筆者がWebAPIに関して最初に書いた記事です。まだWebAPIを使われたことがない方はこちらから読んでいただけると理解しやすくなると思います)

pythonですが会話形式で非常にわかりやすく書かれている書籍です。webAPIやスクレイピングを一から理解できる内容になっています。筆者はこれでWeb APIを勉強しました。

スポンサーリンク

今回の流れ

Word翻訳における今回の流れは以下になります。

  1. Wordファイルを選択し、開く
  2. 各段落を取得し、翻訳する
  3. 原文のあとに改行して翻訳文を付ける
  4. ファイル名の先頭に(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

翻訳のコードは以下の「日本語から英語に翻訳する際のサンプルコード」とほぼ同じです。

違いは以下です。

  1. Functionプロシージャ―にしている
  2. 原文は英語の為Encodeはしていない
  3. 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を用いたデータ取得に関する記事はこちらをどうぞ

【VBA】Web APIを使ってデータを取得する(OpenWeatherMap)1
【VBA】Web APIを使って時間別天気予報を取得する(気象庁API)
【VBA】Web APIを使ってLINE通知を行う(LINE Notify)1
【API-VBA】Web APIを使って翻訳をする(DeepL API)

コメント

タイトルとURLをコピーしました