質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

618閲覧

PowerPoint VBA: ページ番号と総ページ数(但し実際のページ数とは異なる)を算出するには

Cystidia

総合スコア17

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2023/05/19 22:45

お世話になります。PowerPoint VBAを初めていじります。

実現したいこと

PowerPoint 365 (Windows)で、現在のページ番号と総ページ番号を表示したい。
ただし、上記「現在のページ番号」「総ページ番号」は実際のスライド数とは異なる。

前提

毎週定期的にプレゼンがあるため、複数の似たようなレイアウトのスライドを何通りか作っています。
そのスライドの右上端に、テキストボックスで「xx枚目 / 全n枚」という表示を入れています。
これらは毎週手打ち(レイアウトを崩したくないので、1枚目のボックスを次頁以降にコピペ→打ち直し)でつけています。

この作業を自動化したいのですが、これにはいくつか条件があります。
・実際のスライド枚数≠枚数を表示したいスライドの数ではないので、上記「ページ番号を表示したいテキストボックス」が存在するページのみカウントして、その総ページ数を上記「n」にしたい
・同じ理由で、上記「xx」はページ番号を表示したいテキストボックスのカウント(現在のボックスは1枚目から数えて何番目のボックスか)としたい
・背景色(貼り付けた写真等を含む)に応じて文字色を変えているので、ボックス自体は自動生成ではなく、別スライドに準備した3通りのテンプレからコピペして手動で貼り付けたい

スライド表示時のタイムラグを極力廃したいので(自分が聴衆だったらそれでイライラしそうなので)、ページ数を算出するタイミングは各スライドの表示時ではなく「スライドの保存時」もしくは「最初の1枚を表示したとき」にしたいと考えています。

発生している問題・エラーメッセージ

該当のソースコード

試したこと

Excel/Access VBAを過去に使っていたため、VBAで何とかなるかと思ったのですが、PowerPoint VBAの仕様がどうにも分からず弱っています。どこに何を書いたら良いかすら分かっておりません。

補足情報(FW/ツールのバージョンなど)

なし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

vba

1Sub sample() 2 Dim sl, sh, k 3 With CreateObject("Scripting.Dictionary") 4 For Each sl In ActivePresentation.Slides 5 For Each sh In sl.Shapes 6 If sh.Name Like "TextBox*" And sh.Left > 700 And sh.Top > 300 Then .Add .Count + 1, sh 7 Next sh, sl 8 For Each k In .Keys 9 .Item(k).TextFrame.TextRange.Text = k & "/" & .Count 10 Next 11 End With 12 End Sub

投稿2023/07/10 11:30

jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cystidia

2023/07/10 12:09

ありがとうございます!試してみます! 質問したにもかかわらず、その後全く手をつけられていませんでした。
Cystidia

2024/06/23 16:11 編集

ありがとうございます。おかげさまで解決しました!
guest

0

リファレンスは見ていますか?
https://learn.microsoft.com/ja-jp/office/vba/api/overview/powerpoint
「マクロの記録」機能が無いのでちょっとつらいですが、Excel VBAで図形を扱った経験があればリファレンスを見ればわかるかと思います。

「ページ番号を表示したいテキストボックス」を他のテキストボックスと何を以て区別するかは考える必要がありますが、

VBA

1ActivePresentation.Slides(1).Shapes(1).TextFrame.TextRange.Text

で、ページ1の最初の図形のテキストを参照・代入出来ます。

投稿2023/05/19 23:38

otn

総合スコア86295

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2023/05/19 23:58

実行を手動でなく、「ファイルを開いたときに自動実行」したいということであれば、Excelのように簡単にはいかないようですが、「vba ファイルを開いたとき powerpoint」で検索すると方法はあるようです。
guest

0

頂いたコードを参考に、最終的にこんな感じにしました。
後半で面倒くさい置換をしているのは、これ以外の方法だとフォントサイズ・色などが崩れたためです。

PowerPoint_VBA

1Sub UpdateTextBoxesWithNumericValues() 2 Dim sl As Slide 3 Dim sh As Shape 4 Dim k As Variant 5 Dim dict As Object 6 7 Set dict = CreateObject("Scripting.Dictionary") 8 9 For Each sl In ActivePresentation.Slides 10 For Each sh In sl.Shapes 11 If sh.Type = msoTextBox And sh.Top < 10 Then 12 dict.Add dict.Count + 1, sh 13 sh.Top = 0 14 End If 15 Next sh 16 Next sl 17 18 Dim regex As Object 19 Set regex = CreateObject("VBScript.RegExp") 20 regex.Global = True 21 regex.IgnoreCase = True 22 regex.Pattern = "\b\d{1,2}\b" ' 1桁または2桁の数値にマッチする正規表現パターン 23 24 For Each k In dict.Keys 25 Dim txtRange As TextRange 26 Set txtRange = dict.Item(k).TextFrame.TextRange 27 28 If regex.Test(txtRange.Text) Then 29 Dim matches As Object 30 Set matches = regex.Execute(txtRange.Text) 31 32 Dim xxStart As Long 33 Dim yyStart As Long 34 Dim xxValue As String 35 Dim yyValue As String 36 Dim foundXX As Boolean 37 foundXX = False 38 39 For Each match In matches 40 If Not foundXX Then 41 xxStart = match.FirstIndex + 1 42 xxValue = match.Value 43 foundXX = True 44 Else 45 yyStart = match.FirstIndex + 1 46 yyValue = match.Value 47 Exit For 48 End If 49 Next match 50 51 ' XXの置換 52 If xxStart > 0 Then 53 With txtRange.Characters(xxStart, Len(xxValue)) 54 .Text = Format(k, "00") 55 End With 56 End If 57 58 ' YYの置換 59 If yyStart > 0 Then 60 With txtRange.Characters(yyStart, Len(yyValue)) 61 .Text = Format(dict.Count, "00") 62 End With 63 End If 64 End If 65 Next k 66End Sub

投稿2024/06/23 16:12

編集2024/06/23 16:14
Cystidia

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問