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

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

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

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

Q&A

解決済

1回答

3205閲覧

スライドマスタに任意の文章つきのページ番号を入れたい

pia

総合スコア14

VBA

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

0グッド

0クリップ

投稿2020/02/03 13:15

編集2020/02/03 13:22

前提・実現したいこと

大量のPowerPointのファイルのすべてのページに、「ファイルごとの固有名 P.◯」というノンブルを入れなければなりません。

最初、「A:固有名を変数に入れて、所定の位置にテキストボックスをペースト、その中身を変数&スライド.Countに書き換える」「AをFor eachを使ってすべてのファイル、すべてのスライドで行う」という方法で対処していました。

しかし、相手先から「こちらでページを増減しても自動でノンブルが入るようにして欲しい」と要望がありました。そのため、「B:スライドマスタに固有名&スライド番号を入れる」「BをFor eachを使ってすべてのファイルで行う」に変更したいと考えました。

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

同じようにテキストボックスをペーストして、中身を書き換えようとしたのですが、スライドマスタで「スライド番号」を表す「<#>」というフィールドをテキストボックスに入れる方法と、フィールドと「"ファイルごとの固有名 P."」という文字列を連結する方法が見つけられませんでした。

知識不足もあり、他の方法が思いつかなかったのでこのようにしましたが、**「大量のファイルのスライドマスタに「ファイルごとの固有名 P.◯」を入れる__**__ことが出来れば他の方法でも全然構いません。アドバイスお願いします。

該当のソースコード

VBA

1Sub スライドマスタにノンブル() 2 Dim shp As Shape 3 Dim non As String 4 Dim newshp As ShapeRange '貼り付けたものはshaperangeになるので 5 6'1ページ目の"スライド番号"から始まるテキストボックスに固有名が入っているので 7'それを取得しています 8 For Each shp In ActivePresentation.Slides(1).Shapes 9 If Left(shp.Name, 6) = "スライド番号" Then 10 non = shp.TextFrame.TextRange.Text 11 non = Replace(non, "P1", "P") '1を削除 12 shp.TextFrame.TextRange.Text = non 13 shp.Copy'テキストボックスコピー 14 End If 15 Next 16 17 With ActivePresentation.SlideMaster 18 ActiveWindow.ViewType = ppViewSlideMaster'スライドマスタに切り替え 19 .Shapes.SelectAll 'スライドマスタのシェイプ全選択 20 ActiveWindow.Selection.Delete '消す 21 Set newshp = .Shapes.Paste'さっきコピーしたものを貼り付け 22 23'.HeadersFooters.SlideNumber.Textというものを見つけたので 24'入れてみましたがエラーが出ます。また、これはフィールドではないようです 25 non = non & .HeadersFooters.SlideNumber.Text 26 27 newshp.TextFrame.TextRange.Text = non 28 End With 29 30 31End Sub

試したこと

non = non & .HeadersFooters.SlideNumber.Textを
non = non & <#>としてみましたが、<#>がそのまま表示されてしまいました。

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

PowerPoint
Office365

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

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

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

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

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

guest

回答1

0

ベストアンサー

InsertSlideNumber メソッド (PowerPoint) | Microsoft Docs

を使用すれば、スライドマスタで「スライド番号」を表す「<#>」というフィールドをテキストボックスに入れるに関しては解決すると思います。

vba

