Office関連

Yahoo!翻訳で文字列を翻訳するマクロ

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!翻訳で翻訳した結果を返すマクロとなっています。

サジェスト機能を利用したWord用ツール前のページ

GoogleとYahoo!で同時に翻訳するWordマクロ次のページ

関連記事

  1. Office関連

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

    以前書いた記事で、Google翻訳を使って文字列を翻訳するマクロを紹介…

  2. Office アドイン

    [Office用アプリ]コピー&ペースト用マニフェストファイル

    Office 用アプリを作るとき、過去に作ったアプリのマニフェストファ…

  3. Excel

    Google TTSで文字列を読み上げるマクロ(言語自動検出対応版)

    2012/2/15 追記:下記マクロをExcel 2007/201…

  4. Office関連

    [Word VBA]ルビ(ふりがな)ダイアログの操作に挑む(2)

    2016/10/28 追記:改良版のマクロを書きました。…

  5. Office関連

    コンテンツコントロールに外部XMLのデータをマップするWordマクロ

    Word 2007で追加された機能「コンテンツコントロール」を使うと外…

  6. Office関連

    各ページを画像に変換するWordマクロ

    Excel MVPの伊藤さんがブログで、WordのPageオブジェクト…

コメント

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

  1. 2016年 7月 13日

Time limit is exhausted. Please reload CAPTCHA.

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

Translate

最近の記事

アーカイブ

PAGE TOP