• ベストアンサー

エクセルVBAで For Each をまとめる方法

ワークシート上にフォームで作成したチェックボックス、グループボックス、オプションボタンだけをまとめて削除するVBAです。 以下のように、種類ごとに分けて記述することは出来るのですが、3種類まとめて書く方法がわかりません。 CheckBoxes,GroupBoxes,OptionButtons と並べてもだめのようです。 ご教示ください。 Sub delete_test() With ActiveSheet For Each cb In .CheckBoxes cb.Delete Next For Each gb In .GroupBoxes gb.Delete Next For Each ob In .OptionButtons ob.Delete Next End With End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • masa_019
  • ベストアンサー率61% (121/197)
回答No.2

シート上のチェックボックス、グループボックス、 オプションボタンはすべて削除して良いのですよね。 だったら、ループしなくてもこれでいけませんか? ↓ With ActiveSheet .CheckBoxes.Delete .GroupBoxes.Delete .OptionButtons.Delete End With

merlionXX
質問者

お礼

ありがとうございました。 ループせずにいけるんですね。 知らなかった・・・・・。無知ですねえ。

その他の回答 (5)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.6

Sub test01() ActiveSheet.DrawingObjects.Delete End Sub で消えましたが。 For Eachを使わなければいけませんか。

merlionXX
質問者

お礼

ありがとうございます。 ActiveSheet.DrawingObjects.Delete では、種類に関係なく全部消えてしうまうんじゃありませんか?

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

merlionXXさん、こんにちは。 Wendy02です。 >オブジェクトに自分で名前を付けてしまったものは削除されないようです。 なるほどね、前回やっていた例の方法ですね。ただ、その方法は、Collection を取らない、コントロールに対して、後々処理するためのもので、必ずしも、フォームのコントロールでは、必要ありませんね。 実際、自分で名前のつけたものに対しては、一括して行うための処理ですから、任意の接頭辞をつけて、それで処理すればよいと思います。そのために名前の変更したのではないでしょうか? それから、 ActiveSheet.DrawingObjects という設定の仕方は、こちらでは取れますが、これは、バージョンごとで調べていませんので、今は、なんとも言えません。ダメならShapes にすれば済むはずです。

merlionXX
質問者

補足

> 前回やっていた例の方法ですね。 ちがうんです。まったく別件!

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

#3のWendy02 です。 私の回答、#1,#2 とも全部かぶっていますね。Goup Boxのチェックで、他のコントロールと前後関係があるのではないかと調べ、また、Like演算子のマルチ化ができないかと思いましたが、前者は、それが前後関係はなかったことと、後者は、可能なのですが正規表現ではないので確実性が乏しいということで断念した、その結果が#3です。 特別な付加的条件がなければ、基本的には、#2 さんので良いと思います。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

merlionXX さん、こんにちは。 3種類まとめてというのは、ひとつのFor Each In ~で行うということですか? もともと、Collection で扱うようになっていますから、以下のようにすればよいと思います。 Sub delete_test2()  With ActiveSheet   .CheckBoxes.Delete   .GroupBoxes.Delete   .OptionButtons.Delete  End With End Sub それとも、こんな風にしますか?(^^; Sub delete_test3() Dim obj As Object, nm As Variant  With ActiveSheet  For Each obj In .DrawingObjects   For Each nm In Array("Check", "Option", "Group")   If obj.Name Like nm & "*" Then    obj.Delete   End If   Next nm  Next obj  End With End Sub

merlionXX
質問者

お礼

ありがとうございます。 名前を付けたチェックボックスのところで「Nameプロパティが取得できません」というエラーになってしまいました。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

全てのオブジェクトを対象にif文で判断します。 Sub test() With ActiveSheet For Each cb In .Shapes If InStr(cb.Name, "Group Box") Or _ InStr(cb.Name, "Option Button") Or _ InStr(cb.Name, "Check Box") Then cb.Delete Next End With End Sub

merlionXX
質問者

お礼

ありがとうございました。 やってみましたところ、オブジェクトに自分で名前を付けてしまったものは削除されないようです。