Office関連

Microsoft Translator APIで文字列を翻訳するVBAマクロ

以前書いた記事で、Google翻訳を使って文字列を翻訳するマクロを紹介したのですが、仕様変更があったようで、もうこのマクロは使用できなくなっています。

有償のTranslate APIに切り替えれば、似たようなコードで処理できるだろうと思いますが、ここはGoogleにこだわらず、無償である程度使える「Microsoft Translator API」を使って文字列を翻訳するVBAマクロを作ってみたいと思います。

Azure Marketplaceでのアプリケーション登録

マクロからAPIを呼び出すにあたり、まずはMicrosoft Azure Marketplaceでアプリケーション登録を行う必要があります。

  1. Microsoft Azure Marketplace右上にある「サインイン」から「個人」を選択し、Microsoft アカウントでサインインします。Microsoft アカウントを持っていない場合は、「Microsoft アカウントの新規作成」からアカウントを新規登録しておきます。
  2. MicrosoftTranslatorAPI_VBA_01

  3. Azure Marketplaceの登録画面が表示されたら、氏名等の必要事項を入力し、「続行」ボタンをクリックします。
  4. MicrosoftTranslatorAPI_VBA_02

  5. 使用条件画面が表示されたら、内容を確認した上で「使用条件に同意します」にチェックを入れ、「登録」ボタンをクリックします。
  6. MicrosoftTranslatorAPI_VBA_03

  7. Azure Marketplaceへの登録が終わったら「Microsoft Translator」から、月額 ¥0の下にある「サインアップ」ボタンをクリックします(Microsoft Translatorは月間200万文字まで無償で利用できます)。
  8. MicrosoftTranslatorAPI_VBA_04

  9. サインアップ画面が表示されたら、公開元のオファーとプライバシー ポリシーを確認した後、「前述の公開元のオファー条件とプライバシー ポリシーを読み、内容に同意しました。」にチェックを入れ、「サインアップ」ボタンをクリックします。
  10. MicrosoftTranslatorAPI_VBA_05

  11. 「ありがとうございます」画面が表示されたらサインアップ完了です。
  12. MicrosoftTranslatorAPI_VBA_06

  13. Microsoft Translatorのサインアップが終わったら、Microsoft Azure Marketplaceの右下から「アプリケーションの登録」を開きます。
  14. MicrosoftTranslatorAPI_VBA_07

  15. アプリケーションの登録画面が表示されたら、各項目を入力し「作成」ボタンをクリックします。
    • クライアント ID:後述のAPI呼び出しに必要なものです。入力後はメモ帳などにコピーしておきます。
    • 名前:アプリケーション名です。
    • 顧客の秘密(クライアント シークレット):後述のAPI呼び出しに必要なものです。通常はデフォルトで表示されている文字列で良いでしょう。クライアント IDと同じく、メモ帳などにコピーしておきます。
    • リダイレクト URI:今回はVBAからの呼び出しを行う予定なので、「https://localhost/」などの適当なURIで問題ありません。
    • サブドメイン アクセスを有効にする:今回はチェックする必要はありません。
    • 説明:今回は特に入力する必要はありません。

    MicrosoftTranslatorAPI_VBA_08

以上で準備作業は終了です。

VBAからのMicrosoft Translator API呼び出し

クライアント IDとクライアント シークレットの準備ができたら、いよいよマクロからAPIを呼び出していきます。

APIを利用する手順はザックリ書くと下記の通りです。

https://datamarket.accesscontrol.windows.net/v2/OAuth2-13 に必要なパラメータを付けてPOSTします(Obtaining an Access Token参照)。

JSON形式で返ってきたレスポンスからアクセス トークンを取得します。

各APIのリクエストURIに、Authorizationヘッダーにアクセス トークンを付けて、リクエストを投げます。

帰ってきたレスポンスから必要なデータを取得・利用します。

詳細については、Microsoft Translator各メソッドの説明をご参照ください。

そして実際に書いたコードが下記になります。

※ クライアント IDとクライアント シークレットは上記手順で取得したものを入力してください。
※ 下記コードはScriptControlを使用しているため、64ビット版のOfficeでは使用できません。

Option Explicit

Public Sub Sample()
  Dim client_id As String
  Dim client_secret As String
  Dim source_str As String
  
  '********** 要変更 **********
  client_id = "(クライアント ID)"
  client_secret = "(クライアント シークレット)"
  source_str = "こんばんは。月が綺麗ですね。"
  '****************************
  
  With CreateObject("WScript.Shell")
    '日本語→英語
    .Popup TranslateStringMS(client_id, _
                             client_secret, _
                             source_str)
    '日本語→中国語(繁体字)
    .Popup TranslateStringMS(client_id, _
                             client_secret, _
                             source_str, _
                             "ja", _
                             "zh-CHT")
  End With
