Excel VBA質問箱 IV

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

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


5954 / 13645 ツリー ←次へ | 前へ→

【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 お礼[未読]

【47993】オートシェイプにマクロを登録…
質問  初心者  - 07/3/29(木) 14:08 -

引用なし
パスワード
   はじめまして。
最近VBAを始めた者で、あまり詳しくないので分かり図らいと思いますが宜しくお願いします。
無理な事かも知れないのですが、教えて下さい。
まず、四角オートシェイプを押すと数本の直線オートシェイプが出でくるようにマクロを作成しました。
その四角オートシェイプをコピーでもう1ヶ所に作り、2個目の四角オートシェイプを押すと1個目の四角オートシェイプの所に直線オートシェイプが出てくるのですが、2個目の四角オートシェイプの所に出てくるようにする事は可能なのでしょうか?
四角オートシェイプは何個も必要で1つ1つマクロを作成する事が大変なので、コピーでなく簡単に増やせる方法があれば、教えて下さい。
宜しくお願いします。

【47996】Re:オートシェイプにマクロを登録…
回答  りん E-MAIL  - 07/3/29(木) 14:45 -

引用なし
パスワード
   初心者 さん、こんにちわ。

>その四角オートシェイプをコピーでもう1ヶ所に作り、2個目の四角オートシェイプを押すと1個目の四角オートシェイプの所に直線オートシェイプが出てくるのですが、2個目の四角オートシェイプの所に出てくるようにする事は可能なのでしょうか?

Application.Callerでどの図形から呼ばれたものかを分岐します。
Sub test()
  Dim sh1 As Shape, sh2 As Shape, ws As Worksheet
  Set ws = Application.ActiveSheet
  '
  If TypeName(Application.Caller) = "String" Then
   'クリックされた図形をセットします
   Set sh1 = ws.Shapes(Application.Caller)
   'その図形の位置を基準に線(終点→)を引きます
   With sh1
     With ws.Shapes.AddLine(.Left + .Width, .Top + .Height \ 2, .Left + .Width * 2, .Top + .Height \ 2)
      .Line.EndArrowheadLength = msoArrowheadLong
      .Line.EndArrowheadWidth = msoArrowheadWide
      .Line.EndArrowheadStyle = msoArrowheadStealth
     End With
   End With
  Else
   MsgBox "Clickで呼んでいない" '直接実行するとエラーになるので除外
  End If
  '
  Set sh1 = Nothing: Set sh2 = Nothing
  Set ws = Nothing
End Sub
こんな感じです。
分岐方法の詳細はCallerプロパティのヘルプを見てください。

四角形から横方向に→を出すマクロです。
オートシェイプの四角形をシートに置き、マクロを登録します。
その登録後の四角形をいろんなところにコピーしてクリックしてみてください。

【47997】Re:オートシェイプにマクロを登録…
お礼  初心者  - 07/3/29(木) 15:07 -

引用なし
パスワード
   りんさん こんにちわ。
返信ありがとうございます。大変助かりました。
思い通りにできました。本当にありがとうございました。

【48000】Re:オートシェイプにマクロを登録…
質問  初心者  - 07/3/29(木) 16:22 -

引用なし
パスワード
   度々すみません。
図形から線を上に出したいのですが、方法がわかりません。
もし、コードの勉強が出来るサイト等をご存知であればご紹介願いたいのですが…。

【48006】Re:オートシェイプにマクロを登録…
回答  りん E-MAIL  - 07/3/29(木) 22:02 -

引用なし
パスワード
   初心者 さん、こんばんわ。

>図形から線を上に出したいのですが、方法がわかりません。

AddLineの引数で、線を引く位置を指定します。
Sub test()
  Dim sh1 As Shape, sh2 As Shape, ws As Worksheet
  Set ws = Application.ActiveSheet
  '
  If TypeName(Application.Caller) = "String" Then
   'クリックされた図形をセットします
   Set sh1 = ws.Shapes(Application.Caller)
   'その図形の位置を基準に線(終点↑)を引きます
   With sh1
     'AddLineの引数の意味はヘルプで見てね
     With ws.Shapes.AddLine(.Left + .Width / 2, .Top , .Left + .Width / 2, .Top - .Height)
      .Line.EndArrowheadLength = msoArrowheadLong
      .Line.EndArrowheadWidth = msoArrowheadWide
      .Line.EndArrowheadStyle = msoArrowheadStealth
     End With
   End With
  Else
   MsgBox "Clickで呼んでいない" '直接実行するとエラーになるので除外
  End If
  '
  Set sh1 = Nothing: Set sh2 = Nothing
  Set ws = Nothing
End Sub

>もし、コードの勉強が出来るサイト等をご存知であればご紹介願いたいのですが…。
コードの勉強はここを含めたQ&Aサイトや、「VBAテクニック」をうたってるサイトでできると思いますよ。

【48007】Re:オートシェイプにマクロを登録…
発言  toshi  - 07/3/30(金) 0:48 -

引用なし
パスワード
   ▼りん さん:
こんばんわ
ちょっと興味があるので質問させて下さい
1回目は線を書き2回目のクリックで線をけすには
どのような修正が必要なのでしょうか?
ご教授お願いします。
>
>>図形から線を上に出したいのですが、方法がわかりません。
>
>AddLineの引数で、線を引く位置を指定します。
>Sub test()
>  Dim sh1 As Shape, sh2 As Shape, ws As Worksheet
>  Set ws = Application.ActiveSheet
>  '
>  If TypeName(Application.Caller) = "String" Then
>   'クリックされた図形をセットします
>   Set sh1 = ws.Shapes(Application.Caller)
>   'その図形の位置を基準に線(終点↑)を引きます
>   With sh1
>     'AddLineの引数の意味はヘルプで見てね
>     With ws.Shapes.AddLine(.Left + .Width / 2, .Top , .Left + .Width / 2, .Top - .Height)
>      .Line.EndArrowheadLength = msoArrowheadLong
>      .Line.EndArrowheadWidth = msoArrowheadWide
>      .Line.EndArrowheadStyle = msoArrowheadStealth
>     End With
>   End With
>  Else
>   MsgBox "Clickで呼んでいない" '直接実行するとエラーになるので除外
>  End If
>  '
>  Set sh1 = Nothing: Set sh2 = Nothing
>  Set ws = Nothing
>End Sub
>
>>もし、コードの勉強が出来るサイト等をご存知であればご紹介願いたいのですが…。
>コードの勉強はここを含めたQ&Aサイトや、「VBAテクニック」をうたってるサイトでできると思いますよ。

【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で切り替える方がいいと思います。

【48009】Re:オートシェイプにマクロを登録…
お礼  初心者  - 07/3/30(金) 8:44 -

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

何度も何度も優しく教えて頂き、本当にありがとうございます。
昨日参考書を買い、少しばかり今回のコードを理解できたような気がします。
まだ、これからドンドン覚えていきたいと思います。
本当にありがとうございました。

【48015】Re:オートシェイプにマクロを登録…
お礼  toshi  - 07/3/30(金) 15:22 -

引用なし
パスワード
   ▼りん さん:
こんにちわ
わがままな質問に答えていただきありがとうございました。
思い通りの動きです。
感激です。
また、お願いします。

>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で切り替える方がいいと思います。

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