「Google翻訳で文字列を翻訳するマクロ」ではGoogle翻訳を利用したマクロについて書きましたが、今回はGoogleではなくYahoo!翻訳を利用したマクロを作成してみました。
Option Explicit
Public Sub Sample()
Dim target As String
Dim ret As String
'テスト用文字列は http://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88 より
target = "マイクロソフト(Microsoft Corporation)は、アメリカ合衆国に本社を置く世界最大のコンピュータ・ソフトウェア会社。" & vbCrLf
target = target & "現在ではインターネット事業を手がけ、スマートフォン、ハードウェア、ゲーム機器も製造している。" & vbCrLf
target = target & "1975年4月4日にビル・ゲイツとポール・アレンらによって設立された。"
ret = TranslateYahoo(target, "ja", "zh") '日本語から中国語
If Len(ret) > 0 Then
CreateObject("WScript.Shell").Popup ret
End If
End Sub
Private Function TranslateYahoo(ByVal target As String, Optional ByVal FromLng As String = "auto", Optional ByVal ToLng As String = "en") As String
Dim dat As Variant
Dim js As String
Dim ret As String
Dim url As String
Dim crumb As String
Dim itm As Object
Dim cnt As Long
Dim ResultSet, ResultText, Results, key, TranslatedText '表示用ダミー
'********************************************************************
'■ 対応する言語(引数FromLng,ToLng) http://honyaku.yahoo.co.jp/ より
' 自動検出:auto(FromLngのみ)
' 日本語:ja
' 英語:en
' 中国語:zh
' 韓国語:ko
' フランス語:fr
' ドイツ語:de
' スペイン語:es
' ポルトガル語:pt
' イタリア語:it
'********************************************************************
ret = "" '初期化
'文字数チェック(4,000文字まで)
If Len(target) >= 4000 Then
MsgBox "翻訳対象の文字数が多過ぎます。" & vbCrLf & "翻訳可能な文字数は4,000文字までです。", vbExclamation + vbSystemModal
GoTo Err:
End If
'対応言語チェック
FromLng = LCase$(FromLng)
Select Case FromLng
Case "auto"
FromLng = GetPredictLanguage(target)
If Len(Trim$(FromLng)) < 1 Then
MsgBox "翻訳元言語の自動判定に失敗しました。" & vbCrLf & "処理を中止します。", vbCritical + vbSystemModal
GoTo Err:
End If
Case "en", "zh", "ko", "fr", "de", "es", "pt", "it", "ja"
Case Else
MsgBox "未対応の翻訳元言語です。", vbCritical + vbSystemModal
GoTo Err:
End Select
ToLng = LCase$(ToLng)
Select Case ToLng
Case "en", "zh", "ko", "fr", "de", "es", "pt", "it", "ja"
Case Else
MsgBox "未対応の翻訳先言語です。", vbCritical + vbSystemModal
GoTo Err:
End Select
crumb = "" '初期化
crumb = GetCrumb()
If Len(Trim$(crumb)) < 1 Then
MsgBox "crumbの取得に失敗しました。" & vbCrLf & "処理を中止します。", vbCritical + vbSystemModal
GoTo Err:
End If
js = "": cnt = 1 '初期化
url = "http://honyaku.yahoo.co.jp/TranslationText"
dat = "ieid=" & FromLng & "&oeid=" & ToLng & "&output=json&_crumb=" & crumb & "&p=" & EncodeURL(target)
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
If .Status = 200 Then js = .responseText
End With
On Error GoTo 0
If Len(js) > 0 Then
js = "(" & js & ")"
With CreateObject("ScriptControl")
.Language = "JScript"
For Each itm In .CodeObject.eval(js).ResultSet.ResultText.Results
If cnt = 1 Then
ret = ret & itm.TranslatedText
Else
ret = ret & vbCrLf & itm.TranslatedText
End If
cnt = cnt + 1
Next
End With
End If
Err:
TranslateYahoo = ret
End Function
Private Function GetCrumb() As String
'TTcrumbの値取得
Dim ret As String
Dim crumb As String
Dim v As Variant
crumb = "" '初期化
On Error Resume Next
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "http://honyaku.yahoo.co.jp/transtext/", False
.Send
If .Status = 200 Then ret = .responseText
End With
On Error GoTo 0
If Len(ret) > 0 Then
With CreateObject("VBScript.RegExp")
.IgnoreCase = True
.Global = True
.Pattern = "id=""TTcrumb"".*(?=""/>)"
If .Test(ret) Then
v = Split(.Execute(ret)(0), """")
crumb = v(UBound(v))
End If
End With
End If
GetCrumb = crumb
End Function
Private Function GetPredictLanguage(ByVal target As String)
'言語自動判定結果取得
Dim d As Object
Dim ret As String
Dim url As String
ret = "": Set d = Nothing '初期化
'url="http://honyaku.yahoo.co.jp/LangClassifyService/V1/predict_prob?output=json&query="
url = "http://honyaku.yahoo.co.jp/LangClassifyService/V1/predict_prob?query=" & EncodeURL(target)
On Error Resume Next
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", url, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.Send
If .Status = 200 Then Set d = .responseXML
End With
If Not d Is Nothing Then
ret = d.SelectSingleNode("/ResultSet/Predict").Text
End If
On Error GoTo 0
GetPredictLanguage = ret
End Function
Private Function EncodeURL(ByVal sWord As String) As String
With CreateObject("ScriptControl")
.Language = "JScript"
EncodeURL = .CodeObject.encodeURIComponent(sWord)
End With
End Function
翻訳対象の文字列と元の言語、翻訳する言語を引数として渡すと、Yahoo!翻訳で翻訳した結果を返すマクロとなっています。

















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