PowerPoint (一般・VBA)

PowerPoint 一般・VBAに関する話題を扱うフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : PowerPoint 2016)
PowerpointVBAでオジェクト名指定でShapeオブジェクトを削除したい。
投稿日時: 19/12/20 14:11:54
投稿者: gorby

Powerpointファイルを開いて、ホーム-配置-オブジェクトの選択と表示 でスライドのShapeオブジェクト一覧が表示されます。
このスライドから”コンテンツプレースホルダー2”のShapeオブジェクトを削除しようとして、下記のPowerpointVBAを実行しましたが、何も削除されません。コードをどう直せば動きますか? わかる方教えてください。
 
--<start of code>----
Sub delete()
Dim s As Shape 'sはshapeオブジェクトを入れる変数
Dim c As Collection 'cはコレクション
Dim start_slide As Integer 'start_slideはスライド番号1を入れる定数
Dim i As Integer 'iはスライド番号を入れる変数
 
start_slide = 1
For i = start_slide To ActivePresentation.Slides.Count
Set c = New Collection
For Each s In ActivePresentation.Slides(i).Shapes '変数sにアクティブスライド番号のすべてのshapeオブジェクトを入れる。
   c.Add s
Next
For Each s In c
  If InStr(s.Title, "コンテンツ") > 0 Then s.delete '★ここが重要!
Next
'continue:
Next
'MsgBox "the process is finished."
End Sub
 --<end of code>----

回答
投稿日時: 19/12/20 17:09:39
投稿者: よろずや

  If InStr(s.Name, "content") > 0 Then s.delete
 
だと、どうなりますか。

回答
投稿日時: 19/12/20 17:10:54
投稿者: sk

引用:
このスライドから”コンテンツプレースホルダー2”のShapeオブジェクトを削除

(標準モジュール)
-----------------------------------------------------------------
Sub DeleteAllContentPlaceHolders()
 
    Dim prs As PowerPoint.Presentation
    Dim sld As PowerPoint.Slide
    Dim shp As PowerPoint.Shape
 
    Set prs = ActivePresentation
     
    For Each sld In prs.Slides
        For Each shp In sld.Shapes.Placeholders
            If shp.PlaceholderFormat.Type = ppPlaceholderObject Then
                shp.Delete
                Exit For
            End If
        Next
    Next
     
    Set prs = Nothing
 
End Sub
-----------------------------------------------------------------
 
以上のようなコードを実行なさればよろしいかと。

投稿日時: 19/12/21 05:33:16
投稿者: gorby

すみません、VBAあまり詳しくないのですが、スライド番号指定しなくて大丈夫でしょうか?現在開いているスライドのコンテンツプレイスホルダー3だけ削除したいのですが、、他のコンテンツプレイスホルダーは残したいです。

回答
投稿日時: 19/12/23 10:22:58
投稿者: sk

gorby さんの引用:
スライド番号指定しなくて大丈夫でしょうか?

gorby さんの引用:
start_slide = 1
For i = start_slide To ActivePresentation.Slides.Count
Set c = New Collection
For Each s In ActivePresentation.Slides(i).Shapes

元のコードが「全てのスライドの全ての図形を参照するループ処理」であるため、
それに合わせただけです。
(アクティブなスライドのみを参照するコードではない)
 
引用:
現在開いているスライドのコンテンツプレイスホルダー3だけ削除したい

(標準モジュール)
-----------------------------------------------------------------
Sub DeleteContentPlaceHoldersInActiveSlide()
On Error GoTo Err_DeleteContentPlaceHoldersInActiveSlide
     
    Dim wnd As PowerPoint.DocumentWindow
    Dim sld As PowerPoint.Slide
    Dim shp As PowerPoint.Shape
     
    If SlideShowWindows.Count > 0 Then
        MsgBox "スライドショーの実行中です。", _
               vbExclamation, _
               "エラー(DeleteContentPlaceHoldersInActiveSlide)"
        Exit Sub
    End If
     
    Set wnd = ActiveWindow
     
    Select Case wnd.ActivePane.ViewType
        Case ppViewNormal, ppViewSlide, ppViewOutline, ppViewThumbnails, ppViewSlideSorter
            Set sld = wnd.View.Slide
            If MsgBox(sld.Name & " の全てのコンテンツプレースホルダーを削除しますか?", _
                      vbQuestion + vbYesNo + vbDefaultButton2, _
                      "実行確認(DeleteContentPlaceHoldersInActiveSlide)") = vbNo Then
                Set sld = Nothing
                Set wnd = Nothing
                Exit Sub
            End If
        Case Else
            Set wnd = Nothing
            MsgBox "現在のビューでは実行できません。", _
                   vbExclamation, _
                   "エラー(DeleteContentPlaceHoldersInActiveSlide)"
            Exit Sub
    End Select
     
    For Each shp In sld.Shapes.Placeholders
        If shp.PlaceholderFormat.Type = ppPlaceholderObject Then
            shp.Delete
        End If
    Next
 
Exit_DeleteContentPlaceHoldersInActiveSlide:
On Error Resume Next
 
    Set shp = Nothing
    Set sld = Nothing
    Set wnd = Nothing
     
    Exit Sub
 
Err_DeleteContentPlaceHoldersInActiveSlide:
 
    MsgBox Err.Number & ": " & Err.Description, _
           vbCritical, _
           "実行時エラー(DeleteContentPlaceHoldersInActiveSlide)"
     
    Resume Exit_DeleteContentPlaceHoldersInActiveSlide
End Sub
-----------------------------------------------------------------
 
こういう面倒なコードを記述するより、普通にスライド上の
コンテンツプレースホルダーを選択して Delete キーを
クリックした方が手っ取り早いと思いますが。

投稿日時: 19/12/23 10:30:24
投稿者: gorby

 
>こういう面倒なコードを記述するより、普通にスライド上の
 コンテンツプレースホルダーを選択して Delete キーを
 クリックした方が手っ取り早いと思いますが。
 
RPAツールから、PowerpointVBAのショートカットキーをたたいて、自動処理を検討しているため、コードで記述したいです。コードはこれから試します。ありがとうyございました。

投稿日時: 19/12/25 15:18:05
投稿者: gorby

よろずや さんの引用:
If InStr(s.Name, "content") > 0 Then s.delete
 
だと、どうなりますか。

動きました。ありがとうございます。

投稿日時: 20/01/10 16:44:49
投稿者: gorby

よろずや さんの引用:
If InStr(s.Name, "content") > 0 Then s.delete
 
だと、どうなりますか。

 
ありがとうございます。シンプルなコードで目的を達成できました。