Excel VBA質問箱 IV

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

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


8359 / 13644 ツリー ←次へ | 前へ→

【33723】オブジェクトの選択方法 nn 06/1/19(木) 11:38 質問[未読]
【33727】Re:オブジェクトの選択方法 小僧 06/1/19(木) 14:17 回答[未読]
【33730】Re:オブジェクトの選択方法 nn 06/1/19(木) 15:21 質問[未読]
【33733】Re:オブジェクトの選択方法 小僧 06/1/19(木) 16:22 回答[未読]
【33744】Re:オブジェクトの選択方法 nn 06/1/19(木) 19:47 質問[未読]
【33753】Re:オブジェクトの選択方法 小僧 06/1/19(木) 21:43 回答[未読]
【33779】Re:オブジェクトの選択方法 nn 06/1/20(金) 11:58 お礼[未読]

【33723】オブジェクトの選択方法
質問  nn  - 06/1/19(木) 11:38 -

引用なし
パスワード
   ActiveSheet.Shapes.AddShape(msoShapeRectangle, _
                Range("H28").Left, _
                Range("H28").Top + 4, _
                Int((Range("H28").Width) * 200 / 0.75) * 0.75, _
                Range("H28").Height - 4.5).Select

で書いた四角があります。
それを数個書いて、グラフのように表示させました。
・・っが今度は削除したい図形があるのですが
どのようにしてするのでしょうか?
セルの場所Range("H・・")は決まっていて、・・だけ毎回変わるのですが。

【33727】Re:オブジェクトの選択方法
回答  小僧  - 06/1/19(木) 14:17 -

引用なし
パスワード
   ▼nn さん:
こんにちは。

>ActiveSheet.Shapes.AddShape(msoShapeRectangle, _
>                Range("H28").Left, _
>                Range("H28").Top + 4, _
>                Int((Range("H28").Width) * 200 / 0.75) * 0.75, _
>                Range("H28").Height - 4.5).Select
>
>で書いた四角があります。

四角形を配置する際に名前を管理されてみてはいかがでしょうか。

Sub ShapeAdd()
Dim MyShape As Shape
Dim lngRow As Long

  lngRow = 28
  
  Set MyShape = ActiveSheet.Shapes.AddShape(msoShapeRectangle, _
                Range("H" & lngRow).Left, _
                Range("H" & lngRow).Top + 4, _
                Int((Range("H" & lngRow).Width) * 200 / 0.75) * 0.75, _
                Range("H" & lngRow).Height - 4.5)
  MyShape.Name = "棒" & lngRow
  Set MyShape = Nothing
End Sub


名前の管理ができていれば、

Sub ShapeDel()
  ActiveSheet.Shapes("棒28").Delete
End Sub

お好きな四角形を削除する事が可能だと思います。

【33730】Re:オブジェクトの選択方法
質問  nn  - 06/1/19(木) 15:21 -

引用なし
パスワード
   ▼小僧 さん:
回答ありがとうございます。
これから書く四角についてはこれで出来ると思いますが
既に70個ぐらい図形がかかれており、
その図形を変更したりしたい時に、選択方法がありますが
すべてH列に書かれています。

【33733】Re:オブジェクトの選択方法
回答  小僧  - 06/1/19(木) 16:22 -

引用なし
パスワード
   ▼nn さん:
こんにちは。

>これから書く四角についてはこれで出来ると思いますが
>既に70個ぐらい図形がかかれており、

本来でしたら、0 からやり直す方が良いと思われるのですが…。

Sub シートに配置された四角形を探す()
Dim MyShape As Shape
Dim lngRow As Long

  lngRow = 28

  For Each MyShape In ActiveSheet.Shapes
    If MyShape.Top - (Range("H" & lngRow).Top + 4) >= -0.25 And _
      MyShape.Top - (Range("H" & lngRow).Top + 4) <= 0.25 Then
      MsgBox "対象の四角形は" & MyShape.Name & "かも"
      'MyShape.Delete
      Exit For
    End If
  Next
