こんにちは、blueです。
前回まではコード上に記載した文章についてDeepL APIを用いた翻訳を行っていました。
前回までの記事はこちら
今回はExcel内の文章についてDeepL APIを用いた翻訳を行います。
この記事を読めば
- DeepL APIを用いて日本語と英語を併記したExcel文書を作成できる
ようになりますので、ぜひ読んでいってください。
(以下は筆者がWebAPIに関して最初に書いた記事です。まだWebAPIを使われたことがない方はこちらから読んでいただけると理解しやすくなると思います)
pythonですが会話形式で非常にわかりやすく書かれている書籍です。webAPIやスクレイピングを一から理解できる内容になっています。筆者はこれでWeb APIを勉強しました。
今回の流れ
Excel翻訳における今回の流れは以下になります。
- Excelファイルを選択し、開く
- シートをコピーし、シート内のセルを全取得する
- 取得したセルをすべて翻訳する
- 翻訳した内容をセルに全出力する
- 翻訳し終わったシート名の先頭に(JP-EN)を付ける
- ファイル名の先頭に(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
【VBA】SeleniumBasicにおけるクラス、メソッド、プロパティ一覧(日本語版)
Web-APIを用いたデータ取得に関する記事はこちらをどうぞ
【VBA】Web APIを使ってデータを取得する(OpenWeatherMap)1
【VBA】Web APIを使って時間別天気予報を取得する(気象庁API)
【VBA】Web APIを使ってLINE通知を行う(LINE Notify)1
コメント