Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2013)
挿入した図形の指定削除について
投稿日時: 18/06/08 16:37:40
投稿者: maruco33

こんにちは、いつもお世話になっております。
シート(入力画面)に設置したチェックボックス(chSai)にて、
シート(請求書)に図形を挿入・削除したいです。
挿入した時点でそれぞれ名前を付けて、チェックボックスがFalseになれば
名前を指定して削除したいです。
シート(請求書)には、他に図形があるため、名前をつけた図形のみ削除したいのですが、
”指定したコレクションに対するインデックスが境界をこえて〜”と出てどうにもうまくいきません。
どこがどう違うのかご教授お願い致します。
 
Private Sub chSai_Click()
    Dim myFilename As String
    Dim myShape As Shape, myShape2 As Shape
    myFilename = "C:\Users\user\Documents\saihacko.png"
    If chSai = True Then
        Worksheets("請求書").Visible = True
        Sheets("請求書").Activate
    Set myShape = ActiveSheet.Shapes.AddPicture( _
          Filename:=myFilename, _
          LinkToFile:=False, _
          SaveWithDocument:=True, _
          Left:=290, _
          Top:=1, _
          Width:=27, _
          Height:=27)
          ActiveSheet.Shapes(1).name = "Pic1"
           
    Set myShape2 = ActiveSheet.Shapes.AddPicture( _
          Filename:=myFilename, _
          LinkToFile:=False, _
          SaveWithDocument:=True, _
          Left:=307, _
          Top:=340, _
          Width:=27, _
          Height:=27)
          ActiveSheet.Shapes(2).name = "Pic2"
           
    Sheets("入力画面").Activate
    Worksheets("請求書").Visible = False
 
    ElseIf chSai = False Then
        Sheets("請求書").Visible = True
        Sheets("請求書").Activate
        ActiveSheet.Shapes(Pic1).Delete
        ActiveSheet.Shapes(Pic2).Delete
        Worksheets("請求書").Visible = False
        Sheets("入力画面").Activate
    End If
End Sub

回答
投稿日時: 18/06/08 17:12:06
投稿者: sk

引用:
ActiveSheet.Shapes(1).name = "Pic1"

引用:
ActiveSheet.Shapes(Pic1).Delete

ActiveSheet.Shapes("Pic1").Delete
 
引用:
ActiveSheet.Shapes(2).name = "Pic2"

引用:
ActiveSheet.Shapes(Pic2).Delete

ActiveSheet.Shapes("Pic2").Delete
 
引用:
どこがどう違うのか

文字列リテラルと(暗黙的な)変数の違い。
 
何にせよ、モジュールレベルの先頭に
Option Explicit ステートメントを記述されることを
お奨めします。

回答
投稿日時: 18/06/08 17:41:14
投稿者: あすなろ

エラーの原因は既にご指摘済みですが、
同じシートに同じ名前の図形は作成出来ないので、
無条件に削除してから、新たに作る。
シートが非表示でも図形の作成・削除は可能
 
Private Sub chSai_Click()
    Dim myFilename As String
    Dim myShape As Shape, myShape2 As Shape
     
    myFilename = "C:\Users\user\Documents\saihacko.png"
 
    With Sheets("請求書")
        On Error Resume Next
        .Shapes("Pic1").Delete
        .Shapes("Pic2").Delete
        On Error GoTo 0
         
        If chSai = True Then
            Set myShape = .Shapes.AddPicture( _
                Filename:=myFilename, _
                LinkToFile:=False, _
                SaveWithDocument:=True, _
                Left:=290, _
                Top:=1, _
                Width:=27, _
                Height:=27)
            myShape.Name = "Pic1"
             
            Set myShape2 = .Shapes.AddPicture( _
                Filename:=myFilename, _
                LinkToFile:=False, _
                SaveWithDocument:=True, _
                Left:=307, _
                Top:=340, _
                Width:=27, _
                Height:=27)
            myShape2.Name = "Pic2"
        End If
    End With
     
End Sub

回答
投稿日時: 18/06/09 14:06:49
投稿者: WinArrow
投稿者のウェブサイトに移動

あすなろ さんの引用:

同じシートに同じ名前の図形は作成出来ないので、

あれ?そうだっけ?
 
↓は、同名の図形を作成するコードです
 
With ActiveSheet
    With .Shapes.AddShape(msoShapeRectangle, 50, 50, 100, 200)
        .Name = "ABCD"
    End With
    With .Shapes.AddShape(msoShapeRectangle, 250, 50, 100, 200)
        .Name = "ABCD"
    End With
End With
 

回答
投稿日時: 18/06/09 14:55:34
投稿者: WinArrow
投稿者のウェブサイトに移動

同名の図形は手操作でも作成可能です。
 
同名の図形は、「名前」を指定して削除すると、最初に見つかった図形のみが削除されます。
 
同名の図形でも、入っているデータ位置などで、判断できる場合は、番号指定で削除する方法をお勧めします。
 

回答
投稿日時: 18/06/11 08:14:09
投稿者: あすなろ

手作業では出来ないので、勘違いでしたか。
失礼しました。

投稿日時: 18/06/11 10:45:18
投稿者: maruco33

お世話になります。
単純なコードの作成での間違いでした。ネットなどで探しまくって継ぎ足し継ぎ足しでの記述なんですが
こちらで見逃してしまったのか、、、
いろいろと余計な部分があったりと、もっとすっきりしたコードで記述できるよう勉強していきたいと思います。
 
sk様の指摘を元に訂正して試してみたところ、最初から配置してある図形2つが削除されてしまいました。
 
ActiveSheet.Shapes(1).name = "Pic1"
ActiveSheet.Shapes(2).name = "Pic2"で、名前の指定先を間違えてるのかと思い、
 
myShape.name = "Pic1"
myShape.name = "Pic2"で指定してみると、挿入した図形を削除することができました。
 
とりあえず、これで解決として締めたいと思います。
 
お返事ありがとうございました。