インストールレスプログラミング( ´ー`)

VBA , JavaScript , HTAなど 365アプリはインストール必要ですが、仕事に無いケースはほぼないから(・_・;)

Powerpoint VBAでわからないこと

ExcelVBAとの付き合いはけっこう長いのですが,

PowerpointVBAとの付き合いは ここ二ヶ月くらいです。

データの処理をするならやはりExcelですが,こと教材を作ろうというときはPowerpointVBA優勢です。

マクロがなくてもかなりのことができるソフトですしね,あたりまえといえば当たり前なのかも。

何か作りたいと思ったときに対応できるように,いろんなケースを想定してみて,
試しに作ってみるという作業をしています。


たくさん図形をコードで描かせて消すという作業をするので,次のようなコードをよく書きます。

Option Explicit

Sub a()
Dim x As Shape
For Each x In ActivePresentation.Slides(1).Shapes
    x.Delete
Next
Set x=Nothing
End Sub

f:id:chemiphys:20161231221355p:plain

わたしの経験では,このコードでこのスライド内のすべての図形を消してくれるはずなんですが,

結果は次の通り
f:id:chemiphys:20161231221532p:plain

えーっと・・・

しかもたまたまなのか,今までちゃんと考えていませんでしたが見事に奇数の図形だけが消えてます・・・。
もう一回やってみました。
f:id:chemiphys:20161231221729p:plain

見事に法則性がありますね(;´▽`A``

今まで適当に考えてて,これをさらに do ~ loop until activepresentation.slides(1).shapes.count=0

みたいに囲んで強引にやってたんですが,for each ステートメントに不安を感じざるを得ません。

ただ,deleteではなく debug.print x.name とかはうまくいくんですよね。

消すときにidが減っていって うまく処理ができてないとか わたしら初心者レベルの不具合でも内部にあるのか・・・?

誰か解決法を知っていたらぜひ教えてください_(._.)_

そうそう,これを書いてて気づいたんですが,パワーポイントのほうは,

マクロも 元に戻す 効くんですね。驚き。びっくりしました。

追記 あたりまえではありますが,

Sub b()

Dim i As Long
For i = 1 To ActivePresentation.Slides(1).Shapes.Count
    ActivePresentation.Slides(1).Shapes(1).Delete
Next

End Sub

Sub c()

Dim i As Long
For i = ActivePresentation.Slides(1).Shapes.Count To 1 Step -1
    ActivePresentation.Slides(1).Shapes(i).Delete
Next

End Sub

で消すことはできました。でも,for each ● in ●s ~ next ってとても好きなので,それが動かないのはイヤダナァ。