三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

PowerPointでOLE埋込のWordドキュメントにルビを振るマクロを解説 OLEオブジェクト操作から学ぶVBAマクロ開発

試作テスト VBA PowerPoint OLE型の埋め込みWordを操作 Word文章にルビを振る PowerPointでWordドキュメントにルビを振るマクロの全解説

要約:PowerPointに埋め込まれたWordドキュメントにルビを振るマクロの作成過程を解説しています。エラーのトラブルシューティングから始まり、OLEオブジェクトの操作、Wordダイアログの起動、そしてExcelPowerPointの統合テストまでをカバーしています。

キーワード:
#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
を選択する

パワポにWordオブジェクトを埋め込む

テストの文章を入力する
見やすいようにフォントのサイズを
大きく調整する

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型を操作する動画も見てください。

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)