読者です 読者をやめる 読者になる 読者になる

Powerpoint VBAを使おう!

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

For each delete next 調べてみた

さて,前回の記事で結局Excelではどうなっているのか気になったので,調べてみようと思いました。

図形のIDを追っていけば,内部仕様が少しはわかるかな,という感じ。

さて,コレクションの仕組みから考えて妥当であろうというPowerpoint,Wordではこのような感じ。

f:id:chemiphys:20170314225357p:plain
このようにいくつか図形を置いておいて,

Sub test()

Dim s As Shape
Dim sht As Document: Set sht = ActiveDocument
Dim i As Long: i = 1
Dim j As Long
ActiveDocument.Paragraphs.Add
For Each s In sht.Shapes
    For j = 1 To sht.Shapes.Count
       sht.Paragraphs(i + 1).Range.Text = sht.Paragraphs(i + 1).Range.Text & j & ":" & sht.Shapes(j).ID & "_"
    Next
    sht.Paragraphs.Add
    s.Delete
    i = i + 1
Next
End Sub

ワードでなにも目印が無いところに書きこませるのとっても苦手です。

f:id:chemiphys:20170314225452p:plain

奇数の図形IDを持つ図形が消されずに取り残されていくさまがわかります。

さて,Excel。こっちはセルがあるから書くの楽。

f:id:chemiphys:20170314225725p:plain

Sub test()

Dim s As Shape
Dim sht As Worksheet: Set sht = ActiveSheet
Dim i As Long: i = 1
Dim j As Long
For Each s In sht.Shapes
    For j = 1 To sht.Shapes.Count
       sht.Cells(i, j) = "'" & j & ":" & sht.Shapes(j).ID
    Next
    s.Delete
    i = i + 1
Next
End Sub

f:id:chemiphys:20170314225800p:plain

削除する部分に関しては,全く同じように書いているのにも関わらず,Excel側はきれいに小さいIDのものから消しています。

パワーポイントやワードでこのように消していくためには,Shapes(1)をずっと消していくという書き方に対する挙動をしているようですね。

そりゃあちゃんと消えるわ。

うん。

でも,

なんでExcelだけそうなの?

どういう仕組みなんでしょうね。。

コレクションに慣れたらむしろこっちのほうが気持ち悪い(;´▽`A``