前提・実現したいこと
大量の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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
を使用すれば、スライドマスタで「スライド番号」を表す「<#>」というフィールドをテキストボックスに入れる
に関しては解決すると思います。
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
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.20%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2020/02/05 13:09
教えていただいたコードに、いくつかわからないところがあります。お時間があるときで構いませんので、もしよろしければ教えて下さい。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