PowerPoint (一般・VBA)

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

 
(Windows 10 Pro : PowerPoint 2013)
画像を選択中に図形を同時に選択できるか
投稿日時: 20/09/08 17:44:23
投稿者: QooApp

お世話になっております。
 
選択した画像のサイズを変更し、背面に一回り大きな四角形を作成、位置を調整してグループ化という目的でVBを組んでいたのですが、そもそも同じ属性ではない2つのオブジェクトを選択できるものでしょうか。
 
図形を複数だったり、画像を複数というのは見つけられたのですが、
図形と画像を1枚づつ選択というのは見当たりませんでした。
 
また、片方のオブジェクトを選択中、もう片方のオブジェクトのプロパティから.Selectした場合、解除されてしまいます。(当たり前ですが)
 
できるんでしょうか。

回答
投稿日時: 20/09/09 10:14:07
投稿者: sk

引用:
選択した画像のサイズを変更し、背面に一回り大きな四角形を作成、
位置を調整してグループ化

引用:
そもそも同じ属性ではない2つのオブジェクトを選択できるものでしょうか。

「複数選択が可能か否か」と「グループ化が可能か否か」は別の問題です
 
例えば、プレースホルダーは他の図形と共に複数選択することが可能ですが、
プレースホルダーと他の図形をグループ化することは出来ません。
 
引用:
図形を複数だったり、画像を複数というのは見つけられたのですが、
図形と画像を1枚づつ選択というのは見当たりませんでした。

(プレースホルダーではない)図形と画像を複数選択して
グループ化すること自体は可能です。
 
引用:
片方のオブジェクトを選択中、もう片方のオブジェクトのプロパティから
.Selectした場合、解除されてしまいます

そもそも、それらの図形をグループ化するのに
「図形の複数選択」という操作は必須ではありません。
 
(標準モジュール)
------------------------------------------------------------
Sub AddRectangleBehindPicture()
     
    Const RectMargin As Single = 5
     
    With Application.ActiveWindow.Selection
         
        If .Type <> ppSelectionShapes Then
            Exit Sub
        End If
         
        If .ShapeRange.Count > 1 Then
            Exit Sub
        End If
         
        Dim shp1 As PowerPoint.Shape
        Set shp1 = .ShapeRange.Item(1)
     
    End With
     
    With shp1
         
        If .Type <> msoPicture Then
            Set shp1 = Nothing
            Exit Sub
        End If
         
        Dim sld As PowerPoint.Slide
        Dim shp2 As PowerPoint.Shape
         
        Set sld = .Parent
        Set shp2 = sld.Shapes.AddShape(msoShapeRectangle, _
                                       .Left - RectMargin, _
                                       .Top - RectMargin, _
                                       .Width + (RectMargin * 2), _
                                       .Height + (RectMargin * 2))
    End With
     
    With shp2
        .Line.Visible = msoFalse
        .Fill.Visible = msoTrue
        .Fill.ForeColor.RGB = RGB(255, 0, 0)
        .ZOrder msoSendToBack
    End With
 
    Dim shprng As PowerPoint.ShapeRange
    Dim shp3 As PowerPoint.Shape
    Dim aryShapeNames As Variant
     
    aryShapeNames = Array(shp1.Name, shp2.Name)
    Set shprng = sld.Shapes.Range(aryShapeNames)
    Set shp3 = shprng.Group
    shp3.Select
 
    MsgBox "[" & sld.Name & "]の[" & shp1.Name & "]の背面に" & _
           "[" & shp2.Name & "]を追加してグループ化しました。"
 
    Set shprng = Nothing
    Set shp1 = Nothing
    Set shp2 = Nothing
    Set shp3 = Nothing
    Set sld = Nothing
 
End Sub
------------------------------------------------------------

回答
投稿日時: 20/09/09 10:24:02
投稿者: Suzu

QooApp さんの引用:
そもそも同じ属性ではない2つのオブジェクトを選択できるものでしょうか。

属性に限らずできますよね。
 
  1つのオブジェクトを選択した状態で
  「Ctr」(場合に依っては「Shift」でも可)を押しながら 別オブジェクトを選択
これは、オブジェクトタイプが同じ場合の選択と変わらないと思います。
 
或いは、「書式」-「オブジェクトの選択と表示」にて【選択】を表示させれば
オブジェクトのリストを表示できますので
そこであるオブジェクト名称を選択し「Ctr」を押しながら別オブジェクトの名称を選択。
 (あるオブジェクト名称から連続で別オブジェクトまで選択の場合は「Shift」を押しながら
 別オブジェクトの名称を選択)
 
 
「同じ属性の場合だと選択できる」との意図が拝見できるのですが
どの様に選択されているのでしょうか?
 
 
引用:
図形を複数だったり、画像を複数というのは見つけられたのですが、
図形と画像を1枚づつ選択というのは見当たりませんでした。

VBAでの話でしょうか?
 
引用:
また、片方のオブジェクトを選択中、もう片方のオブジェクトのプロパティから.Selectした場合、解除されてしまいます。(当たり前ですが)

 
Shapeではなくて、ShapeRangeへの操作になります。
https://docs.microsoft.com/ja-jp/office/vba/api/powerpoint.shaperange.group
 
Sub Sumple()
    Dim sld As PowerPoint.Slide
    Dim shp1 As Shape
    Dim shp2 As Shape

    Set sld = PowerPoint.ActivePresentation.Slides(1)

    Set shp1 = sld.Shapes(1)
    Set shp2 = sld.Shapes(2)

    With sld.Shapes.Range(Array(shp1.Name, shp2.Name))
       '.Select
        .Group
    End With
End Sub

 
ただ 名称やインデックスが指定できるのか
或いは、ForEachで全Shapeを走査し、タイプで グループ化するShapeを指定できれば良いですが
多分難しいでしょうから、Selection を使い ユーザーが選択したShapeに対しGroup化をするのが
現実的ではないでしょうか。
 
Sub Sumple2()
    On Error Resume Next
    ActiveWindow.Selection.ShapeRange.Group
End Sub

投稿日時: 20/09/09 15:35:09
投稿者: QooApp

ご連絡が遅くなってすみません。
Suzu様、ご教授ありがとうございます。
 
VBであることを申し伝え忘れておりました。申し訳ございませんでした。
わざわざ複数のオブジェクトをSelectする必要がないというのは想像しませんでした。
 
ご指摘いただいている通り、グループ化できるオブジェクトできないオブジェクトという説明等たりておりませんでした。
 
ご掲示いただいたコードを元に作りましたら無事にグループ化叶いました。
大変勉強になりました。ご教授ありがとうございます。