PowerPoint VBAでOLE埋め込みWordにルビを振る方法
概要
PowerPointに埋め込まれたWord文書にルビを振るには、PowerPointとWordを連携させる必要があります。 このVBAマクロは、ExcelからPowerPointを操作し、スライド内のOLE型のWordオブジェクトにルビを振る処理を行います。 処理の流れは以下の通りです。
- 起動済みのPowerPointを取得
- PowerPoint内のスライドとシェイプをループ処理
- OLE型のWordオブジェクトを判別
- Wordアプリケーションオブジェクトを取得
- Word文書の全選択
- ルビダイアログを表示・ルビを振る
ソースコード
'Excelから開かれている既存のPowerPointを捕まえて '埋め込まれている OLEオブジェクトのWord文章にルビを振る 'テスト Sub ExcelからPP内のOLE型Wordにアクセスしてルビを振る() '起動済みのパワポを捕まえる Dim ppApp As Object Set ppApp = Nothing On Error Resume Next 'エラーが発生しても強引に次の命令に行け Set ppApp = GetObject(, "PowerPoint.Application") On Error GoTo 0 '忘れないで戻すぞ If ppApp Is Nothing Then MsgBox "OLEが埋まっているパワポを開いてから、再テストしてね" Exit Sub End If 'データをセットする Dim p As Integer 'pp:スライドのページ Dim ppSlide As Object 'PowerPoint.Slide 'スライド Dim ppShape As Object 'PowerPoint.Shape 'シェイプ 'プレゼンスライドのループ For p = 1 To ppApp.ActivePresentation.Slides.Count Set ppSlide = ppApp.ActivePresentation.Slides(p) ppSlide.Select 'スライドを選択 DoEvents 'スライド内のShapesのループ For Each ppShape In ppSlide.Shapes ppShape.Select DoEvents 'msoEmbeddedOLEObject 7 埋め込み OLE オブジェクト If ppShape.Type = msoEmbeddedOLEObject Then 'OLEの埋め込みか? 'さらに、フォーマットがDocumentか?聞く If TypeName(ppShape.OLEFormat.Object) = "Document" Then Dim wdDocument As Object 'Word.Document Set wdDocument = ppShape.OLEFormat.Object ppShape.OLEFormat.Activate 'アクティブにする(手動でダブルクリックした状態) DoEvents '親を見る、ppShape.OLEFormat.Parentはダメで、wdDocument.Parent? 'WordのDialogを実行テスト Dim wdApp As Object 'Word.Application Set wdApp = wdDocument.Parent 'DOC文章の親がWord.Application wdApp.Selection.WholeStory 'Ctrl+A全選択 DoEvents wdApp.Dialogs(986).Show 1 '986 wdDialogPhoneticGuide DoEvents End If End If Next Next p ppApp.ActivePresentation.Slides(1).Select '先頭のスライドを選択 DoEvents MsgBox "セット終了、ファイルを確認してください", vbExclamation End Sub
ソースコードの説明
まず、起動済みのPowerPointアプリケーションオブジェクトを取得します。12:46 GetObjectでPowerPointを取得。PowerPointが起動していない場合は、エラーが発生するので、エラー処理を追加し、メッセージを表示してマクロを終了するようにしています。
次に、スライドとシェイプをループ処理します。12:59 スライドとシェイプをループ処理。ppSlide
オブジェクトにスライドオブジェクトを、ppShape
オブジェクトにシェイプオブジェクトを格納し、各シェイプに対して処理を行います。
シェイプが埋め込みOLEオブジェクトかどうかをppShape.Type = msoEmbeddedOLEObject
で確認します。07:03 .Typeでシェイプの種類を確認 msoEmbeddedOLEObject
は埋め込みOLEオブジェクトを表す定数です。さらに、TypeName(ppShape.OLEFormat.Object) = "Document"
で、埋め込まれたオブジェクトがWord文書かどうかを確認します。08:31 TypeNameでOLEオブジェクトの種類を確認
Word文書オブジェクトが見つかったら、ppShape.OLEFormat.Activate
でWord文書をアクティブ化します。14:42 OLEFormat.Activateで編集状態に これは、Word文書をダブルクリックして編集状態にする操作と同じです。
次に、Wordアプリケーションオブジェクトを取得します。17:51 親オブジェクト(.Parent)を探索 wdDocument.Parent
でWordアプリケーションオブジェクトを取得できます。
取得したWordアプリケーションオブジェクトを使って、wdApp.Selection.WholeStory
でWord文書の全選択、wdApp.Dialogs(986).Show 1
でルビダイアログを表示し、ルビを振ります。23:30 Wordのダイアログ起動方法を調べる wdDialogPhoneticGuide
はルビダイアログを表す定数で、値は986です。
最後に、DoEvents
で処理を一時停止し、PowerPointの最初のスライドを選択します。
a) この動画で説明したこと、伝えたかったこと
Excel VBAからPowerPointを操作し、スライド内の埋め込みWord文書にルビを振る方法を解説しました。OLEオブジェクトの操作、親オブジェクトの取得方法、Wordダイアログの起動など、VBAプログラミングのポイントを説明しました。
b) このソースコードで未解決の問題点、積み残しの課題
動画内でも説明した通り、このマクロは処理が重いため、大量のスライドやWord文書を処理する際に、パフォーマンスが低下する可能性があります。また、ルビを振った後の文字サイズのずれの修正も課題として残っています。今後の課題として、これらの問題点の改善策を検討していきたいと思います。
次に動画全体の埋め込みリンク
この動画では、PowerPoint VBAでOLE型の埋め込みWord文書にルビを振る方法を解説しています。Excel VBAからPowerPointを操作し、Word文書にルビを振るマクロのソースコードと解説、実行結果を紹介しています。