プロが教えるわが家の防犯対策術!

皆様おはこんばんちわ。
セル(Ex.B2,B3,B4)をダブルクリックする度に、そのセル内にオートシェイプを描画/削除したいのです。
描画は下記(で良いのかですが)で出来たのですが、削除がどうしてもわかりません。
-------------------------------------------------------------------------
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, Range("B2:B4")) Is Nothing Then Exit Sub

With ActiveCell
With ActiveSheet.Shapes.AddShape _
(msoShapeOval, .Left, .Top, .Width, .Height)
.Fill.Visible = msoFalse
.Line.Weight = 1.75
.Line.ForeColor.SchemeColor = 0
End With
End With
End Sub
-------------------------------------------------------------------------
既に図形があるセルをダブルクリックで削除するにはどの様な方法があるのでしょうか。

バージョンはExcel2007です。
皆様よろしくご教示ください。

A 回答 (3件)

オートシェイプ描画時に自身を削除する(Wクリックでは無くクリックになってしまいますが)マクロを仕込む方法があります。

リンク先の#3ですが、コードが(おそらく実行時間も)短いのがメリットです。
http://oshiete.goo.ne.jp/qa/5496600.html
1.ダブルクリックでセル内に楕円を描く(ご質問には合わせておらず、以前回答したままです、OnActionのところにご注目下さい。)
これはシートモジュールに記述
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
With Target
.Parent.Shapes.AddShape(msoShapeOval, .Left, .Top, .Width, .Height).Select
End With
With Selection
.ShapeRange.Fill.Visible = msoFalse
.OnAction = "eraseShape"
End With
End Sub

2.消すときはダブルクリックではなく、クリックになってしまいますが、こちらは標準モジュールに記述してください。(Module1など)
Sub eraseShape()
ActiveSheet.Shapes(Application.Caller).Delete
End Sub

こちらは少々やりとりが長いですが、一般的なシート内の全図形をスキャンして、セル位置が合致したら削除する方法を含んでいます。(我田引水)
http://oshiete.goo.ne.jp/qa/8241405.html

この回答への補足

mitarashiさま
いつも斬新で美しいコーディング誠に有難う御座います♪
同様の質問を検索はしていたのですが、見つける事が出来ず質問してしまいました。
それなのに、丁寧に解説までして頂いて^^

セルに楕円(Aとします)がある状態で、他のセルをダブルクリック(Bとします)すると
楕円Aのサイズ?位置?が動いてしまいました。
楕円Bをクリックで消去すると楕円Aは元に戻ります。
これは、Excel2007だからなのでしょうか?
mitarashiさまの方でもご確認出来ますでしょうか?

補足日時:2014/12/01 20:29
    • good
    • 0
この回答へのお礼

mitarashiさま
お礼が遅れてしまいました。
希望以上のご提案ありがとうございました♪

オートシェイプがぴょこぴょこ動く件についてご報告です。
下記の通り、私のPCがおかしいのかも知れません...
・画面の表示倍率を大きく(130%~180%)して動作確認をしていました。
  →100%に戻してから拡大すると正しい位置に楕円が表示されている。(200%だとピコピコしない)
  →印刷プレビューすると正しい位置にあり、シートに戻ったら正しい位置に表示されている。
   (楕円が二重に表示されていても、操作後は1個になっている)

お騒がせ致しました<(_ _)>

お礼日時:2014/12/04 22:37

#2です。

過分なお言葉をいただき恐縮です。
既存の楕円がちょこっと動く現象は確認できませんでしたが(当方xl2010です)
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
の中に、
Cancel = True
を加える方が紛れが少ないと思います。
この場合、Wクリックによりセルが編集状態になるのをCancelする働きをします。
ご参考まで。
<参考>「VBA Cancel=true」で検索すると、多数見つかります
http://www.excel.studio-kazu.jp/kw/2009081222365 …
イベントのカスタマイズのコードは初めてみました...
http://www.ken3.org/vba/backno/vba060.html
フォームを閉じるボタンのキャンセル等に使いますね

この回答への補足

書き忘れ。。
OnActionについては、発想がすごいって事しか言えないです(^-^)

補足日時:2014/12/06 18:52
    • good
    • 0
この回答へのお礼

mitarashiさま
こんばんは。
質問のコードには、Cancel=Trueを消してしまっていたので色々と考察させていまいすみませんでした。
何をキャンセルするのかは明確には解っていませんでした。。。
以前、試しにfalseにしセルが編集出来た。。位で終わっていました。

>イベントのカスタマイズのコードは初めてみました...
おっしゃっている意味がわかりません(T_T)
昨夜も調べていましたがクラスモジュールでつまづいていて...
初めて見られたって事は、VBはかなーり深いものなのですね。

フォームを作った時、×の事は気にしていなかったり。。。
いつまでも質問者に徹します。

お礼日時:2014/12/06 18:45

以下のページを参考にしてみてください。



インストラクターのネタ帳
選択したセル範囲に含まれる図形を削除するマクロ
http://www.relief.jp/itnote/archives/018407.php
    • good
    • 0
この回答へのお礼

kkkkkmさま
早速のご回答ありがとうございました。
描画と削除を交互に行うのがポイントでしたが、参考になりました。

お礼日時:2014/12/01 20:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています