Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7818 / 13645 ツリー ←次へ | 前へ→

【36618】図形について ちび太 06/4/5(水) 17:13 質問[未読]
【36619】Re:図形について Jaka 06/4/5(水) 17:23 発言[未読]
【36620】Re:図形について Kein 06/4/5(水) 17:39 回答[未読]
【36630】Re:図形について ちび太 06/4/5(水) 19:20 質問[未読]
【36632】Re:図形について Kein 06/4/5(水) 20:00 回答[未読]
【36633】Re:図形について ちび太 06/4/5(水) 20:02 お礼[未読]
【36626】Re:図形について ぴかる 06/4/5(水) 18:33 発言[未読]
【36629】Re:図形について ちび太 06/4/5(水) 18:59 お礼[未読]
【36670】Re:図形について ちび太 06/4/7(金) 13:53 質問[未読]
【36674】Re:図形について Blue 06/4/7(金) 14:33 発言[未読]
【36675】Re:図形について ちび太 06/4/7(金) 15:24 質問[未読]
【36678】Re:図形について Blue 06/4/7(金) 15:42 回答[未読]
【36679】Re:図形について Kein 06/4/7(金) 15:47 回答[未読]
【36681】Re:図形について ちび太 06/4/7(金) 16:15 お礼[未読]

【36618】図形について
質問  ちび太  - 06/4/5(水) 17:13 -

引用なし
パスワード
   図形をマクロで消す場合はどのようにすればよいのですか?

「マクロの記録」で行うと

ActiveSheet.Shapes.Range(Array("Picture 1", "Picture 2", _
"Oval 4", "Oval 5" , "Line 7", "Line 8")).Select
Selection.Delete

となります。
図形の番号を指定せずに一括消去を行いたいのですが
よい方法がありますか?

よろしくお願いします。

【36619】Re:図形について
発言  Jaka  - 06/4/5(水) 17:23 -

引用なし
パスワード
   なんか図形と言うより画像が含まれているみたいですが...。
