スポンサーリンク

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

VBAスクレイピング

こんにちは、blueです。

前回まではコード上に記載した文章についてDeepL APIを用いた翻訳を行っていました。

前回までの記事はこちら

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

この記事を読めば

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

ようになりますので、ぜひ読んでいってください。

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

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

スポンサーリンク

今回の流れ

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

  1. Excelファイルを選択し、開く
  2. シートをコピーし、シート内のセルを全取得する
  3. 取得したセルをすべて翻訳する
  4. 翻訳した内容をセルに全出力する
  5. 翻訳し終わったシート名の先頭に(JP-EN)を付ける
  6. ファイル名の先頭に(JP-EN)を付けて保存する

今回は日本語のシート、翻訳されたシート両方が存在するようにしています。

最終的なイメージは以下になります。

クリックすると拡大します

やや誤訳はありますが、日本語のシートに対し英語のシートが追加されています。

次から実際のコードについて説明します。

サンプルコード

サンプルコードは以下になります。

なおコード実行中は画面がフリーズしたようになります。

これは複数回のリクエストの処理をしているだけなので待つようにしてください。

Sub ExcelTranlsation()

    Dim FileName As String
    Dim wb As Workbook
    
    'Excelファイルを選択する
    FileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xls*")
    If FileName = "False" Then
        Exit Sub
    End If
    
    'Excelファイルを開く
    Set wb = Workbooks.Open(FileName, False, True)
    
    Dim ws As Worksheet
    Dim i As Long
    Dim j As Long
    Dim rng As Variant  '二次元配列として取得
    Dim SourceSentense As String '原文
    Dim TranslatedSentense As String '翻訳文
    
    '各シートをコピーし、シート内のセルを翻訳する
    For Each ws In wb.Worksheets
        If Not ws.Name Like "JP-EN" Then
            ws.Copy After:=ws
            rng = ws.Range(ws.Cells(1, 1), ws.UsedRange)
            
            If IsArray(rng) = False Then 'rngが"A1"単一セルの場合は変数となる為配列にする必要あり
                ReDim rng(1, 1)
                rng(1, 1) = ws.Cells(1, 1).Value
            End If

            For j = 1 To UBound(rng, 2)
                For i = 1 To UBound(rng, 1)
                    If Not rng(i, j) = "" Then '空白の場合無視
                        SourceSentense = rng(i, j)
                        TranslatedSentense = getTranslation(SourceSentense)
                        rng(i, j) = TranslatedSentense
                    End If
                Next i
            Next j
            wb.Worksheets(ws.Index + 1).Cells(1, 1).Resize(UBound(rng, 1), UBound(rng, 2)).Value = rng
            wb.Worksheets(ws.Index + 1).Name = ws.Name & "(JP-EN)"
        End If
    Next
    
    Application.DisplayAlerts = False
    wb.SaveAs wb.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 key)"
    
     '日本語の場合を考慮してUTF-8にエンコードする
    SourceSentense = WorksheetFunction.EncodeURL(SourceSentense)
    
    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=JA&target_lang=EN")
        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 ExcelTranslation・・・メインコード
  • Function getTranslation・・・DeepL APIを用いた翻訳コード

それぞれについて概略を説明します。

Sub ExcelTranslation

FileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xls*")

まずユーザーにファイルを選択させます。

今回はApplication.GetFileNameメソッドを使っていますが、ここについてはFileSystemObject(FSO)でも構いません。

FSOに関する記事はこちら


If Not ws.Name Like "JP-EN" Then
            ws.Copy After:=ws
            rng = ws.Range(ws.Cells(1, 1), ws.UsedRange)

次にシートをコピーします。今回翻訳後のシートには(JP-EN)が入るようになっているので、(JP-EN)が入っていないシートのみコピーするようにします。

その後、シート内の使用しているセル範囲を二次元配列として格納します。

For j = 1 To UBound(rng, 2)
                For i = 1 To UBound(rng, 1)
                    If Not rng(i, j) = "" Then '空白の場合無視
                        SourceSentense = rng(i, j)
                        TranslatedSentense = getTranslation(SourceSentense)
                        rng(i, j) = TranslatedSentense
                    End If
                Next i
            Next j
            wb.Worksheets(ws.Index + 1).Cells(1, 1).Resize(UBound(rng, 1), UBound(rng, 2)).Value = rng

格納した二次元配列に対して、1セルずつ取り出し、getTranlation関数に渡しています。

その後翻訳された文字列を再度配列に格納しています。

最後に翻訳された二次元配列全体をシートに代入しています。


wb.SaveAs wb.Path & "\(JP-EN)" & Dir(FileName)


最後にファイル名に(JP-EN)をつけて保存しています。

Function getTranslation

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

違いはFunctionプロシージャ―にしているところで、翻訳元文章SourceSentenseを受け取ったうえで翻訳した文章を返すようにしています。

今回のまとめ

今回はDeepL APIを使ったExcel内の文章の翻訳について説明しました。

このコードを使えば、Excel文書を選択したうえで、自動的に日本語と英語が別々のシートで表記された翻訳文書を作れるようになります(DeepL APIへの登録はもちろん必要です)。

今後Wordを使ったものなども紹介しますのでぜひ参考にしてください。

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

Selenium-VBAでのWebスクレイピングに関する記事はこちらをどうぞ

【ExcelVBA‐Selenium】【永久保存版】スクレイピングに必要なSeleniumのインストール方法教えます
【Selenium-VBA】Yahooメールへのログイン方法をわかりやすく説明する
ChromeでのWebスレイピングをできる限りわかりやすく説明する(Excel VBA)
【ExcelVBA‐Selenium】Chrome driverのバージョンエラーが出た時の対処法(2021/10/7更新)
【Selenium-VBA】Seleniumを用いたスクレイピングでテーブル情報を取得する1
【Selenium-VBA】スクレイピングをするのに必要なHTMLについて説明します1
【Selenim-VBA】起動済みのChromeを用いてSeleniumによるスクレイピングを行う
【Selenium-VBA】JavaScriptを使ってスクレイピングをしてみる1
【Selenium-VBA】Seleniumにおける待機処理をわかりやすく説明します。
【Selenium-VBA】Seleniumにおけるアラート操作をわかりやすく説明します。
【VBA】SeleniumBasicにおけるクラス、メソッド、プロパティ一覧(日本語版)

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をコピーしました