試作テスト VBA PowerPoint OLE型の埋め込みWordを操作 Word文章にルビを振る PowerPointでWordドキュメントにルビを振るマクロの全解説
要約:PowerPointに埋め込まれたWordドキュメントにルビを振るマクロの作成過程を解説しています。エラーのトラブルシューティングから始まり、OLEオブジェクトの操作、Wordダイアログの起動、そしてExcelとPowerPointの統合テストまでをカバーしています。
キーワード:
#PowerPointVBA #WordVBA #マクロ #OLEオブジェクト #振り仮名 #ダイアログ #統合テスト #VBA #エラー解決
www.youtube.com
目次
00:00 やりたいこと
01:46 1.事前準備
03:56 コードの実行結果を先に見せる 埋め込みWord文章にルビを振るテスト
06:19 2.単体テスト 2.1 シェイプを確認する
08:31 2.2 OLEフォーマットのタイプを確認する
10:57 2.3 Wordの埋め込みDocumentを探る?
14:41 2.3.1 編集状態にする OLEFormat.Activate
17:51 2.3.2 .Parentで親のオブジェクトを探る
23:14 2.3.3 Wordのダイアログの起動を調べる Word側でテストする
29:20 2.3.4 PowerPointに組み込む WordのDialogを実行テスト
36:02 3.結合、組み込み ExcelからPowerPointを捕まえて、OLE型のシェイプWordのルビを振る
42:20 総合テストの結果は?実行結果を見せる 止まったように動くので連続実行に向かない?
44:16 4.おわりの挨拶 と 今日の振り返り
0.やりたいこと
>パワポにワードドキュメントを埋め込んでいます。
>このドキュメントの中のテキストにルビを振る
>(=埋め込まれたワードドキュメントをActivateして、
>そのワード上でルビダイアログを立ち上げてルビを振る)マクロを組んでいます。
>
>そのためのコードを書いているのですが、
>アプリケーション定義またはオブジェクト定義のエラーが出ています。
>これって、そもそもパワポに埋め込まれたOLEオブジェクト上では、
>ワードのルビダイアログを立ち上げるといった操作はマクロではできないということなのでしょうか?
>昨日始めたばかりのマクロ初心者で基本的なところが分かっておらず、ご教示いただけるとありがたいです。
>
>文字数制限のためコードをかけないのですが、
> Application.Dialogs(wdDialogPhoneticGuide).Show 1
>などをエクセルの標準モジュールに記載しておりまして、
>これは通常ワードマクロで使うものだと思うので、
>このあたりの設定がおかしいと思っています。
ExcelからPowerPointを操作で、
そのスライドには、OLE型のWordがシェイプとしてあるのかなぁ・・・
なんか、忙しそうだけど、
似ている探り方の宣伝:
ken3memo.hatenablog.com
マクロでパワポに埋め込まれたOLE型のExcelシートを吸い上げ個別に保存する Shape OLEFormat ProgID 実験動画 PowerPointVBA ExcelVBA
https://youtu.be/-GFfMCoBXAQ?si=dWYm2Wkwpv88Yvkg&t=226
↑で、止めて、探って作成したコードを変更してみます。
1.事前準備
挿入 -- オブジェクトから
オブジェクトの種類で
Word Document
を選択する
![](https://cdn-ak.f.st-hatena.com/images/fotolife/k/ken3memo/20240605/20240605172248.jpg)
テストの文章を入力する
見やすいようにフォントのサイズを
大きく調整する
03:56 実行結果を先に見る
https://www.youtube.com/watch?v=qZ135Kwxh4M&t=236
2.単体テスト
2.1 シェイプを確認する
06:19 https://www.youtube.com/watch?v=qZ135Kwxh4M&t=379
.Typeを確認する
Option Explicit 'PowerPointの標準モジュールに貼って確認してます・・・ Sub 確認用240605() 'パワーポイント Slides を1つ1つSTOPで止める ウォッチ式で確認テスト用 Dim nPAGE As Integer Dim ppShape As PowerPoint.Shape nPAGE = ActiveWindow.Selection.SlideRange.SlideIndex '選択しているページ Debug.Print "Id", "Name", "Type" 'テストで選択ページの.Shapesを探る For Each ppShape In ActivePresentation.Slides(nPAGE).Shapes Debug.Print ppShape.Id, ppShape.Name, ppShape.Type ppShape.Select 'わかりやすいように該当オブジェクトを選択 Stop '止める Next MsgBox "終了" End Sub
2.2 OLEフォーマットのタイプを確認する
08:31 https://www.youtube.com/watch?v=qZ135Kwxh4M&t=511
? TypeName(ppShape.OLEFormat.Object)
Document
ここで(Word)Documentまで、たどり着けた。
ここから、
WordのDocumentを探る?
2.3 Wordの埋め込みDocumentを探る?
10:57 https://www.youtube.com/watch?v=qZ135Kwxh4M&t=657
'PowerPointの標準モジュールに貼って確認してます・・・ 'シェイプのType=7,TypeName="Document"で止める Sub 確認用240605_type7DocumentでSTOP() 'Type Dim nPAGE As Integer Dim ppShape As PowerPoint.Shape nPAGE = ActiveWindow.Selection.SlideRange.SlideIndex '選択しているページ Debug.Print "Id", "Name", "Type" 'テストで選択ページの.Shapesを探る For Each ppShape In ActivePresentation.Slides(nPAGE).Shapes Debug.Print ppShape.Id, ppShape.Name, ppShape.Type ppShape.Select 'わかりやすいように該当オブジェクトを選択 '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 Stop End If End If Next MsgBox "終了" End Sub
2.3.1 編集状態にする OLEFormat.Activate
14:41 https://www.youtube.com/watch?v=qZ135Kwxh4M&t=881
埋め込みオブジェクトを選択して、
OLEFormat.Object
を編集状態に(手動操作でダブルクリックして)
埋め込み元のアプリが立ち上がった状態
にしたい。
ppShape.OLEFormat.Activate 'アクティブにする(手動でダブルクリックした状態)
2.3.2 .Parentで親のオブジェクトを探る
17:51 https://www.youtube.com/watch?v=qZ135Kwxh4M&t=1071
'親を見る、ppShape.OLEFormat.Parentはダメで、wdDocument.Parent? Debug.Print "ppShape.OLEFormat.Parent=" & TypeName(ppShape.OLEFormat.Parent) Debug.Print "wdDocument.Parent=" & TypeName(wdDocument.Parent)
余談:
? TypeName(ppShape.OLEFormat.Object.Parent)
Application? ppShape.OLEFormat.Object.Parent
Microsoft Word
2.3.3 Wordのダイアログの起動を調べる Word側でテストする
23:14 https://www.youtube.com/watch?v=qZ135Kwxh4M&t=1394
質問に記載されたコード
Application.Dialogs(wdDialogPhoneticGuide).Show 1
を調べる
①Wordを起動して、開発VBEから wdDialogPhoneticGuideの値を見る
? wdDialogPhoneticGuide
986
↑この、986をメモする(おいおい、参照設定して使えばいいのに・・・)
②Application.Dialogs(wdDialogPhoneticGuide).Show 1 をイミディエイトで実行する
※文字列選択のエラーを確認する・・・※もしかして、質問者さんはコレに引っかかっただけ?
文字列を選択してテストする
③ついでにマクロ記録で、Ctrl+AとCtrl+C(おまけ)を記録する
Selection.WholeStory
Selection.Copy
Sub Macro1() ' ' Macro1 Macro ' ' Selection.WholeStory Selection.Copy End Sub
2.3.4 PowerPointに組み込む WordのDialogを実行テスト
29:20 https://www.youtube.com/watch?v=qZ135Kwxh4M&t=1760
'PowerPointに組み込む WordのDialogを実行テスト Dim wdApp As Object Set wdApp = wdDocument.Parent wdApp.Selection.WholeStory 'Ctrl+A全選択 wdApp.Dialogs(986).Show 1 '986 wdDialogPhoneticGuide
'PowerPointの標準モジュールに貼って確認してます・・・ 'シェイプのType=7,TypeName="Document"で止める 'OLE型のWordでルビを振る Sub 確認用240605_OLE型のWordでルビを振る() Dim nPAGE As Integer Dim ppShape As PowerPoint.Shape nPAGE = ActiveWindow.Selection.SlideRange.SlideIndex '選択しているページ Debug.Print "Id", "Name", "Type" 'テストで選択ページの.Shapesを探る For Each ppShape In ActivePresentation.Slides(nPAGE).Shapes Debug.Print ppShape.Id, ppShape.Name, ppShape.Type ppShape.Select 'わかりやすいように該当オブジェクトを選択 '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 'アクティブにする(手動でダブルクリックした状態) '親を見る、ppShape.OLEFormat.Parentはダメで、wdDocument.Parent? Debug.Print "ppShape.OLEFormat.Parent=" & TypeName(ppShape.OLEFormat.Parent) Debug.Print "wdDocument.Parent=" & TypeName(wdDocument.Parent) 'PowerPointに組み込む WordのDialogを実行テスト Dim wdApp As Object 'Word.Application Set wdApp = wdDocument.Parent 'DOC文章の親がWord.Application wdApp.Selection.WholeStory 'Ctrl+A全選択 wdApp.Dialogs(986).Show 1 '986 wdDialogPhoneticGuide Stop End If End If Next MsgBox "終了" End Sub
3.結合、組み込み ExcelからPowerPointを捕まえて、OLE型のシェイプWordのルビを振る
36:02 https://www.youtube.com/watch?v=qZ135Kwxh4M&t=2162
PowerPointで単体テストが終わったので、
Excelに組み込んでみます。
勝手に仕様を
全てのスライドからOLE型 Wordのルビを振るテスト
にしました。
※なんか、ものすごく重くて、(処理が遅くて)
文章が長いと、止まるかも・・・
Option Explicit '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 = 7 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
4.おわりの挨拶
こんな感じで、
単体テストから、組み込み、総合テストしてみました
開発処理のヒント、参考となれば幸いです。
昼にライブはやるもんじゃないですね・・・・
再生リストの紹介:OLE型をVBA・マクロで操作する方法 再生リスト
https://www.youtube.com/playlist?list=PL8vZhsyiiFhsNWqKjlUl7_60-XZydnnWP
↑他のOLE型を操作する動画も見てください。