「PowerPointのタイトルプレースホルダーに連番が入っているときに、マクロで連番を振りなおすにはどうしたらいいのでしょうか?」
といったご質問をいただきました。
例えば上図のように、スライドのタイトルプレースホルダーに、
1. はじめに
2. はじめてのマクロ
3. VBAの関数
のような、連続する数字と文字列が入力されているときに、スライドの順番を入れ替えたあとで、VBA(Visual Basic for Applications)を使って連番を振りなおしたい、という要望です。
Wordであれば適切なスタイルを設定しておけば、このようなマクロは不要ですけれど、PowerPointの場合、複数のスライドに連番を自動的に振るような機能はスライド番号しかないため、こういった要望が出てくることは納得できます。
連番を振りなおすサンプルマクロ
参考になりそうなマクロを作ってみました。
Const SEP = ". " ' 数字と文字列の間の区切り文字
Dim pos As Long ' SEP(区切り文字)の位置
Dim txt As String
Dim sld As Slide
Dim n As Long: n = 1
For Each sld In ActivePresentation.Slides
txt = sld.Shapes.Title.TextFrame.TextRange.Text
pos = InStr(txt, SEP)
If pos > 0 Then
txt = n & SEP & Mid(txt, pos + Len(SEP))
sld.Shapes.Title.TextFrame.TextRange.Text = txt
n = n + 1
End If
Next sld
上記のマクロは「1. はじめに」のように、数字の直後に「. 」(ドットと半角スペース)が存在して、その後ろに文字列が入力されていることを想定しています。
このようなフォーマットでタイトルプレースホルダーに文字列が入力されているときに、スライドの順番を入れ替えたあとに、上記マクロを実行すると連番が振りなおされます。
連番の入っていないスライドが混在していた場合、その連番の入ったスライドは無視して、元々連番が入っていたスライドだけに連番を振りなおします。
サンプルマクロの解説
連番部分と文字列を区別するには、間に何らかの決まった記号等を入れておくのが一番です。上記のマクロでは「. 」(ドットと半角スペース)を、定数・SEPで指定しています。
Const SEP = ". " ' 数字と文字列の間の区切り文字
メインの処理は以下のとおりです。
アクティブなプレゼンテーションを表すPresentationオブジェクトの、全SlideオブジェクトにFor Each~Nextループを回して、
For Each sld In ActivePresentation.Slides
まず各スライドのタイトルプレースホルダー内の文字列を取得します。
txt = sld.Shapes.Title.TextFrame.TextRange.Text
次に定数・SEPに定義しておいた区切り文字を探して、
pos = InStr(txt, SEP)
区切り文字が見つかった場合に、
If pos > 0 Then
新しい連番と、区切り文字と、区切り文字よりうしろの文字列を結合して、
txt = n & SEP & Mid(txt, pos + Len(SEP))
タイトルプレースホルダーに入れなおして、
sld.Shapes.Title.TextFrame.TextRange.Text = txt
連番を振る変数・nをインクリメントしています。
n = n + 1
何らかの文字列を見つけて、その後ろの文字列を取得する「pos = InStr(txt, SEP)」「Mid(txt, pos + Len(SEP))」という考え方は、ExcelでFIND関数やMID関数などを使うのと同じです。
PowerPoint VBAの場合、
For Each sld In ActivePresentation.Slides
txt = sld.Shapes.Title.TextFrame.TextRange.Text
あたりで使っている、オブジェクトの階層関係が難しいところでしょう。
Excelと比べると、PowerPointはオブジェクトモデルの階層関係が深く、マクロ記録機能もなくなってしまっているため、基本的な階層構造を自分の頭に叩き込まなければ、PowerPointマクロを作ることは不可能です。基礎的な英文法を自分の頭に叩き込んで、咄嗟に口から出せるようにしない限りは、ちゃんとした英会話ができないのとまったく同じことです。
Home » パワーポイントマクロ・PowerPoint VBAの使い方 » プレースホルダー » 連番を振りなおすPowerPointマクロ