- ベストアンサー
エクセル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
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
シート上のチェックボックス、グループボックス、 オプションボタンはすべて削除して良いのですよね。 だったら、ループしなくてもこれでいけませんか? ↓ With ActiveSheet .CheckBoxes.Delete .GroupBoxes.Delete .OptionButtons.Delete End With
その他の回答 (5)
- imogasi
- ベストアンサー率27% (4737/17069)
Sub test01() ActiveSheet.DrawingObjects.Delete End Sub で消えましたが。 For Eachを使わなければいけませんか。
お礼
ありがとうございます。 ActiveSheet.DrawingObjects.Delete では、種類に関係なく全部消えてしうまうんじゃありませんか?
- Wendy02
- ベストアンサー率57% (3570/6232)
merlionXXさん、こんにちは。 Wendy02です。 >オブジェクトに自分で名前を付けてしまったものは削除されないようです。 なるほどね、前回やっていた例の方法ですね。ただ、その方法は、Collection を取らない、コントロールに対して、後々処理するためのもので、必ずしも、フォームのコントロールでは、必要ありませんね。 実際、自分で名前のつけたものに対しては、一括して行うための処理ですから、任意の接頭辞をつけて、それで処理すればよいと思います。そのために名前の変更したのではないでしょうか? それから、 ActiveSheet.DrawingObjects という設定の仕方は、こちらでは取れますが、これは、バージョンごとで調べていませんので、今は、なんとも言えません。ダメならShapes にすれば済むはずです。
補足
> 前回やっていた例の方法ですね。 ちがうんです。まったく別件!
- Wendy02
- ベストアンサー率57% (3570/6232)
#3のWendy02 です。 私の回答、#1,#2 とも全部かぶっていますね。Goup Boxのチェックで、他のコントロールと前後関係があるのではないかと調べ、また、Like演算子のマルチ化ができないかと思いましたが、前者は、それが前後関係はなかったことと、後者は、可能なのですが正規表現ではないので確実性が乏しいということで断念した、その結果が#3です。 特別な付加的条件がなければ、基本的には、#2 さんので良いと思います。
- Wendy02
- ベストアンサー率57% (3570/6232)
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
お礼
ありがとうございます。 名前を付けたチェックボックスのところで「Nameプロパティが取得できません」というエラーになってしまいました。
- hana-hana3
- ベストアンサー率31% (4940/15541)
全てのオブジェクトを対象に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
お礼
ありがとうございました。 やってみましたところ、オブジェクトに自分で名前を付けてしまったものは削除されないようです。
お礼
ありがとうございました。 ループせずにいけるんですね。 知らなかった・・・・・。無知ですねえ。