業務効率化

VBA:Google翻訳関数

エクセルVBAによる翻訳関数のマクロです。対象文字列を指定し、第二引数に言語を指定することで翻訳ができます。第二引数はオプショナルとしており、もし第二引数がない場合は自動で和英訳するようにしています。※現在はワークシート関数でTranslate関数が正式に導入されたようでこの関数の存在意義が消えかかっています。今後はCopilot関数が導入だとかWhat's New in Excel (June 2025) | Microsoft Community Hub

記事の内容

・コード

・ポイント機能

コード

翻訳関数は下記サイトでのマクロを参考にさせていただきました。

【VBAマクロダウンロード】Excel関数でセルを自動翻訳|GoogleTranslate関数をMicrosoft Officeで利用する方法 | 個人DX/RPA 業務の自動化の教科書|ゆるけみ

➤コードはこちら
Option Explicit

Public Function Gootrans_DefJPandEn(rng As Range, Optional translateFrom As String, Optional translateTo As String) As String
'Dim translateFrom As String, translateTo As String
                        
    '変数設定
    Dim param As String, trans As String, url As String
    
    'HTTPリクエストの設定
    Dim objHTTP As Object
    Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
    
    'セルの値を取得
    param = rng.Value
    
    If translateFrom = "" Or translateTo = "" Then
    
    If IsJPTexts(param) Then
        translateFrom = "ja"
        translateTo = "en"
    Else
        translateFrom = "en"
        translateTo = "ja"
    End If
    
    End If
    
    
    
    'HTTPリクエストのURL設定
    url = "https://translate.google.pl/m?hl=" & translateFrom & "&sl=" & translateFrom & "&tl=" & translateTo & "&ie=UTF-8&prev=_m&q=" & EncodeURL(param)
    
    'HTTPリクエスト
    objHTTP.Open "GET", url, False
    objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
    objHTTP.send ("")
    
    'HTTPリクエストのレスポンステキストを取得
    Dim oHtml As New MSHTML.HTMLDocument
    Set oHtml = New MSHTML.HTMLDocument
    oHtml.body.innerHTML = objHTTP.responseText
    
    '翻訳結果を取得
    Dim transtext As String
    transtext = oHtml.getElementsByClassName("result-container")(0).innerText
    
    '翻訳結果があればClean関数を実行、なければエラー出力
    If transtext <> "" Then
        Gootrans_DefJPandEn = Clean(transtext)
    Else
        Gootrans_DefJPandEn = CVErr(xlErrValue)
    End If

End Function

'翻訳前のテキストのエンコード用に変換
Function ConvertToGet(str As String)

    str = Replace(str, " ", "+")
    str = Replace(str, vbNewLine, "+")
    str = Replace(str, "(", "%28")
    str = Replace(str, ")", "%29")
    
    ConvertToGet = str

End Function

'翻訳後のテキスト内の文言を変換
Function Clean(str As String)

    'str = Replace(str, """, """")
    str = Replace(str, "%2C", ",")
    str = Replace(str, "'", "'")
    
    Clean = str

End Function

'日本語をURLエンコード
Function EncodeURL(ByVal str As String) As String
    EncodeURL = Application.WorksheetFunction.EncodeURL(str)
End Function

'関数の説明
Sub RegisterGoogleTransleFormula()

    '関数名の設定
    Dim strFunc As String
    strFunc = "Gootrans_DefJpAndEn"
    
    '関数の説明
    Dim strDesc As String
    strDesc = "Gootrans_DefJpAndEn関数" & vbNewLine & vbNewLine & _
    "英語から日本語に翻訳したい場合、Gootrans_DefJpAndEn(A1,""en"",""ja"")" & vbNewLine & vbNewLine & _
    "日本語から英語に翻訳したい場合、Gootrans_DefJpAndEn(A1,""ja"",""en"")" & vbNewLine & vbNewLine & _
    "他の言語を使いたい場合は: https://cloud.google.com/translate/docs/languages/" & vbNewLine & "   "

    '関数内の引数の説明
    Dim strArgs(0 To 2) As String
    strArgs(0) = "翻訳したいセルを選択"
    strArgs(1) = "現在の言語を入力(ex. 英語はen,日本語はja)"
    strArgs(2) = "翻訳したい言語を入力(ex. 英語はen,日本語はja)他:中国語簡体:zh-CN, マレー語:ms,韓国語:ko"
    
    Application.MacroOptions Macro:=strFunc, Description:=strDesc, ArgumentDescriptions:=strArgs, Category:="Custom Category"