近い所で
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=27823;id=excel
[#26572]

【36620】Re:図形について
回答  Kein  - 06/4/5(水) 17:39 -

引用なし
パスワード
   普通は

ActiveSheet.DrawingObjects.Delete

で、画像も含めて一括削除できますけど。

【36626】Re:図形について
発言  ぴかる  - 06/4/5(水) 18:33 -

引用なし
パスワード
   ちび太さん、みなさん、こんにちは。

選択した部分のセル・図形等を全てクリアするマクロです。
以前にりんさんという方に教えて頂いたものです。

Sub 全てクリア()
 
Dim Sh As Shape, r1 As Range, r2 As Range

  On Error GoTo errout
  If ActiveSheet.ProtectContents Then
  Else
   If TypeName(Selection) = "Range" Then
    Selection.Clear
    If TypeName(Selection) = "Range" Then
     If ActiveSheet.Shapes.Count > 0 Then
      For Each Sh In ActiveSheet.Shapes
       '図形が完全に範囲に含まれる場合は削除する
       '図形左上セルのチェック
       Set r1 = Application.Intersect(Selection, _
                      Sh.TopLeftCell)
       '図形右下セルのチェック
       Set r2 = Application.Intersect(Selection, _
                      Sh.BottomRightCell)
       If r1 Is Nothing Or r2 Is Nothing Then
       '左上セルまたは右下セルが選択範囲の外にある場合は無視
        '両方外にある場合も無視
       Else
        Sh.Delete
       End If
      Next
     End If
    End If
   Else
    Selection.Delete
   End If
  End If
  Set r1 = Nothing: Set r2 = Nothing

  Exit Sub
errout:

End Sub

【36629】Re:図形について
お礼  ちび太  - 06/4/5(水) 18:59 -

引用なし
パスワード
   Jakaさん、Keinさん、ひかるさんお答えありがとうございます。
色々とやり方があるのですね。
早速試してみます。

【36630】Re:図形について
質問  ちび太  - 06/4/5(水) 19:20 -

引用なし
パスワード
   試してみましたが、シート内に使っていた
コマンドボタンまで消えてしまいました。
コマンドボタン以外の図形や写真だけを消せますか?

すいませんがよろしくお願いします。

【36632】Re:図形について
回答  Kein  - 06/4/5(水) 20:00 -

引用なし
パスワード
   ならば・・

With ActiveSheet
  .Pictures.Delete
  .Ovals.Delete
  .Lines.Delete
End With

というように、種類ごとに指定して削除すればよいと思います。

【36633】Re:図形について
お礼  ちび太  - 06/4/5(水) 20:02 -

引用なし
パスワード
   ありがとうございます。
早速試してみます。

【36670】Re:図形について
質問  ちび太  - 06/4/7(金) 13:53 -

引用なし
パスワード
   何度もすいません。

下のような命令文で行うと
コマンドボタンも一緒に消えてしまいます。

With ActiveSheet
  .Pictures.Delete
  .Ovals.Delete
  .Lines.Delete
  .Rectangles.Delete
End With

あとオートシェイプなどを消すことができない
のですがなにか命令文があるのでしょうか?
AutoShape.Delete
を上の命令文に追加するとデバックになります。

すいませんがよろしくお願いします。

【36674】Re:図形について
発言  Blue  - 06/4/7(金) 14:33 -

引用なし
パスワード
   コマンドボタンはなぜか Pictures に入っているようです。
オートシェイプは、Rectangles には入っていない Rectangle オブジェクトのようです。

ということは、やはり For Eachで 全ての DrawingObject をみて
該当かどうか判定して消すような処理になりそうです。(TypeNameで分岐かな)

> を上の命令文に追加するとデバックになります。
デバックではなく、デバッグです。
しかも、デバッグは自発的にやる行為(バグ取りをする作業)でExcelが勝手にやることはないです。

今回の場合は、
エラーになる とか エラーになってデバッグモードでとまってしまう
とかでしょうか。

【36675】Re:図形について
質問  ちび太  - 06/4/7(金) 15:24 -

引用なし
パスワード
   Blue さんへ

VBAの事があまりよく分かっていないため
説明の仕方が悪く申し訳ありません。

AutoShape.Delete

を命令文に入れて実行した場合、
AutoShape.Delete のところでエラーになるという事です。

あと、
>オートシェイプは、Rectangles には入っていない Rectangle オブジェクトのようです。
>
>ということは、やはり For Eachで 全ての DrawingObject をみて
>該当かどうか判定して消すような処理になりそうです。(TypeNameで分岐かな)

Blueさんよりご教授頂いた内容なのですが、
恥ずかしながらよくわかりません。
よろしければ詳しく教えていただけないでしょうか?

【36678】Re:図形について
回答  Blue  - 06/4/7(金) 15:42 -

引用なし
パスワード
   ▼ちび太 さん:
>Blueさんよりご教授頂いた内容なのですが、
>恥ずかしながらよくわかりません。
>よろしければ詳しく教えていただけないでしょうか?

Dim d As Object

For Each d In Worksheets("Sheet1").DrawingObjects
  ' コントロールツールボックスから追加したオブジェクトかどうか
  If TypeName(d) <> "OLEObject" Then
    d.Delete
  End If
Next

【36679】Re:図形について
回答  Kein  - 06/4/7(金) 15:47 -

引用なし
パスワード
   あー・・すいません。私の書いたコードでは、ボタンが Pictureオブジェクトに
含まれて消されてしまったのですね。これは想定外でした。で、Blueさんの考え方
でうまくいくと思いますので、そのサンプルを書きます。

Sub Del_Objects()
  Dim Obj As Object
 
  For Each Obj In ActiveSheet.DrawingObjects
   Select Case TypeName(Obj)
     Case "Button"
     Case "OLEObject"
      If Obj.ProgId <> "Forms.CommandButton.1" Then
        Obj.Delete
      End If
     Case Else
      Obj.Delete
   End Select
  Next
End Sub

【36681】Re:図形について
お礼  ちび太  - 06/4/7(金) 16:15 -

引用なし
パスワード
   Blueさん、Keinさん
ありがとうございました。
早速ためしてみます。

また何かありましたらよろしくお願いします。

7818 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free