• 締切済み

[エクセル2007] 図形を非表示にするマクロ

図形「図A」を非表示にするマクロがあります。 Sub 図削除() ActiveSheet.Shapes("図A").Visible = False End Sub これを図A、図B、図C・・・・・・と増やしていく場合はどうすれば良いのでしょうか? Sub 図削除() ActiveSheet.Shapes("図A").Visible = False ActiveSheet.Shapes("図B").Visible = False ActiveSheet.Shapes("図C").Visible = False            ・            ・             ・ End Sub とするしかないのでしょうか?

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

オブジェクトの特定は (1)名前 (2)インデックス番号 (3)For Each などがある。 (2)は Sub test01() MsgBox ActiveSheet.Shapes.Count For i = 1 To ActiveSheet.Shapes.Count MsgBox ActiveSheet.Shapes(i).Name Next i End Sub のような例で判るでしょう。 ただ対象Shapesのすべてか、Activesheetに色々な種類を含んでいる場合は、その一部か(混在の種類など)で、とらえる難しさが違う。 その点質問に何も書いてないが、プログラマの必須思考である、何に基づいて区別して、その図形を「Visible = False」にするのか意識が質問者には足りない。コードを節約するには、そういう思考が必要。名前列挙主義は造成などで区別が出来ない場合の、最後の手段。 本質問ではVisible = Falseにするオブジェクトを名前以外の属性で掴まないといけないでしょう。 そうしないと名前列挙型になってしまう(msoPictureだけすべて非表示とか)。 インデックス番号は直ぐにはわからないから、名前によって特定することになろう。 その際Typeで区別しより分けなければならないことがあろう。 Typeの下の種類(オートシェイプの種類)でわけて識別する必要があるかも。 結構ややこしくて難しいと思う。 参考 http://www.asahi-net.or.jp/~zn3y-ngi/YNxv212_ShapesType_tbl.html またmsoAutoShapeの中にも種類がある。 ーー Sub myName() Dim obj As Object For Each obj In ActiveSheet.DrawingObjects MsgBox obj.Name Next End Sub とDrawingObjectsも在る。

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.1

たとえば sub macro1()  dim s as shape  for each s in activesheet.shapes   s.visible = false  next end sub たとえば sub macro2()  dim s as shape  for each s in activesheet.shapes   if s.name like "図*" then    s.visible = false   end if  next end sub といった具合に「変数」を使って「繰り返し」や必要に応じて「条件分岐」を行うマクロを書きます。 #参考 画像を挿入したのであれば sub macro3()  activesheet.pictures.visible = false end sub といった事でやりたかったことができるかも?しれません。