DrawingObjects … ちまちま vs 一気

DrawingObjects 一族(Buttons や Lines とか)は、ループでちまちまと処理した場合とコレクションに対して一気に処理した場合で結果が違うことがあるようです。

Sub Macro1()
  Dim i As Object
  For Each i In ActiveSheet.DrawingObjects
    i.Delete
  Next i
End Sub

Sub Macro2()
  ActiveSheet.DrawingObjects.Delete
End Sub

上の2つのマクロは一見同じ結果になるように思えます。
いや、余計なことをしなければ事実同じ結果になります。
 
しかし、、、不可視のオブジェクトがいると、そうでもないことが分かります。
Macro1 は可視/不可視に関わらずオブジェクトを削除しますが、Macro2 は可視のオブジェクトしか削除しません。
 
このことを応用すれば、例えばシート上にボタンを置いて、そのボタンをクリックしたら、そのボタン以外のそのシート上の図形を全て削除したいなんて場合に

Sub Button_Click()
  With ActiveSheet
    .Buttons(Application.Caller).Visible = False
    .DrawingObjects.Delete
    .Buttons(Application.Caller).Visible = True
  End With
End Sub

と、さっくりと書くことができます。
 
※.Excel World の 2007年2月19日 12:39 の日記をコピーしています。
http://excel.sns.fc2.com/excel/