GoGoマクロのブログ

初心者向けマクロ講座「Go!Go!マクロ」の筆者三太郎の公式ブログです。

図形を操作するマクロ(の補足)

2010-05-05 01:24:53 | マクロ作成のコツ
                   にほんブログ村 IT技術ブログへ



今回作成した図形操作のプログラム中の

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)




最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。