End Sub

Option Explicit

Public Function Gootrans_DefJPandEn(rng As Range, Optional translateFrom As String, Optional translateTo As String) As String
'Dim translateFrom As String, translateTo As String
                        
    '変数設定
    Dim param As String, trans As String, url As String
    
    'HTTPリクエストの設定
    Dim objHTTP As Object
    Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
    
    'セルの値を取得
    param = rng.Value
    
    If translateFrom = "" Or translateTo = "" Then
    
    If IsJPTexts(param) Then
        translateFrom = "ja"
        translateTo = "en"
    Else
        translateFrom = "en"
        translateTo = "ja"
    End If
    
    End If
    
    
    
    'HTTPリクエストのURL設定
    url = "https://translate.google.pl/m?hl=" & translateFrom & "&sl=" & translateFrom & "&tl=" & translateTo & "&ie=UTF-8&prev=_m&q=" & EncodeURL(param)
    
    'HTTPリクエスト
    objHTTP.Open "GET", url, False
    objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
    objHTTP.send ("")
    
    'HTTPリクエストのレスポンステキストを取得
    Dim oHtml As New MSHTML.HTMLDocument
    Set oHtml = New MSHTML.HTMLDocument
    oHtml.body.innerHTML = objHTTP.responseText
    
    '翻訳結果を取得
    Dim transtext As String
    transtext = oHtml.getElementsByClassName("result-container")(0).innerText
    
    '翻訳結果があればClean関数を実行、なければエラー出力
    If transtext <> "" Then
        Gootrans_DefJPandEn = Clean(transtext)
    Else
        Gootrans_DefJPandEn = CVErr(xlErrValue)
    End If

End Function

'翻訳前のテキストのエンコード用に変換
Function ConvertToGet(str As String)

    str = Replace(str, " ", "+")
    str = Replace(str, vbNewLine, "+")
    str = Replace(str, "(", "%28")
    str = Replace(str, ")", "%29")
    
    ConvertToGet = str

End Function

'翻訳後のテキスト内の文言を変換
Function Clean(str As String)

    'str = Replace(str, """, """")
    str = Replace(str, "%2C", ",")
    str = Replace(str, "'", "'")
    
    Clean = str

End Function

'日本語をURLエンコード
Function EncodeURL(ByVal str As String) As String
    EncodeURL = Application.WorksheetFunction.EncodeURL(str)
End Function

'関数の説明
Sub RegisterGoogleTransleFormula()

    '関数名の設定
    Dim strFunc As String
    strFunc = "Gootrans_DefJpAndEn"
    
    '関数の説明
    Dim strDesc As String
    strDesc = "Gootrans_DefJpAndEn関数" & vbNewLine & vbNewLine & _
    "英語から日本語に翻訳したい場合、Gootrans_DefJpAndEn(A1,""en"",""ja"")" & vbNewLine & vbNewLine & _
    "日本語から英語に翻訳したい場合、Gootrans_DefJpAndEn(A1,""ja"",""en"")" & vbNewLine & vbNewLine & _
    "他の言語を使いたい場合は: https://cloud.google.com/translate/docs/languages/" & vbNewLine & "   "

    '関数内の引数の説明
    Dim strArgs(0 To 2) As String
    strArgs(0) = "翻訳したいセルを選択"
    strArgs(1) = "現在の言語を入力(ex. 英語はen,日本語はja)"
    strArgs(2) = "翻訳したい言語を入力(ex. 英語はen,日本語はja)他:中国語簡体:zh-CN, マレー語:ms,韓国語:ko"
    
    Application.MacroOptions Macro:=strFunc, Description:=strDesc, ArgumentDescriptions:=strArgs, Category:="Custom Category"

End Sub

下記表示が出る場合はAlt+F11を押し、下記標準モジュール2つを自身のマクロブックにドラッグアンドドロップしてください。

ポイント機能

・Optionalによる自動和英判定

・引数への指定言語

Optionalによる自動和英判定

関数では引数に翻訳元言語と、翻訳対象言語を設定します。これはoptionalで指定しなくても設定が可能です。設定しない場合は、IsJP関数により、対象文での日本語の割合に応じて和英判定がされます。

和文の定義は、「ひらがな、全角カタカナ、半角カタカナ、日本語の漢字、句読点(。、)を含めた文章が全体の内半数以上の場合」

としています。

全角/半角のひらがな、カタカナ、漢字が入っている場合は日本語と判定して英訳、それ以外は英訳するようになっています。句読点等の記号でも日本語の判定は可能ですが、全角コロン「:」などの記号は日本語になってしまい、例えば英語の文でも記号が入っていると和文と認識してしまうため、和文判定基準からは除外しています。

関数は2つあり、

①日本語の割合から和文を判断する関数と、

②日本語の量を数える関数です。①から②を呼び出し、①で割合を計算し和英判断をしています。

②では引数を受け取り、標準表現Regexを使用することで和文を数えます。

Regexの使用では参照設定で事前バインディングを行います。これをすることでピリオドを押すとIntelliSenseが機能し入力しやすくなります。

Regex(正規表現)とは、特定のパターンに一致する文字列を検索・置換・抽出するための表記法です。プログラミングやデータ処理で広く使用されます。数値や日本語など様々な文字は正規表現を使うことでより細かく、包括的に操作することが可能です。

例えば日本語であれば、平仮名などの其々の形態ごとに正規表現があり、簡単に操作が可能です。

  • ひらがな[ぁ-ゖ]
  • カタカナ(全角)[ァ-ヶ]
  • カタカナ(半角)[ヲ-゚]
  • 漢字[々〇〻\u3400-\u9FFF\uF900-\uFAFF]

Regexを使った文字カウントでは基本的なスクリプトが決まっています。オブジェクト変数にRegexを割り当て、Patternに対象にしたい文字や記号を指定、IgnoreCaseで大文字小文字区別するかを指定し、Globalで対象の文字列すべてを検索するか、最初に見つけるまでとするかを設定します。今回は、ひらがな~句読点まで日本語に現れ、英語には表れない表現を指定し、IgnoreCace、GlobalをTrueにしたことで、大文字に関係なく、対象文章からすべての日本語を捜査対象にしています。

上記条件での該当がどれくらいあるかは、Countメソッドで取得できます。変数matchesに上記のRegexをexecute(引数)を設定し、捜査実施後、Countをすることで指定文字列の数を取得できます。

引数への言語指定

Google翻訳では、翻訳元言語と翻訳対象言語の二つを指定し、翻訳をしています。今回の関数では、第1引数に翻訳元の言語を、第2因数に翻訳先の言語を設定します。

翻訳後の設定は二文字で行います。これはISO 639-1という国際標準の枠組みの一つで定められています。全世界で共通のルールの下で世界中の言語を数文字のアルファベットで表している標準です。これ以外にも複数の標準が存在します。

日本語であればjp、英語であればenとその言語の英語表記から代表的となる文字を組み合わせて文字が表現されます。すべてが2文字というわけではなく、同じ言語でも国によって異なる場合は数文字増えて識別されます。例えば中国語で言っても下記表記法があります。

言語表記言語
zh中国語
zh-CN *中国語(簡体字)
zh-TW *中国語(繁体字)
言語表記の一例

MS公式Translate関数、代替翻訳マクロ

これまでエクセルでの翻訳は、他アプリから或いは、校閲タブにある翻訳機能を使うしかありませんでした。そこで翻訳関数作成の意味があったわけですが公式からTranslate関数が導入されました。TRANSLATE 関数 - Microsoft サポート

公式関数ならではの便利さがあり、使用時には第一引数と第二引数に何を入れるかの候補が表示され、非常にユーザーフレンドリーな機能となっています。今マクロの完全上位互換と言えます。ただ、2025年9月25日らへんで使用した際には、引数候補がうまく作動しなかったり、busyマークのまま翻訳できない時がありました。

そんなときのため、アドインとして今マクロを登録しておくのも多少は役に立つかもしれません。また、Translate関数はマイクロソフトの一部プランのみ現状利用可能のため、他のマクロに翻訳機能を付けたい場合はこのマクロが役立ちます。

他の代替翻訳方法としては、APIによるAI使用、Web操作できるSeleniumVBAがあります。ChatGPT返答取得関数、SeleniumVBAによるGoogle翻訳/Copilot返答取得関数マクロを参考に紹介します。

Translate関数その他代替案使用要件等
Copilot返答取得関数マクロ有料MS Copilotプランが必要
ChatGPT返答取得関数ChatGPT会員登録しAPI用トークン購入が必要
SeleniumVBAによるGoogle翻訳無料だが、ブラウザ側のHTML要素変更時は手動で更新必要

応用例:シート一括和英訳マクロ

翻訳関数を使用したアクティブシートを一括で自動和英訳するマクロです。Translate関数はプロシージャでのWorksheetFunctionでは扱えないため、今マクロ関数が利用できます。

-業務効率化