前回の記事で紹介した各スライドに配置されたオートシェイプからテキストを取得するPowerPointマクロと以前紹介したGoogle翻訳で文字列を翻訳するマクロを組み合わせて、スライド内容を自動的に機械翻訳するマクロを作ってみます。
Option Explicit Public Sub Sample() Dim sld As PowerPoint.Slide Dim shp As PowerPoint.Shape Dim gshps As PowerPoint.GroupShapes Dim tmpsld As PowerPoint.Slide Dim tmpvt As PowerPoint.PpViewType If Application.SlideShowWindows.Count > 0& Then Exit Sub tmpvt = Application.ActiveWindow.ViewType Application.ActiveWindow.ViewType = ppViewNormal Set tmpsld = Application.ActivePresentation.Slides.FindBySlideID _ (Application.ActivePresentation.Windows(1).Selection.SlideRange.SlideID) For Each sld In Application.ActivePresentation.Slides For Each shp In sld.Shapes Set gshps = Nothing On Error Resume Next Set gshps = shp.GroupItems On Error GoTo 0 If gshps Is Nothing Then SortShape shp Else SortGroupShape gshps End If Next Next tmpsld.Select Application.ActiveWindow.ViewType = tmpvt Debug.Print "処理が終了しました。" End Sub Private Sub SortGroupShape(ByVal gshps As PowerPoint.GroupShapes) 'グループ化されたシェイプの振り分け Dim shp As PowerPoint.Shape Dim subgshps As PowerPoint.GroupShapes For Each shp In gshps Set subgshps = Nothing On Error Resume Next Set subgshps = shp.GroupItems On Error GoTo 0 If subgshps Is Nothing Then SortShape shp Else SortGroupShape subgshps End If Next End Sub Private Sub SortShape(ByVal shp As PowerPoint.Shape) 'シェイプの振り分け Dim n As Office.SmartArtNode Dim clm As PowerPoint.Column Dim c As PowerPoint.Cell Select Case shp.Type Case msoSmartArt For Each n In shp.SmartArt.Nodes If n.TextFrame2.HasText = True Then MainProcSmartArtNode n Next Case msoTable For Each clm In shp.Table.Columns For Each c In clm.Cells If c.Shape.TextFrame.HasText = True Then MainProcShape c.Shape Next Next Case Else If shp.TextFrame.HasText = True Then MainProcShape shp End Select End Sub Private Sub MainProcShape(ByRef shp As PowerPoint.Shape) shp.TextFrame.TextRange.Text = TranslateGoogle(shp.TextFrame.TextRange.Text, "ja", "en") End Sub Private Sub MainProcSmartArtNode(ByRef nd As Office.SmartArtNode) nd.TextFrame2.TextRange.Text = TranslateGoogle(nd.TextFrame2.TextRange.Text, "ja", "en") 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" On Error Resume Next 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 On Error GoTo 0 End With End If TranslateGoogle = 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
コード自体は上記記事中のマクロをほぼそのまま流用しているだけです。
また、グラフについては処理が複雑になるので今回は無視しました。
上記コードを実行すると下図のような日本語のスライドが、
自動的に翻訳が行われすぐに英語のスライドへと変更されます。
翻訳はすべてGoogle翻訳に依存しているため、同サービスが使用できなくなると上記マクロも利用することができなくなります。
半ば無理やり処理を行っているため、上記コードを業務用やその他重要なマクロの中に実装することはお薦めしません(翻訳精度についても私は一切保証しません)。
あくまでも、こういったことも一応できる、という参考程度に留めておいてください。
この記事へのコメントはありません。