Word

GoogleとYahoo!で同時に翻訳するWordマクロ

Google翻訳で文字列を翻訳するマクロ」と「Yahoo!翻訳で文字列を翻訳するマクロ」の2つを利用して、Google翻訳とYahoo!翻訳で同時に翻訳を行うWordマクロを作成してみました。
結果は新しい文書に表示されます。

※ 下記マクロはGoogle翻訳とYahoo!翻訳の仕様に依存します。急な仕様変更によって下記マクロが動作しなくなる可能性がありますので、その点はご注意ください。

Option Explicit

Public Sub Sample()
  Dim s As String
  
  'テスト用文字列は http://ja.wikipedia.org/wiki/Microsoft より
  s = "当初は世に登場して間もない8ビットのマイクロプロセッサを搭載したコンピュータ「アルテア (Altair)」上で動く、BASICインタプリタの開発・販売で成功を収めた。" & vbCrLf
  s = s & "当初はネイティブ環境(カセットテープベースでオペレーティングシステムはなくROM-BASICに近い環境のもの)だったが、CP/Mが標準プラットフォームとなると、CP/MベースのMBASICを発表する。グラフィックス機能をつけたGBASIC、16ビット用のGWBASICが登場する。なお、GWのWは16ビットを意味するダブルバイト/ワードだとされている。" & vbCrLf
  s = s & "ついでIBM PC上のオペレーティングシステムの開発を請け負い、シアトルコンピュータプロダクツの86-DOSの権利を購入し改良、PC DOS(自社ブランドでMS-DOS)を開発。IBM PCとそれら互換機の普及と共にオペレーティングシステムの需要も伸び、現在に至る地固めを確かなものとした。86-DOSの開発者ティム・パターソンは後にマイクロソフトに引き抜かれMS-DOSの開発メインスタッフとなる。"
  
  CompareTranslateWebService s '日本語から英語
  CreateObject("WScript.Shell").Popup "処理が終了しました。", , , 64
End Sub

Private Sub CompareTranslateWebService(ByVal target As String, Optional ByVal FromLng As String = "ja", Optional ByVal ToLng As String = "en")
'翻訳結果を比較
  Dim wapp As Object
  Dim doc1 As Object, doc2 As Object
  Dim ret As String
  Const Cap1 As String = "■ Yahoo!翻訳結果"
  Const Cap2 As String = "■ Google翻訳結果"
  
  '実行前チェック(Yahoo!翻訳に合わせる)
  '文字数チェック(4,000文字まで)
  If Len(target) >= 4000 Then
    MsgBox "翻訳対象の文字数が多過ぎます。" & vbCrLf & "翻訳可能な文字数は4,000文字までです。", vbExclamation + vbSystemModal
    Exit Sub
  End If
  '対応言語チェック
  FromLng = LCase$(FromLng)
  Select Case FromLng
    Case "en", "zh", "ko", "fr", "de", "es", "pt", "it", "ja"
    Case Else
      MsgBox "未対応の翻訳元言語です。", vbCritical + vbSystemModal
      Exit Sub
  End Select
  ToLng = LCase$(ToLng)
  Select Case ToLng
    Case "en", "zh", "ko", "fr", "de", "es", "pt", "it", "ja"
    Case Else
      MsgBox "未対応の翻訳先言語です。", vbCritical + vbSystemModal
      Exit Sub
  End Select
  
  '結果表示用Word起動
  Set wapp = CreateObject("Word.Application")
  wapp.Visible = True
  
  'Yahoo!翻訳実行
  ret = TranslateYahoo(target, FromLng, ToLng)
  Set doc1 = wapp.Documents.Add
  doc1.Range.InsertAfter Cap1 & vbCrLf & vbCrLf
  With doc1.Range(0, Len(Cap1)).Font
    .Size = 12
    .Bold = True
  End With
  doc1.Range.InsertAfter ret
  
  'Google翻訳実行
  '中国語パラメータ対応
  Select Case FromLng
    Case "zh": FromLng = "zh-CN"
  End Select
  Select Case ToLng
    Case "zh": ToLng = "zh-CN"
  End Select
  ret = "" '初期化
  ret = TranslateGoogle(target, FromLng, ToLng)
  Set doc2 = wapp.Documents.Add
  doc2.Range.InsertAfter Cap2 & vbCrLf & vbCrLf
  With doc2.Range(0, Len(Cap2)).Font
    .Size = 12
    .Bold = True
  End With
  doc2.Range.InsertAfter ret
    
  '結果を並べて表示
  wapp.Windows.Arrange wdTiled
  wapp.WindowState = wdWindowStateMinimize
  wapp.WindowState = wdWindowStateNormal
End Sub

Private Function TranslateGoogle(ByVal target As String, Optional ByVal FromLng As String = "auto", Optional ByVal ToLng As String = "en") As String
  Dim dat As Variant
  Dim ret As String
  Dim js As String
  Dim itm As Object
  Dim cnt As Long
  Dim sentences, length '小文字表示用ダミー
  Const url As String = "http://translate.google.com/translate_a/t"
  
  ret = "": js = "": cnt = 1 '初期化
  dat = "client=0&sl=" & FromLng & "&tl=" & ToLng & "&text=" & 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"
      'Debug.Print .CodeObject.eval(js).sentences.length
      For Each itm In .CodeObject.eval(js).sentences
        If cnt = 1 Then
          ret = ret & itm.trans
        Else
          ret = ret & vbCrLf & itm.trans
        End If
        cnt = cnt + 1
      Next
    End With
  End If
  TranslateGoogle = ret
End Function

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 '表示用ダミー
  
  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 & 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!翻訳で文字列を翻訳するマクロ前のページ

プログラムのソースコードを別の言語に変換するVBAマクロ次のページ

関連記事

  1. Office関連

    「個人用テンプレートの既定の場所」を設定するWordマクロ

    前回の記事で、Word 2013で個人用テンプレート(カスタム テンプ…

  2. Office関連

    PowerShellからNetOfficeを使ってWordやPowerPointを操作する方法

    前回の記事関連で、WordやPowerPointもドンとこいで…

  3. Office関連

    選択範囲内にある特定のフォントの文字列を別のフォントに置き換えるWordマクロ

    選択範囲内で「MS ゴシック」が使われている文字列のフォントを「MS …

  4. Office関連

    ページごとにPNG形式で出力するWordマクロ(Word 2013)

    ※ この情報はOffice 2013 カスタマー プレビュー版を元にし…

  5. Google関連

    Gmail APIを使ってメール送信するC#コード

    「たまには.NET用のライブラリを使ってGoogle APIでも触って…

  6. Office関連

    文書内の単語を単語ごとにカウントするWordマクロ

    Wordsコレクションを使って文書内の単語を列挙し、各単語がそれぞれい…

コメント

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

  1. この記事へのトラックバックはありません。

Time limit is exhausted. Please reload CAPTCHA.

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

Translate

最近の記事

アーカイブ

PAGE TOP