Wordの文書上にある全ての図形を削除するマクロを考えます。
「ActiveDocument.Shapes」を使うとアクティブな文書(Document)にある図形を取得できます。
まず思い付く方法は「For Each」を使って処理する方法です。次のようなコードになります。
Sub shape_delete_bad()
Set myshapes = ActiveDocument.Shapes
For Each s In myshapes
s.Delete
Next
End Sub
Set myshapes = ActiveDocument.Shapes
For Each s In myshapes
s.Delete
Next
End Sub
しかし正しく処理されません。一つおきに削除されます。
次のように考えられます。
「For Each」ループで、まず1番目の図形を削除します。
次に2番目の図形を削除しますが、先程の図形削除後の2番目なので元の順番では3個目の図形です。
この結果、元の2個目の図形が残ってしまいます。
これを踏まえて次のようなコードを考えます。
「Do While」ループを使い、図形の個数が0より大きいときだけ処理します。個数が0になれば終了です。
Sub shape_delete_1()
Set myshapes = ActiveDocument.Shapes
Do While myshapes.Count > 0
myshapes(1).Delete
Loop
End Sub
Set myshapes = ActiveDocument.Shapes
Do While myshapes.Count > 0
myshapes(1).Delete
Loop
End Sub
もう一つの方法は次の通りです。
最後の図形から最初の図形まで遡るようにして処理します。
Sub shape_delete_2()
Set myshapes = ActiveDocument.Shapes
For i = myshapes.Count To 1 Step -1
myshapes(i).Delete
Next i
End Sub
Set myshapes = ActiveDocument.Shapes
For i = myshapes.Count To 1 Step -1
myshapes(i).Delete
Next i
End Sub
コメント