• 締切済み

エクセルVBAで、ある特定の名前のオブジェクトが存在するかどうかの確認方法

Sheets("XXX").Shapes("SN").Deleteとすると、SNという名前のShapeが存在しなと当然エラーになります。 そこで、「SNがあったら削除する」と書きたいのですが、いい方法が思い当たりません。 For Each ~ Nextでshapeの名前を一個ずつしらべ、あったら削除する方法や、存在しない場合 On Error Resume Nextでエラーを強制的に回避するのではなく、Shapes("SN")があればDeleteするというようにすっきり書く方法は無いでしょうか?

みんなの回答

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.1

いきなり削除かけて無いならOn Error 構文で分岐処理。 "強制的に回避"というのがちんぷんかんぷんなんですが、 削除する→あるならそのまま削除 └→無いなら無視 という分岐処理が一番"すっきり"と書かれるとしか思えないのですが。 まぁgoto処理はコードがややこしくなるという宿命がありますので多用すべきではないでしょうが、その辺は処理を関数化していくなどで対応していくしかないでしょう。

関連するQ&A

  • 特定の名前のオートシェイプの有無を知りたい(エクセルVBA)

    Excel VBA で、オートシェイプを扱おうとしています。 たとえば、 ActiveSheet.Shapes.AddShape(msoShapeRectangle, 10, 10, 50, 50).Name = "TestShape1" のようにして、それぞれ名前を付けているのですが、プログラム中、特定のオートシェイプを削除したり、再び同じ名前で作ったり、ということを行っています。 前者の場合、すでに当該オートシェイプが削除されている場合、目的のオートシェイプが存在していないためか、エラーが発生します。また後者の場合も、オートシェイプを重ねて作成することになってしまうケースにエラーが発生します。 On Error Resume Next で回避することも考えられるでしょうが、もっと直接的に、ある名前のオートシェイプが存在する/しない、をチェックしたうえで各処理を行うようにしたいのです。 どのような方法があるでしょうか?

  • エクセルVBAでワークシートのコメントを全部削除

    以下のコードを走らせると実行時エラー91[オブジェクト変数またはwithブロック変数が設定されていません]となってしまいます。 On Error Resume Nextで回避出来るのですが、理由がわかりません。On Error Resume Nextで回避しなくともいいようにするにはどう直せばいいのでしょうか? Sub Del_Comment() Dim MyR As Range, C As Range Set MyR = Cells.SpecialCells(xlCellTypeComments) For Each C In MyR C.Comment.Delete Next End Sub

  • エクセル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

  • エクセルVBAでAutoShape削除

    シートからオートシェープの星型と線を削除するためのマクロですが、以下でうまく行きます。 Sub SAKUJO() For Each s In ActiveSheet.Shapes If s.Type = msoLine Or s.AutoShapeType = msoShape5pointStar Then s.Delete Next End Sub 質問は、線と星型を他のオートシェープと選別するために、線は「Type」、星型は「AutoShapeType」と異なる選別方法を別々に指定しなければならないのかということです。そもそも「Type」と「AutoShapeType」は何が違うのでしょう? 両方を同じように「Type」か「AutoShapeType」あるいは他の方法で指定する方法はないのでしょうか?

  • エクセルVBA/シェープの文字列を取得

    エクセル2010です。 BOOK内の各シートにボタンやチェックボックス、ラベルやテキストボックスなどが配置されています。 これらの貼り付けられたものの一覧を作りたいのです。 Sub obj_Check() Dim st Dim sp Dim i As Long For Each st In Sheets For Each sp In st.Shapes i = i + 1 With Sheets("Sheet3") .Cells(i, "A").Value = sp.Name ' .Cells(i, "B").Value = sp.Caption ’これがエラー .Cells(i, "C").Value = st.Name End With Next sp Next st End Sub とやってみましたがsp.Captionがエラーになります。 .Cells(i, "B").Value = sp.Shapes.Range.Character.Text としても同じです。 どうやったら、シェープに書かれた文字列が取得できるのでしょうか?

  • エクセル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

  • エクセルVBAでオートシェイプを点滅させたい。

    エクセル2000です。 ワークシートに配置したオートシェープ(「矢印」と名前を付けてあります。)をチカチカさせたいのです。 Sub マーク点滅() Dim i As Integer i = 0 Do i = i + 1 Loop Until i = 3 Sheets("AAAA").Shapes("矢印").Visible = True Sheets("AAAA").Shapes("矢印").Visible = False End Sub とやってみましたがぜんぜんだめでした。 いい方法はないでしょうか?

  • エクセルVBA オートシェイプを操作したいです

    エクセルでセルの入力内容によって楕円をオートシェイプで出現させたいと思います。 http://oshiete1.goo.ne.jp/qa809742.htmlで見つかったものを参考にし、 Private Sub worksheet_Activate() Dim Shp As Shape Set P11 = Range("P11") If P11 Is Nothing Then Exit Sub If P11.Value = 1 Then For Each Shp In ActiveSheet.Shapes If Not Application.Intersect(Shp.TopLeftCell, _ Range("N14:N15")) Is Nothing Then Shp.Delete End If Next Shp With ActiveSheet.Range("N14:N15") ActiveSheet.Shapes.AddShape(Type:=msoShapeOval, _ Left:=.Left,TOP:=.TOP,Width:=.Width,Height:=.Height).Select Selection.ShapeRange.Fill.Visible = msoFalse End With Range("N14").Select Else For Each Shp In ActiveSheet.Shapes If Not Application.Intersect(Shp.TopLeftCell, _ Range("N14:N15")) Is Nothing Then Shp.Delete End If Next Shp End If If P11.Value = 2 Then For Each Shp In ActiveSheet.Shapes If Not Application.Intersect(Shp.TopLeftCell, _ Range("N16")) Is Nothing Then Shp.Delete End If Next Shp With ActiveSheet.Range("N16") ActiveSheet.Shapes.AddShape(Type:=msoShapeOval, _ Left:=.Left, TOP:=.TOP, Width:=.Width, Height:=.Height).Select Selection.ShapeRange.Fill.Visible = msoFalse End With Range("N16").Select Else For Each Shp In ActiveSheet.Shapes If Not Application.Intersect(Shp.TopLeftCell, _ Range("N16")) Is Nothing Then Shp.Delete End If Next Shp End If End Sub とつなげて見ました。 動くには動くのですが、データ元のセルがP11からT30と100セルあり、さらにP11に入力されるデータが1,2,3,4の4種類、AQ11に5,6,7,8,9の5種類などと、ばらばらです。 P11に1が入力されるとN14:N15(結合されています)に円が入り、2が入力されるとN16に円が入る。 Q11に5が入力されるとR13に円が入り、6が入力されるとR14:R15に円が入る・・・・のようにしたいのです。 一生懸命、セルNo.を打ち込んでいたら、 「コンパイルエラー:プロシージャが大きすぎます」とエラーが出てしまいました。 ループさせればよいのだろうと試してみたのですが、元のセルの指定方法や、オートシェイプの出現させるせるの指定方法がわかりません。 どのようにすれば、データー元の範囲を指定して、それに対応したセルにオートシェイプを出現させる事が出来るようになるでしょうか。 お知恵を貸していただけないでしょうか。よろしくお願い致します。

  • エクセルVBAで複数の図に名前をつけたい

    エクセルVBAで複数の図に名前をつけたい エクセルで見出しと合計2カ所などウィンドウ枠固定を複数つける ことはできないので、かわる方法として図のリンク貼り付けを利用 しようと思い下記を作りました。 Sub test()   Range("A100", "R100").Select   Selection.Copy   Range("A1").Select   ActiveSheet.Pictures.Paste link:=True   ActiveSheet.Pictures.ShapeRange.Name = "合計1"   Range("A200", "R200").Select   Selection.Copy   Range("A2").Select   ActiveSheet.Pictures.Paste link:=True   ActiveSheet.Pictures.ShapeRange.Name = "合計2" ・・・(1) End Sub 必要に応じて合計1または合計2を削除します Sub 図1削除() ActiveSheet.Shapes("合計1").Delete End Sub Sub 図2削除() ActiveSheet.Shapes("合計2").Delete End Sub (1)のところで 「このメンバにアクセスできるのは、単一の図形の場合だけです」エラーになります。 エラーがでないように図に名前をつける方法をおしえていただけないでしょうか。 何卒よろしくお願い致します

  • エクセルVBAでワークシート削除

    ブックの中にある、表示されているシートで、たとえば図表1~図表4(何番まであるかは不定です)という名前のシートを削除するVBAを作りました。ただの「図表」という名前のシートや、「何々図表」、「図表集計」等のシートは削除しません。 Sub 保存図表削除() Dim SN As String For Each sh In Worksheets SN = sh.Name If sh.Visible And IsNumeric(Mid(SN, 3, Len(SN) - 2)) And Left(SN, 2) = "図表" Then ans = MsgBox(SN & "を削除してよい?", vbYesNo) If ans = vbYes Then Application.DisplayAlerts = False sh.Delete Application.DisplayAlerts = True End If End If Next End Sub これでうまく作動するのですが、いちいちシートごとに削除の有無を聞かずに、削除するシート名をまとめて表示し、それらを削除するかしないかを聞くにはどうすればよいでしょうか? 「図表1,2,3,4があります。これらを削除しますか?」というような感じです。

専門家に質問してみよう