• ベストアンサー

エクセル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/17068)
回答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
質問者

お礼

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

関連するQ&A

  • exce VBA オプションボタンのリンクコピー

    exel2000を利用しています。 チェックボタンのリンクコピーを下記プロシージャで利用していますが、オプションボタンだと、これをoptionbutton と変更して出きないみたいで、どのように変更すれば出来るか、ご教授願いたくお願いいたします。 Sub sample() Dim cb As CheckBox For Each cb In ActiveSheet.CheckBoxes cb.LinkedCell = cb.TopLeftCell.Address Next cb End Sub

  • Excel VBA のFor Each ・・・ Next について

    配列に数字(特段数字でなくても)入れたいのですが、以下のように書きました。 Sub test() Dim x As Variant Dim m(1 To 10) As Integer For Each x In m x.Value = 100 Next Stop End Sub Stopでとめてmを確認するとすべて0です。どうしてなのでしょうか。 配列ではなく Sub test() Dim x As Variant For Each x In range("a1:a10") x.Value = 100 Next End Sub とするとA1:A10には100が入ります。 この差がいまいちわからなくて、 もちろんFor ・・・ Nextで簡単に入れられるのは承知しています。 補足ですが また最初はx.valueの.valueをつけていなかったのでセルにも反映されませんでしたが.valueをつけると入りました。

  • VBA 図形の削除

    以下のようなコードにおいて、図名を指定するのではなく、図の種類を指定して削除したいのです。 テキストボックスを消す グラフを消す オートシェイプを消す などなど、オブジェクトの種類を指定して消すようにしたいのですが、どうすれば良いですか? Sub 指定図形削除()  図名=”削除したい図形名”  For Each zu In ActiveSheet.Shapes   If zu.Name = 図名 Then    zu.Delete    Exit For   End If  Next End Sub

  • エクセルVBAで xlOn xlOff の切替

    エクセル2000です。 ワークシート上に配置したオブジェクトのVisibleのTrue Falseについては、test01の方法で切り替えることが出来ます。 では、Test02でIfで判定している、xlOn xlOff の切替についても同様にNOTを使って簡単に記述することはできないでしょうか?xlOn xlOff はTrue False ではないから無理なのでしょうか? Sub test01() Dim o As Object For Each o In ActiveSheet.Buttons o.Visible = Not o.Visible Next o End Sub Sub test02() Dim o As Object For Each o In ActiveSheet.CheckBoxes If o.Value = xlOn Then o.Value = xlOff Else o.Value = xlOn End If Next o End Sub

  • エクセルVBAで、シート上で結合されたセルに一つだけチェックボックスを

    エクセルVBAで、シート上で結合されたセルに一つだけチェックボックスを作成したいです。 以前こちらの別の方の質問で、選択されているセルにチェックボックスを作成するプログラムが紹介されており、同じようにやってみたところ、セルが結合されていない場合は問題ないのですが、 セルが複数結合されている場合、結合されているセル分チェックボックスが出来てしまいます。 (例えば、エクセルのシート上で、A3セルからA6セルまでが結合されていた場合、合計4つチェックボックスが結合セル内に出来てしまいます) 結合セル内には一つしかチェックボックスを作りたくありません。 どうしたらよいでのしょうか? 以前紹介されていた、チェックボックスを作るプログラムは下記のようなものでした。 よろしくお願いいたします。 Sub sample() Dim cb As CheckBox For Each cb In ActiveSheet.CheckBoxes cb.LinkedCell = cb.TopLeftCell.Address Next cb End Sub

  • エクセルVBAでFor each文

    下記のようなコードを書きたいのですが「オブジェクトが必要です」というエラーが 出力されてしまいできないようです。何か代替案はありますでしょうか。 --- dim ws as worksheet with thisworkbook for each ws in array(.worksheets(1),.worksheets(2),.worksheets(3)) with ws 'ここに処理を書く end with next ws end with --- ちなみにこのbookにある全てワークシートで処理を回したいわけではなく 特定のシートのみで処理をしたいです。 エクセル2003です。 よろしくお願いします。

  • エクセルVBAでオートシェープを識別して削除したいのです・・・

    エクセルシートにたくさん貼り付けた画像を一度に削除するため、下記のようなマクロを作成しました。 しかし、これでは「テキストボックス」や「→」のようなオートシェープも全部消えてしまいます。 画像データ(図)だけを認識して消すにはどうすればよいのでしょうか? Sub sakujo() Dim Myshape As Shape For Each Myshape In ActiveSheet.Shapes If Myshape.Type <> msoFormControl Then Myshape.Delete End If Next End Sub

  • 教えて For Each R In Target

    いつもお世話になっております よろしくお願いします ネットで見つけたマクロなのですが、どなたか解説していただけないでしょうか Private Sub Worksheet_Change(ByVal Target As Range)  Dim R As Range For Each R In Target With R 条件判断と処理 End With Next R End Sub

  • このコード(For Each…)ですが、うまく実行できません!

    EXEL 2002 です。 下記コードなのですが、 うまくできません、 「For Each…」の下2行がエラーとなります。 何卒、ご教示よろしくお願い致します。 -------------------- Sub 下方表の各列を上方へ貼付る() '下方の表の各列を、上方に貼り付ける Dim r As Range With Worksheets(Worksheets.Count - 1) For Each r In .Range("G40:Z40") .Range(r.Offset(0, 0), .Range(r.Offset(0, 0)).End(xlDown)).Copy _ .Range (r.Offset(-38, 1)) Next r End With End Sub

  • セルに対してFor Each~In~Nextを使う

    セルに対してFor Each~In~Nextを使う事は出来ない? シートやブックに対してループする時は Sub aaa() Dim w As Worksheet For Each w In Worksheets MsgBox w.Name Next End Sub 等を使いますが、 A1に「あ」 A2に「い」 A3に「う」 が入っている場合、 Sub bbb() Dim i As Long For i = 1 To Range("a65536").End(xlUp).Row MsgBox Cells(i, 1) Next End Sub で、全ての値を取得できますが、 For~to~nextではなく セルに対してFor Each~In~Nextを使う方法があれば教えてください。 上記のように Dim w As Worksheetは宣言できますが Dim c As Workcellとはできませんでした。 なぜわざわざFor~to~nextでできる事をFor Each~In~Nextでやりたいかと言うと、 シートやブックはFor~to~nextでできるのに、セルはFor~to~nextができない理由を知りたいからです。 ご回答よろしくお願いします。

専門家に質問してみよう