End Sub

変数:lngRow に格納はセルの列を指定して下さい。
セルの高さを変更していなければ
(うまくいけば)対象の四角形を抽出できると思います。

四角形を貼り付けた際に 0.25 ピクセルのずれが生じる事があったので
実際にうまく行くかどうかはちょっと解りません。


上記のコードで四角形を特定できるようでしたらコメント部分を外して下さい。

【33744】Re:オブジェクトの選択方法
質問  nn  - 06/1/19(木) 19:47 -

引用なし
パスワード
   ▼小僧 さん:
ありがとうございました。
自分なりにまとめてみたのですが、エラーになってしまいます。
◎まず、四角で書かれたものがいくつあるか探します。
With ActiveSheet.Shapes
    numShapes = .Count 'Shape数
    If numShapes > 1 Then  '1以上あるなら
      numAutoShapes = 1
      ReDim autoShpArray(1 To numShapes) 'すべてのオートシェイプを含む配列を作成
      For i = 1 To numShapes
        If .Item(i).Type = msoShapeRectangle Then '四角なら
          autoShpArray(numAutoShapes) = .Item(i).Name
          numAutoShapes = numAutoShapes + 1
        End If
      Next
    End If
  End With
◎その後その四角に対して、対象かどうか知りたいのですが
  For Each MyShape In ActiveSheet.Shapes
ではなく、Forを使って定義しようと、自分なりに頑張ってみたのですが
※でエラーです.For Each を使ったことのない初心者なので
定義の仕方がおかしいようですが・・・

  For i = 1 To numAutoShapes
※    MyShape = autoShpArray(i)
    If MyShape.Top - (Range("H" & lngRow).Top + 4) >= -0.25 And _
      MyShape.Top - (Range("H" & lngRow).Top + 4) <= 0.25 Then
      MsgBox "対象の四角形は" & MyShape.Name & "かも"
End If
  Next

【33753】Re:オブジェクトの選択方法
回答  小僧  - 06/1/19(木) 21:43 -

引用なし
パスワード
   ▼nn さん:
こんばんは。

nn さんのコードを生かす形ですと、このようになるかと思われます。

Sub test2()
Dim numShapes As Long
Dim autoShpArray() As String
Dim numAutoShapes As Long
Dim i As Long
Dim MyShape As Shape
Dim lngRow As Long

  lngRow = 28

  With ActiveSheet.Shapes
    numShapes = .Count 'Shape数
    If numShapes > 1 Then  '1以上あるなら
      numAutoShapes = 1
      ReDim autoShpArray(1 To numShapes) 'すべてのオートシェイプを含む配列を作成
      For i = 1 To numShapes
        If .Item(i).Type = msoShapeRectangle Then '四角なら
          autoShpArray(numAutoShapes) = .Item(i).Name
          numAutoShapes = numAutoShapes + 1
        End If
      Next
    End If
  End With


  For i = 1 To numAutoShapes - 1
    Set MyShape = ActiveSheet.Shapes.Item(autoShpArray(i))
    If MyShape.Top - (Range("H" & lngRow).Top + 4) >= -0.25 And _
      MyShape.Top - (Range("H" & lngRow).Top + 4) <= 0.25 Then
      MsgBox "対象の四角形は" & MyShape.Name & "かも"
    End If
  Next
    Set MyShape = Nothing
End Sub


当方もコードを書きたての頃はなかなか理解できなかったのですが、
MyShape はオブジェクト型の変数となりますので、
値を代入するには Set ステートメントが必要になります。

Set ステートメントで変数:MyShape に Shapeオブジェクトを代入するので、
Shapeオブジェクト に存在する Topプロパティ などを使用できる様になります。

【33779】Re:オブジェクトの選択方法
お礼  nn  - 06/1/20(金) 11:58 -

引用なし
パスワード
   ▼小僧 さん:
こんにちは、
何とかできました。
いろいろありがとうございました。大変助かりました。

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