Powerpoint VBAを使おう!

Powerpoint VBAやExcelのVBAで遊んでいます。Word VBAも始めました。

パワーポイントの図形のインデックスについて

図形のグループ化について,飽きもせずいろいろと確認作業をしているんですが,

名前でグループ化は前回の記事のようにできるようになりました。

でも,問題はあります。

コピー貼り付けすると,同じ名前の図形が大量に発生するんですよね。図形の名前は万能ではない。

やっぱりインデックスが無いと制御できないこともあるよなーと思いました。。ということで,調べてました。

解決法は見つからなかったんだけど,IDはどうも一意的な値,For eachを回すと,インデックス順にIDを取得できる。

Sub b()
Dim TargetSlide As Slide: Set TargetSlide = ActivePresentation.Slides(1)
Dim ShapeID() As Long
ReDim ShapeID(1 To TargetSlide.Shapes.Count, 1 To 2)

Dim i As Long: i = 1
Dim s As Shape
For Each s In TargetSlide.Shapes
    ShapeID(i, 2) = i
    ShapeID(i, 1) = s.Id
    i = i + 1
Next
'この時点でShapeID(i,1)にShapeのID,ShapeID(i,2)にインデックスが入るのでIDからインデックスを知ることができる。

Dim col As New Collection: Set col = New Collection
For Each s In TargetSlide.Shapes
    If s.Left > 200 And s.Left + s.Width < 600 Then
        col.Add s.Id
    End If
Next

Dim arr() As Long: ReDim arr(1 To col.Count)

Dim j As Long
For i = 1 To col.Count
    For j = 1 To TargetSlide.Shapes.Count
        If col(i) = ShapeID(j, 1) Then
            arr(i) = ShapeID(j, 2)
        End If
    Next
Next

TargetSlide.Shapes.Range(arr).Group

End Sub

試しに寝る前に急いで作ったんですが,
配列にID,インデックス変換データを持たせる。

ある条件に該当する特定の図形,状況によると思いますが,今はLeftプロパティで図形をとりあえず選んでる。
数はわからないので,こういうのはコレクションに放り込む。今回はグループ化目的なので中には楽にするようにIDを放り込む

さいごにグループ化するために,IDからインデックスを決めて,arr()に入れていって,最後にそれでグループ化

これなら同じ名前のやつでもいけるような気がする。
f:id:chemiphys:20170206001613p:plain
たくさん図形はあるけど名前は三種類 Shp1 Shp2 Shp3 のみ。

名前でグループ化は大変ですが,みた感じできてるぽいです。

これをもっと,スマートにやれば,インデックスわからない問題なんとかならないかなー

気になったから一気にどたばた書きましたが,寝ないと ε≡≡ヘ( ´Д`)ノ