以前書いた記事で、Google翻訳を使って文字列を翻訳するマクロを紹介したのですが、仕様変更があったようで、もうこのマクロは使用できなくなっています。
有償のTranslate APIに切り替えれば、似たようなコードで処理できるだろうと思いますが、ここはGoogleにこだわらず、無償である程度使える「Microsoft Translator API」を使って文字列を翻訳するVBAマクロを作ってみたいと思います。
Azure Marketplaceでのアプリケーション登録
マクロからAPIを呼び出すにあたり、まずはMicrosoft Azure Marketplaceでアプリケーション登録を行う必要があります。
- Microsoft Azure Marketplace右上にある「サインイン」から「個人」を選択し、Microsoft アカウントでサインインします。Microsoft アカウントを持っていない場合は、「Microsoft アカウントの新規作成」からアカウントを新規登録しておきます。
- Azure Marketplaceの登録画面が表示されたら、氏名等の必要事項を入力し、「続行」ボタンをクリックします。
- 使用条件画面が表示されたら、内容を確認した上で「使用条件に同意します」にチェックを入れ、「登録」ボタンをクリックします。
- Azure Marketplaceへの登録が終わったら「Microsoft Translator」から、月額 ¥0の下にある「サインアップ」ボタンをクリックします(Microsoft Translatorは月間200万文字まで無償で利用できます)。
- サインアップ画面が表示されたら、公開元のオファーとプライバシー ポリシーを確認した後、「前述の公開元のオファー条件とプライバシー ポリシーを読み、内容に同意しました。」にチェックを入れ、「サインアップ」ボタンをクリックします。
- 「ありがとうございます」画面が表示されたらサインアップ完了です。
- Microsoft Translatorのサインアップが終わったら、Microsoft Azure Marketplaceの右下から「アプリケーションの登録」を開きます。
- アプリケーションの登録画面が表示されたら、各項目を入力し「作成」ボタンをクリックします。
- クライアント ID:後述のAPI呼び出しに必要なものです。入力後はメモ帳などにコピーしておきます。
- 名前:アプリケーション名です。
- 顧客の秘密(クライアント シークレット):後述のAPI呼び出しに必要なものです。通常はデフォルトで表示されている文字列で良いでしょう。クライアント IDと同じく、メモ帳などにコピーしておきます。
- リダイレクト URI:今回はVBAからの呼び出しを行う予定なので、「https://localhost/」などの適当なURIで問題ありません。
- サブドメイン アクセスを有効にする:今回はチェックする必要はありません。
- 説明:今回は特に入力する必要はありません。







以上で準備作業は終了です。
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」を実行すると、問題が無ければ下図のようにメッセージボックスが表示されます。

「TranslateStringMS」では、引数「from_lang」と「to_lang」で翻訳元の言語と翻訳先の言語を指定します。
ここで利用可能な言語コードについては、「Translator Language Codes」をご参照ください。
というわけで、今回はVBAからMicrosoft Translator APIを呼び出してみました。
本当は毎回毎回アクセス トークンを取得する必要は無いのですが、有効期限が切れたらトークンを取得しなおして・・・なんて処理は、面倒くさいので今回は省いています。



















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