End Sub

Public Function TranslateStringMS(ByVal client_id As String, _
                                  ByVal client_secret As String, _
                                  ByVal source_str As String, _
                                  Optional ByVal from_lang As String = "ja", _
                                  Optional ByVal to_lang As String = "en")
'Microsoft Translator APIを使って文字列を翻訳
'利用可能な言語コードは https://msdn.microsoft.com/en-us/library/hh456380.aspx 参照
'※ ScriptControlを使用しているため、64ビット版Officeでは使用不可
  Dim url As String
  Dim access_token As String
  Dim ret As String
  Dim d As Object
  
  ret = "": Set d = Nothing '初期化
  access_token = GetAccessToken(client_id, client_secret)
  url = "http://api.microsofttranslator.com/v2/Http.svc/Translate" & _
        "?text=" & EncodeURL(source_str) & _
        "&from=" & from_lang & _
        "&to=" & to_lang
  On Error Resume Next
  If Len(Trim(access_token)) > 0 Then
    With CreateObject("MSXML2.XMLHTTP")
      .Open "GET", url, False
      .setRequestHeader "Content-Type", "application/x-www-form-urlencoded;charset=utf-8"
      .setRequestHeader "Authorization", "Bearer " & access_token
      .Send
      Select Case .Status
        Case 200: Set d = .responseXML
      End Select
    End With
    If Not d Is Nothing Then ret = d.Text
  End If
  On Error GoTo 0
  TranslateStringMS = ret
End Function

Private Function GetAccessToken(ByVal client_id As String, _
                                ByVal client_secret As String, _
                                Optional ByVal grant_type As String = "client_credentials", _
                                Optional ByVal scope As String = "http://api.microsofttranslator.com") As String
'アクセストークンを取得
  Dim url As String
  Dim js As String
  Dim ret As String
  Dim dat As Variant
  Dim access_token '表示用ダミー
  
  js = "": ret = "" '初期化
  client_id = EncodeURL(client_id)
  client_secret = EncodeURL(client_secret)
  url = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13"
  dat = "grant_type=" & grant_type & "&client_id=" & client_id & _
        "&client_secret=" & client_secret & "&scope=" & scope
  On Error Resume Next
  With CreateObject("MSXML2.XMLHTTP")
    .Open "POST", url, False
    .setRequestHeader "Content-Type", "application/x-www-form-urlencoded;charset=utf-8"
    .Send dat
    Select Case .Status
      Case 200: js = .responseText
    End Select
  End With
  If Len(Trim(js)) > 0 Then
    js = "(" & js & ")"
    With CreateObject("ScriptControl")
      .Language = "JScript"
      ret = .CodeObject.eval(js).access_token
    End With
  End If
  On Error GoTo 0
  GetAccessToken = ret
End Function

Private Function EncodeURL(ByVal str As String) As String
  With CreateObject("ScriptControl")
    .Language = "JScript"
    EncodeURL = .CodeObject.encodeURIComponent(str)
  End With
End Function

上記「Sample」を実行すると、問題が無ければ下図のようにメッセージボックスが表示されます。

MicrosoftTranslatorAPI_VBA_09

「TranslateStringMS」では、引数「from_lang」と「to_lang」で翻訳元の言語と翻訳先の言語を指定します。
ここで利用可能な言語コードについては、「Translator Language Codes」をご参照ください。

というわけで、今回はVBAからMicrosoft Translator APIを呼び出してみました。
本当は毎回毎回アクセス トークンを取得する必要は無いのですが、有効期限が切れたらトークンを取得しなおして・・・なんて処理は、面倒くさいので今回は省いています。

[Officeアドイン]図形挿入アドイン前のページ

Acrobat XIを操作してテキスト認識操作を行うVBAマクロ次のページ

関連記事

  1. アイコン一覧

    Office 365アイコン(imageMso)一覧(C)

    Office 365のデスクトップ版Officeアプリケーション(Wo…

  2. Office関連

    Microsoft Edgeを操作するVBAマクロ(WebDriver編)

    Microsoft Edge Dev Blogに「Bringing a…

  3. Office アドイン

    Office 365でVisio JavaScript APIsを試してみました。

    昨年末にVisio Onlineの機能をJavaScriptで拡張する…

  4. Office関連

    VALUE DOMAINで管理しているドメインをOffice 365で使用する。

    Office 365をセットアップすると設定される初期ドメイン「onm…

  5. Excel

    esp@cenetが公開しているPDF公報をダウンロードするVBAマクロ

    esp@cenet(Espacenet)が公開しているRESTfulな…

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP