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

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

ただいまの
回答率

88.20%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 762

pia

score 6

前提・実現したいこと

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

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

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

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

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

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

該当のソースコード

Sub スライドマスタにノンブル()
    Dim shp As Shape
    Dim non As String
    Dim newshp As ShapeRange    '貼り付けたものはshaperangeになるので

'1ページ目の"スライド番号"から始まるテキストボックスに固有名が入っているので
'それを取得しています
    For Each shp In ActivePresentation.Slides(1).Shapes
        If Left(shp.Name, 6) = "スライド番号" Then
            non = shp.TextFrame.TextRange.Text
            non = Replace(non, "P1", "P") '1を削除
            shp.TextFrame.TextRange.Text = non
            shp.Copy'テキストボックスコピー
        End If
    Next

    With ActivePresentation.SlideMaster
    ActiveWindow.ViewType = ppViewSlideMaster'スライドマスタに切り替え
    .Shapes.SelectAll 'スライドマスタのシェイプ全選択
    ActiveWindow.Selection.Delete '消す
    Set newshp = .Shapes.Paste'さっきコピーしたものを貼り付け

'.HeadersFooters.SlideNumber.Textというものを見つけたので
'入れてみましたがエラーが出ます。また、これはフィールドではないようです
    non = non & .HeadersFooters.SlideNumber.Text

    newshp.TextFrame.TextRange.Text = non
    End With


End Sub

試したこと

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

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

PowerPoint
Office365

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

InsertSlideNumber メソッド (PowerPoint) | Microsoft Docs

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

Sub スライドマスタにノンブル2()
''スライドマスタに任意の文章つきのページ番号を入れたい
''https://teratail.com/questions/2392590

    Dim pres As PowerPoint.Presentation
    Set pres = ActivePresentation

    '1ページ目の"スライド番号"から始まるテキストボックスに固有名が入っているので
    'それを取得しています
    Dim shp As PowerPoint.Shape
    Dim non As String
    For Each shp In pres.Slides.Item(1).Shapes
        If Left(shp.Name, 6) = "スライド番号" Then
            non = shp.TextFrame.TextRange.Text
            non = Replace(non, "P1", "P") '1を削除
            shp.TextFrame.TextRange.Text = non
            shp.Copy 'テキストボックスコピー
            Exit For
        End If
    Next shp

    Dim mas As PowerPoint.Master
    Set mas = pres.SlideMaster
    'スライドマスタのシェイプ全削除
    ''実際のファイルの状態にもよるけどちょっと乱暴な気がする
    Call mas.Shapes.Range().Delete

    'さっきコピーしたものを貼り付け
    Dim newshp As PowerPoint.ShapeRange    '貼り付けたものはshaperangeになるので
    Set newshp = mas.Shapes.Paste()
    ''https://docs.microsoft.com/ja-jp/office/vba/api/powerpoint.textrange.insertslidenumber
    newshp.Item(1).TextFrame.TextRange.InsertSlideNumber

End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/05 13: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()」の「()」は何を示しているんでしょうか。

    キャンセル

  • 2020/02/05 20: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でも`()`の有無で処理が動かない例は存在します(よく見るのはあまり良くない使い方の例なので基本無視でいいですが)。

    キャンセル

  • 2020/02/06 21:12

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

    キャンセル

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

  • ただいまの回答率 88.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る