1Sub スライドマスタにノンブル2() 2''スライドマスタに任意の文章つきのページ番号を入れたい 3''https://teratail.com/questions/2392590 4 5 Dim pres As PowerPoint.Presentation 6 Set pres = ActivePresentation 7 8 '1ページ目の"スライド番号"から始まるテキストボックスに固有名が入っているので 9 'それを取得しています 10 Dim shp As PowerPoint.Shape 11 Dim non As String 12 For Each shp In pres.Slides.Item(1).Shapes 13 If Left(shp.Name, 6) = "スライド番号" Then 14 non = shp.TextFrame.TextRange.Text 15 non = Replace(non, "P1", "P") '1を削除 16 shp.TextFrame.TextRange.Text = non 17 shp.Copy 'テキストボックスコピー 18 Exit For 19 End If 20 Next shp 21 22 Dim mas As PowerPoint.Master 23 Set mas = pres.SlideMaster 24 'スライドマスタのシェイプ全削除 25 ''実際のファイルの状態にもよるけどちょっと乱暴な気がする 26 Call mas.Shapes.Range().Delete 27 28 'さっきコピーしたものを貼り付け 29 Dim newshp As PowerPoint.ShapeRange '貼り付けたものはshaperangeになるので 30 Set newshp = mas.Shapes.Paste() 31 ''https://docs.microsoft.com/ja-jp/office/vba/api/powerpoint.textrange.insertslidenumber 32 newshp.Item(1).TextFrame.TextRange.InsertSlideNumber 33 34End Sub

投稿2020/02/04 15:04

imihito

総合スコア2166

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

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

pia

2020/02/05 04:09

ありがとうございます。希望通りのマクロが作れそうです。「InsertSlideNumber」は一度見たのですが、例文が標準のスライドに追加するものだったので、スライドマスタには使えないものと勘違いしていました。 教えていただいたコードに、いくつかわからないところがあります。お時間があるときで構いませんので、もしよろしければ教えて下さい。VBAをきちんと学んだことがないので、ものすごく馬鹿な質問なのかもしれないんですが… 1.Slides.Item(1)とSlides(1)の違いは、「スライドコレクションのItemプロパティ」と「アプリケーションのSlideプロパティ」の違いで合っていますか。どのように使い分けるべきでしょうか。 2.「Call mas.Shapes.Range().Delete」について、「Call」は他のプロシージャを呼び出すものだとずっと思っていたので、コードの意味がわかりませんでした。これはどういう使い方なんでしょうか。 3.2.のRange()もそうなのですが、「Set newshp = mas.Shapes.Paste()」の「()」は何を示しているんでしょうか。
imihito

2020/02/05 11:23

はじめに、質問されている事項は私の個人的なポリシーで付けているだけであり、他の書き方でも問題ないものばかりです。 それぞれについて確認すると、 1. に関しては、`.Slides.Item(1)`と`.Slides(1)`は全く同じ処理を呼び出しています。 `.Slides.Item(1)`を省略して`.Slides(1)`と記述できるようにPowerPointとVBAが作られており、結果として同じ処理となります。 行っている処理は「Slidesコレクション(オブジェクト)のItemメソッドに、引数に1を指定して呼び出す」となります。(コレクションはオブジェクトの一種) 処理に違いは無いので、どちらの書き方が好みか、で使い分ければいいと思います。 2に関しては、「オブジェクトブラウザ」で`Delete`の定義を見るとわかるのですが、VBAは`Delete`を「Subプロシージャ」と認識しています。 `Call`は「Subプロシージャ」または「Functionプロシージャ」を呼び出すときに使ってもいいものなので、「他のプロシージャを呼び出す」という意味は変わっていません。 呼び出しているプロシージャが、標準モジュールではなく、オブジェクトに定義されている物に変わっただけです。 `Call`を消しても問題無く動きます。 3.に関しては、「メソッド(オブジェクトに定義されているSub・Functionプロシージャ)」を呼び出している、という事を自分で意識するためです。 そのため、`()`を消しても動きます。 VBAでは引数が無いSub・Functionプロシージャの呼び出しはカッコが不要ですし、VBA側で勝手に消されることも多いです。 しかし、他のプログラミング言語から使用する場合は必須の場合もあり、自分はそういった言語を使用することも多いため、自身の意識付けとしてカッコをつけるようにしています。 一応VBAでも`()`の有無で処理が動かない例は存在します(よく見るのはあまり良くない使い方の例なので基本無視でいいですが)。
pia

2020/02/06 12:12

知らなかったことだらけで、大変勉強になりました!何かが省略されているということも知らないで使っていました。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問