ホチキス先生の「プログラマーと呼ばれたい」

InfoPath & SQL Server !

エクセルのマクロで図形を操作する(4) – オートシェイプを消去する

leave a comment »

ではエクセルのシートに作ったオートシェイプを消去するにはどうすればいいだろうか。オートシェイプを削除するには、deleteメソッドが使えるはずだ。試しに次の2つのマクロを作ってみよう。

————————————————————————

Sub smaile()
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 10, 20, 100, 100
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 120, 20, 100, 100
End Sub

————————————————————————

Sub delete()
Sheet1.Shapes(1).delete
Sheet1.Shapes(2).delete
End Sub

————————————————————————

最初のマクロでは、スマイルのオートシェイプを2つ作っている。これら2つのオートシェイプはそれぞれShapes(1)とShapes(2)という番号で管理されている。そして次のマクロでは、そのShapes(1)とShapes(2)に対して消去のDeleteメソッドを実行している。だが残念ながらこのマクロは、消去するときにエラーになる。ひとつめのシェイプを消去した後「指定したコレクションに対するインデックスが境界を越えています。」というメッセージが出るはずだ。なぜかといえば、Shapes(1)を消去したときに、自動的にShapes(2)がShapes(1)になってしまうからだ。そこで消去する順番は、まず数字の大きいShapes(2)を消去し、その次にShapes(1)を消去する、というようにすればいい。次のマクロは正しく動くだろう。

————————————————————————

Sub smaile()
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 10, 20, 100, 100
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 120, 20, 100, 100
End Sub

————————————————————————

Sub delete()
Sheet1.Shapes(2).delete
Sheet1.Shapes(1).delete
End Sub

————————————————————————

あるいは次のように、Shapes(1)を二回消去する、というようにしてもうまく消去できる。

————————————————————————

Sub smaile()
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 10, 20, 100, 100
ActiveSheet.Shapes.AddShape msoShapeSmileyFace, 120, 20, 100, 100
End Sub

————————————————————————

Sub delete()
Sheet1.Shapes(1).delete
Sheet1.Shapes(1).delete
End Sub

————————————————————————

Written by Yoshio Matsumoto

2010年12月25日 @ 7:01 PM

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。