• ベストアンサー

VBAで指定した図形の削除

VBAで以下のような表をよんで、図形を書きます。 図形 数値 数値 丸1 10 10 丸2 20 20 ボタン1 丸3 30 30 丸4 40 40 ボタン2 線1 50 50 線2 60 60 ボタン3 線3 70 70 線4 80 80 ボタン4 などと配置されています。図形とか数値は適当です。 表の数値は今後変わることがあります。 その時に、それぞれのボタンを押して作り直したいのですが、たとえば「ボタン3で作った線」とか「ボタン2で作った丸」を認識して作り直すってことできるんでしょうか? 「丸だけを認識して全部消す」というのはできるのですが、「ボタン3で作った線だけを消す」っていうことはできるんでしょうか?その時「ボタン4」で作った線は消したくないんです。 それぞれの線を認識してくれるかな?と思ったのですが・・・本には書いてないし、ヘルプでもわからなかったのです。 その方法とかなにかいい方法がありましたら、教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.4

個々の図形に対し、それを作ったボタン名を覚えておく必要があります。 しかし、モジュール内で配列に格納したり、モジュール変数に格納したりすると、Bookを保存した後、再度呼び出すと、どうしようもありません。(復元できない) シートに書き出すことも考えられますが、読み込んで関連付けるのが面倒です。 結局、各図形に、それを作ったボタンが識別できる名前をつけるのが手っ取り早いでしょう。 また、消す手段も問題になります。 下ではトグルボタンを使ってみました。書くことと消すことが1つのボタンで可能です。 押せば図形を書き、戻せば図形を消します。 図形ごとに  ・図形名  ・書きたい図形  ・トグルボタンのCaption を2箇所 を書き換える必要があります。 図形をVBAで操作できると世界が広がります。(オーバー?)おもしろいところでもあります。頑張って下さい。 下のコードはシートのコードウインドウに書いて動作確認しています。(Excel2000) '// トグルボタンで図形を書く-1(Caption=楕円1 描画) 例 Private Sub ToggleButton1_Click()   Const parentName = "shp_Tog01"   '// 図形名      With ToggleButton1     If .Value = True Then       '// 書きたい図形       ActiveSheet.Shapes.AddShape(msoShapeOval, 120, 100, 50, 75).Select       Selection.Name = parentName       .Caption = "楕円1 削除"   '// トグルボタンのCaption     Else       Call shapeDelete(parentName)       .Caption = "楕円1 描画"   '// トグルボタンのCaption     End If     .BottomRightCell.Select   End With End Sub '// トグルボタンで図形を書く-2(Caption=四角形1 描画) 例 Private Sub ToggleButton2_Click()   Const parentName = "shp_Tog02"   '// 図形名      With ToggleButton2     If .Value = True Then       '// 書きたい図形       ActiveSheet.Shapes.AddShape(msoShapeRectangle, 200, 50, 100, 50).Select       Selection.Name = parentName       .Caption = "四角形1 削除"   '// トグルボタンのCaption     Else       Call shapeDelete(parentName)       .Caption = "四角形1 描画"   '// トグルボタンのCaption     End If     .BottomRightCell.Select   End With End Sub   '// 指定した名前の図形を消去するモジュール   Sub shapeDelete(ByVal shpNM As String)     Dim shp As Shape    '// 図形          For Each shp In Shapes       If shp.Name = shpNM Then         shp.Delete       End If     Next   End Sub

quincy
質問者

お礼

回答ありがとうございます。教えて頂いて、なんか自分の目指しているところが身の程知らずに難しいのだと気が付きました。実は回答を読んでいて「トルグボタン」の存在すらもよくわかっていませんでした。他の方もレベルの高くてついていけない自分を恥じております。トルグボタンは使えないかもしれませんが、普通のボタンで何とかならないかな?と今思っています。ありがとうございました。参考にして頑張ります。

その他の回答 (3)

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

エクセルは数値文字列を主に扱うソフトと思います。 それに対し本件はCAD紛い(まがい)のことをもくろんでいるのでしょうか。なんか過大な目論見のような雰囲気ですが。数値とあるのは半径や長さや位置を示す 数値ですか。ボタン1とかは文字列で表のセルに入っているのでしょうね。 さて「ボタン」とはコマンドボタンのことだとして、これは表の直前行の図形を描くキッカケのためにあるものとして解釈し、シートにボタン1とボタン2(質問中の番号と関係なし)を貼りつけるとします。 パブリック変数で Public b1 コマンドボタン1のクリックイベントに Private Sub CommandButton1_Click() ActiveSheet.Shapes.AddLine(57#, 42.75, 118.5, 78#).Select b1 = Selection.Name MsgBox b1 End Sub コマンドボタン2のクリックイベントに Private Sub CommandButton2_Click() ActiveSheet.Shapes(b1).Delete MsgBox b1 End Sub を設定します。 (MsgBox b1は確認のため入れているもので、納得すれば、あとでは外してください。) これでボタン1を押すと、直線が引かれ、ボタン2を押すと「その線が!」消えます。 ただボタン2はボタン1による線が引かれていない時に クリックするとエラーになるなど(私の力不足ととりあえずということで)無防備です。 違うモジュールに値を伝える(渡す)のに、パブリック変数を使っていることなど、小生がそれ以外良く知らないだけです。改良してください。 しかし質問のパターンには答えていると思います。 そのオブジェクト名を掴んで抹消のルーチンに渡せば良いわけです。1直線の例ですが、直線2つ、円が加わっても同じです。作ったときを捉えて名前等を掴めば、後で抹消したい際に、それを使えば良い。どう言う仕組みで渡すかは、考えてください。 これらのオブジェクト名は抹消して再度作ると、名前が変ると言う,いやな仕組みなのはご存知のとおり。それに対しては、その都度渡しているので、対応できている。 以上をたたき台にして、質問点に対する洩れや、ズレを補足していただければ、答えていただく方への参考になるでしょう。

quincy
質問者

お礼

回答ありがとうございます。いえ・・・何も目論んでおりません。それどころか言われるがまま必死になってVBAを作っている日々です。大それたことなんて考えもつきません(笑)いろいろ考えて頂いてありがとうございます。応用したいと思います。本当にありがとうございました。。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

用途が良くわかりませんが、作ったシェイプ名を何処かに取っておいて削除してから作るとか、、、 Private Sub CommandButton1_Click() Dim sh As Shape  For Each sh In ActiveSheet.Shapes   If ActiveSheet.Range("IV1").Value = sh.Name Then     sh.Delete     Exit For   End If  Next sh  With ActiveCell   ActiveCell.Activate   Set sh = ActiveSheet.Shapes.AddShape _        (msoShapeFlowchartExtract, _        .Left, .Top, .Width, .Height)   ActiveSheet.Range("IV1").Value = sh.Name   .Offset(1, 0).Activate  End With End Sub

quincy
質問者

お礼

いつも回答ありがとうございます。三角ができました。用途は・・・・なんなんですかね、私もただ人に言われるまま、それが可能か不可能かすらもわからず、返事だけしていろいろ調べてわからなくて、こちらで教えて頂いて、情けない日々を送っております。早く並のレベルになるよう頑張ります。ありがとうございました。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

簡単なサンプルだけですが、 dim a(4) Set a(3) = ActiveSheet.Shapes.AddLine(x3,y3, xx3, yy3) しておいて、 a(3).Delete で消えると思います。

quincy
質問者

お礼

一番に回答ありがとうございます。消えました!完璧です。簡単なサンプルでわかりやすかったです。ありがとうございます。

関連するQ&A