Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


33941 / 76734 ←次へ | 前へ→

【48008】Re:オートシェイプにマクロを登録…
回答  りん E-MAIL  - 07/3/30(金) 8:35 -

引用なし
パスワード
   toshi さん、おはようございます。

>1回目は線を書き2回目のクリックで線をけすには
>どのような修正が必要なのでしょうか?

今回の質問はボタンが複数ということだったので、直線がボタンと関連しているかどうかを楽に判定するために、線を引くときに名前をつけました。

Sub test()
  Dim sh1 As Shape, sh2 As Shape, sh3 As Shape, ws As Worksheet
  Set ws = Application.ActiveSheet
  '
  If TypeName(Application.Caller) = "String" Then
   'クリックされた図形をセットします
   Set sh1 = ws.Shapes(Application.Caller)
   '
   For Each sh2 In ws.Shapes
     If sh2.Name = "Line_" & sh1.Name Then
      Exit For
     End If
   Next
   If sh2 Is Nothing Then
     'その図形の位置を基準に線(終点↑)を引きます
     With sh1
      'AddLineの引数の意味はヘルプで見てね
      Set sh3 = ws.Shapes.AddLine(.Left + .Width / 2, .Top, .Left + .Width / 2, .Top - .Height)
      With sh3
        .Line.EndArrowheadLength = msoArrowheadLong
        .Line.EndArrowheadWidth = msoArrowheadWide
        .Line.EndArrowheadStyle = msoArrowheadStealth
      End With
      '
      sh3.Name = "Line_" & sh1.Name '関連する名前を付けたら判定が楽かなあ
     End With
   Else
     sh2.Delete
   End If
  Else
   MsgBox "Clickで呼んでいない" '直接実行するとエラーになるので除外
  End If
  '
  Set sh1 = Nothing: Set sh2 = Nothing: Set sh3 = Nothing
  Set ws = Nothing
End Sub

これでどうでしょう?
複数の線を引く→消す場合は、あるかないかを判定後、消去もループで処理します。
また、表示を切り替えるだけなら、削除ではなくVisibleで切り替える方がいいと思います。
6 hits

【47993】オートシェイプにマクロを登録… 初心者 07/3/29(木) 14:08 質問
【47996】Re:オートシェイプにマクロを登録… りん 07/3/29(木) 14:45 回答
【47997】Re:オートシェイプにマクロを登録… 初心者 07/3/29(木) 15:07 お礼
【48000】Re:オートシェイプにマクロを登録… 初心者 07/3/29(木) 16:22 質問
【48006】Re:オートシェイプにマクロを登録… りん 07/3/29(木) 22:02 回答
【48007】Re:オートシェイプにマクロを登録… toshi 07/3/30(金) 0:48 発言
【48008】Re:オートシェイプにマクロを登録… りん 07/3/30(金) 8:35 回答
【48009】Re:オートシェイプにマクロを登録… 初心者 07/3/30(金) 8:44 お礼
【48015】Re:オートシェイプにマクロを登録… toshi 07/3/30(金) 15:22 お礼

33941 / 76734 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free