【パワポ検索ツールを作る6】グループ判定


コードを書く

 前回シェイプ内にテキストが書けるかどうかHasTextを使って判定する方法について解説しました(前回の記事)。今回は前回のテキスト判定でFalseとなった場合の処理としてグループ化されたシェイプを判定し、Trueの場合はその中の文字を検索するプログラムを作ります。コードは前回の記事を元に作成していきます。

'VBA標準モジュール
Option Explicit

Sub findTest(txt As String)
    Dim prs As Presentation  'プレゼンテーション
    Dim sld As Slide    'スライド
    Dim shp As Shape    'シェイプ
    Dim gshp As Shape    'グループシェイプ
    Dim txtRng As TextRange  'テキストレンジ
    Dim foundtext As TextRange  '文字発見用テキストレンジ
    Dim flgFind As Boolean    '文字発見フラグ
    Dim sldNum As Integer    '文字発見字のスライドNo
    Dim msg As String    'メッセージ内容
    Dim btm As Integer    'ボタン種類
    Dim ttl As String    'タイトル
    Dim response As Integer    'ボタン押した後の反応
    
    msg = "見つけたよ!!"
    btm = 4
    ttl = "メッセージ"
    flgFind = False

    For Each prs In Presentations  '全プレゼンテーションをループ
        For Each sld In prs.Slides  '全スライドをループ
            For Each shp In sld.Shapes  '全図形をループ
                If shp.HasTextFrame Then    'テキストフレーム有り
                    Set txtRng = shp.TextFrame.TextRange
                    Set foundtext = txtRng.Find(txt, msoFalse, msoFalse)
                    
                    '文字を発見した時
                    If Not (foundtext Is Nothing) Then
                        flgFind = True    '文字発見
                        With foundtext
                            sldNum = sld.SlideIndex  '検索ワードが記載されたスライドNo代入
                            prs.Windows(1).Activate  '検索ワードがあるプレゼンテーションをアクティブ化
                            ActiveWindow.View.GotoSlide Index:=sldNum    '検索ワードがあるスライドを開く
                            response = MsgBox(msg, btm, ttl)  'メッセージの返答に対する返り値
                            
                            'ボタンを押した後の反応
                            If response = vbYes Then    'YESの場合
                                shp.Select  '検索ワードを含むシェイプを選択
                                Exit Sub    'FindTestから抜ける
                            End If
                        End With
                    End If
                Else
                    If shp.Type = msoGroup Then    'グループを見つけた場合
                        For Each gshp In shp.GroupItems
                            If gshp.HasTextFrame Then    'テキストフレーム有り
                                Set txtRng = gshp.TextFrame.TextRange
                                Set foundtext = txtRng.Find(txt, msoFalse, msoFalse)    '  文字発見字のスライドを開く
                                
                                '文字を発見した時
                                If Not (foundtext Is Nothing) Then
                                    flgFind = True    '文字発見
                                    With foundtext
                                        sldNum = sld.SlideIndex
                                        prs.Windows(1).Activate
                                        ActiveWindow.View.GotoSlide Index:=sldNum    '編集中専用
                                        response = MsgBox(msg, btm, ttl)
                                        'ボタンを押した後の反応
                                        
                                        If response = vbYes Then    'YESの場合
                                            shp.Select
                                            Exit Sub    'リターン
                                        End If
                                    End With
                                End If
                            End If
                        Next
                    End If
                End If
            Next
        Next
    Next
    
    If flgFind = False Then
        MsgBox ("ごめんなさい、見つけられませんでした・・・")
    Else
        MsgBox ("検索終了")
    End If
End Sub

動作確認

 下の資料の様にグループ化したテキストボックスや四角形に適当な文字を入力したサンプルを用意します。

 記載したコードを実行するとグループ内の文字を見つかることができたと思います。グループはシェイプのプロパティTypeで判定します。コードは「If shp.Type = msoGroup」と書きます。そして予め用意しておいたシェイプ変数「gshp」にグループ内「shp.GroupItems」のシェイプを一つずつ当てはめて検索していく仕組みになっています。gshpを検索するループ内は前回と同様にHasTextで判定していきます。ややこしいかもしれませんがプログラムはこの様にループと判定のオンパレードになるので、動作を1つずつ細分化し整理することで慣れてきます。
 次回は表の中の文字検索を実装します。


コメントを残す