こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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」で作った線は消したくないんです。
それぞれの線を認識してくれるかな?と思ったのですが・・・本には書いてないし、ヘルプでもわからなかったのです。
その方法とかなにかいい方法がありましたら、教えてください。
よろしくお願いします。

投稿日時 - 2004-06-12 19:28:10

QNo.889833

困ってます

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

個々の図形に対し、それを作ったボタン名を覚えておく必要があります。
しかし、モジュール内で配列に格納したり、モジュール変数に格納したりすると、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

投稿日時 - 2004-06-13 03:47:07

お礼

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

投稿日時 - 2004-06-13 23:01:51

ANo.4

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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つ、円が加わっても同じです。作ったときを捉えて名前等を掴めば、後で抹消したい際に、それを使えば良い。どう言う仕組みで渡すかは、考えてください。
これらのオブジェクト名は抹消して再度作ると、名前が変ると言う,いやな仕組みなのはご存知のとおり。それに対しては、その都度渡しているので、対応できている。
以上をたたき台にして、質問点に対する洩れや、ズレを補足していただければ、答えていただく方への参考になるでしょう。

投稿日時 - 2004-06-12 22:35:28

お礼

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

投稿日時 - 2004-06-13 01:00:24

ANo.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

投稿日時 - 2004-06-12 22:19:39

お礼

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

投稿日時 - 2004-06-13 00:51:36

ANo.1

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

投稿日時 - 2004-06-12 22:00:35

お礼

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

投稿日時 - 2004-06-13 00:41:59

あなたにオススメの質問