- 締切済み
VBAで図のindex番号を変数に挿入したら・・・
VBAで、オートシェイプのインデックス番号を変数に挿入すると途中で初期化されてしまいました。 VBAのチェックボックスを用いて各チェックボックスごとに、 ある画像の座標からAX,AY+aの位置に幾つかの円を表示し、 チェックを外すと作成した円を削除するプログラムを作っています。 また、最終的にはチェックボックスを複数(10~15)個作ってそれに対応した 円だけを表示するようなプログラムにしたいと考えています。 下のプログラムをデバックすると※2の部分で変数の値が""、 最終的に※3の行で止まってしまいます。 Option Explicit Public i As Long '繰り返し変数定義 Public ix As Integer '繰り返し回数変数定義 Public X As Integer '基準位置情報変数定義(x軸) Public Y As Integer '基準位置情報変数定義(y軸) Public AX As Integer '移動位置情報変数定義(x軸) Public AY As Integer '移動位置情報変数定義(y軸) Private Sub CheckBox1_Click() Static O() As Variant Y = ActiveSheet.Shapes("Picture 1“).Top '図の上端の位置を変数に挿入 X = ActiveSheet.Shapes("Picture 1").Left '図の左端の位置を変数に挿入 i = 0 ix = 3 '繰り返し回数を変数に挿入 ReDim O(ix) AX = X + 500 AY = Y + 280 '--------------------------------------------------- If CheckBox1.Value = True Then 'チェック有 Do Until i = ix ActiveSheet.Shapes.AddShape(msoShapeOval, AX + (i * 24), AY, _ 16, 16).Select O(i) = Selection.Index MsgBox O(i) ※1 i = i + 1 Loop End If MsgBox O(i) ※2 If CheckBox1.Value = False Then 'チェック無 i = 0 Do Until i = ix ActiveSheet.Shapes.Range(O(i)).Delete ※3 i = i + 1 Loop End If End Sub ↑のようなプログラムを組むと、チェック有の If 終了時 ※2のMsgBox O(i)でO(i)が初期化?されて値が表示されなくなってしまっていま す。 IFの処理中(※1)ではO(i)の値が正常に出力されていたので、 IF終了時に値がなくなっていると思うのですが、 どういった現象が起きているのでしょうか? また、作成した円を上手く削除するにはどうすれば良いでしょうか? この形にこだわっているわけではないので、もっといい方法があれば ご教授頂けると幸いです。 どうかよろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- mitarashi
- ベストアンサー率59% (574/965)
Index番号は、図形が削除されると振り直されるのでしょう。 Sub test() Dim oval1 As Shape Dim oval2 As Shape Set oval1 = ActiveSheet.Shapes.AddShape(msoShapeOval, 10, 10, 16, 16) Debug.Print ActiveSheet.DrawingObjects(oval1.Name).Index '1 Set oval2 = ActiveSheet.Shapes.AddShape(msoShapeOval, 40, 10, 16, 16) Debug.Print ActiveSheet.DrawingObjects(oval2.Name).Index '2 oval1.Delete Debug.Print ActiveSheet.DrawingObjects(oval2.Name).Index '1 '番号が振り直されて2から1に変わってしまっている。 End Sub オブジェクト変数の配列に入れておけば、配列の添字でIndexで行いたかった様にアクセス出来ると思います。 下記は、Stopのところから継続実行させると、つつがなく全削除できます。ご参考まで。 Sub test2() Dim ovals(10) As Shape Dim myArray As Variant Dim i As Long, j As Long myArray = Array(10, 3, 1, 4, 7, 9, 5, 8, 6, 2) For i = 1 To 10 Set ovals(i) = ActiveSheet.Shapes.AddShape(msoShapeOval, 20 * i, 10, 16, 16) Next i Stop For i = 1 To 10 ovals(myArray(i - 1)).Delete Next i End Sub