コードを書く
前回シェイプ内にテキストが書けるかどうか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つずつ細分化し整理することで慣れてきます。
次回は表の中の文字検索を実装します。