今回作成した図形操作のプログラム中の
ActiveSheet.Shapes.Range(Array("Group 4", "Text Box 5", "Text Box 6")).Select
この部分ですが、
各図形を一旦削除してまた作成すると、名前は都度変わりますので、
カッコの中もその都度変えていかなければならずに不都合ですので、
その場合は以下のように、まず(作成した順に割り振られる図形番号
というものを用いて、)図形の数分の名前を取得して
s1 = ActiveSheet.Shapes(1).Name
s2 = ActiveSheet.Shapes(2).Name
s3 = ActiveSheet.Shapes(3).Name
ActiveSheet.Shapes.Range(Array(s1, s2, s3)).Select
このようにすれば、毎回カッコの中を変えるという必要がなくなりますし、
また、今回のようにグループ化したものを含めてシート上に3つの図形が
あるという場合の図形の削除方法としては、マクロの記録では
ActiveSheet.Shapes("Group 4").Select
Selection.Delete
ActiveSheet.Shapes("Text Box 5").Select
Selection.Delete
ActiveSheet.Shapes("Text Box 6").Select
Selection.Delete
このように名称でセレクトされた記述となりますが、これも図形番号を
用いてやると
ActiveSheet.Shapes(1).Select
Selection.Delete
・
・
このように書き直すことができます。
但し、削除する場合の注意点として、若い番号の図形を削除すると
図形番号は前に詰まる。というちょっとややこしい原則がありますので、
ActiveSheet.Shapes(1).Select
Selection.Delete
ActiveSheet.Shapes(2).Select
Selection.Delete
ActiveSheet.Shapes(3).Select
Selection.Delete
とするのではなくて、
ActiveSheet.Shapes(1).Select
Selection.Delete
ActiveSheet.Shapes(1).Select
Selection.Delete
ActiveSheet.Shapes(1).Select
Selection.Delete
という具合になります。(もしくは、逆から消していって
ActiveSheet.Shapes(3).Select
Selection.Delete
ActiveSheet.Shapes(2).Select
Selection.Delete
ActiveSheet.Shapes(1).Select
Selection.Delete
としてやると、より安全です。)
ちなみにですが、数が不明な場合にはちょっと特殊なループを回して
For Each obj In ActiveSheet.Shapes
ActiveSheet.Shapes(1).Select
Selection.Delete
Next obj
これですべての図形を一発で削除することができます。(この内容については
上級者レベルの話となりますので今回詳しくは触れません。)
あと余談ですが、注意点としてこうした図形の処理というのはエクセルの
バージョンによって差があり、例えば
本文にも書きましたようにExcel2007のバージョンでは「マクロの記録」で
図形関連の操作の記録はできなくなったという点や、
Excel2003のバージョンでは、複雑な図形処理をしていると(多分に2003固有
のバグで、、)Excel自体が落ちるという現象がよく起こります。
何か複雑で凝った図形処理をしようとする場合にはExcel2002もしくは2000の
古いバージョンの方が、安定して動作します。
>> 関連する応用作品の実行デモを見る(YouTube)