• ベストアンサー

画像を削除するマクロが知りたい

いつもお世話になっております。 別スレッドで「参照先ブックを開かずにコピーしたい」という投稿をしておりますが、その作業をしている同じブックでもう一つ実行したいことがあり、質問させていただきます。 現在、エクセルのマクロを使って、下記のようなプログラムを組んでいます。 (1)あるボタンを押すとフォームが出てくる (2)フォームの中に画像のリストがあり、どれかを選んでクリックすると、ボタンのすぐ下のセルに画像が挿入される VBAの構文でいうと以下のような内容です。 Private Sub フォーム1_Change() If フォーム1.ListIndex = 0 Then ChDir ThisWorkbook.Path Workbooks.Open FileName:="BookA.xls" Sheets("Sheet1").Select Range("B2:H2").Copy Windows("BookB").Activate Sheets("Sheet2").Select Range("B1").Select ActiveSheet.Paste Workbooks("BookA").Close Windows("BookB").Activate Else If フォーム1.ListIndex = 2 Then ・・・(3,4,5,と続く) End If End Sub この要領で画像の貼付けを行い、一度挿入した画像が気に入らなくて別の画像に入れ替えたいという場合があるのですが、再度フォームボタンからリストを選択し直すと、新しく挿入した画像がその前に貼り付けられていた画像の上に重なる形で載ってきます。 この動作を繰り返すとどんどんブックの容量自体が重くなってしまうので、新しい画像を選択・挿入すると同時にその前に貼り付けられていた画像は削除される、というプログラムを組みたいです。 deleteとかclearとかいろんな構文を使って試してみましたが、どうしてもうまく行きません。 詳しい方のお知恵を拝借できれば幸いです。よろしくお願い致します。

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

エラー処理は省略してますが。。 Sub SampleProc()   ' 例1)アクティブセルの場合   Call DelShapes(ActiveCell)   ' 例2)ユーザーが選択したセル選択で指定する場合   Call DelShapes(Selection)   ' 例3)Range で指定   Call DelShapes(Range("A1:C10")) End Sub ' // 指定した Range の範囲と重なる位置にある Shape を削除 Private Sub DelShapes(ByVal Target As Range)      Dim Shp As Object   Dim r  As Range   For Each Shp In Target.Parent.Shapes     Set r = Range(Shp.TopLeftCell, Shp.BottomRightCell)     If Not Intersect(r, Target) Is Nothing Then       Shp.Delete     End If     Set r = Nothing   Next   Set Target = Nothing End Sub

lightheart
質問者

お礼

とても丁寧な回答をいただきありがとうございます。 しかしエラーこそ出ないものの、残念ながら画像は消えず、目的達成できませんでした…。

lightheart
質問者

補足

下記回答を投稿した後もあれこれやっていたら、構文自体に間違いは無いのに自分の単純なミスが原因で画像が消えなくなっていたことが判明しました。失礼しました…。 何とか解決しました! 本当にありがとうございました!!

その他の回答 (3)

  • Nayuta_X
  • ベストアンサー率46% (240/511)
回答No.4

、「既にそこに貼り付けられてる画像は全部消して新しいのを貼る!」 であれば、下記で、一発です。 Sub test() ActiveSheet.Shapes.SelectAll Selection.Delete End Sub

lightheart
質問者

補足

実はこれは既に試してありました。 そうすると、1シートにある画像、全てが消えてしまうんですよね…。 画面が真っ白になっちゃってびっくりした記憶があります。 シート上の、ある箇所(セル)に貼られてる画像だけ全て消したいんです。 Activesheetのところをactivecellにするということもやってみたんですが、これだとエラーが出てしまうし…。 どうしたものかと。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

#2 です。 #2 の回答種類間違えた....「補足要求」ではなく「回答」です。 シート内の全ての Shape をチェックする力技なので図の数が 多いと処理速度は遅いかもしれません。 Application.ScreenUpdating = False を冒頭にでも追加 しておくと多少マシでしょう。

  • Nayuta_X
  • ベストアンサー率46% (240/511)
回答No.1

画像を呼び出したらその直後に Selection.ShapeRange.Name = Check_No'適当な番号 を実行して、 ActiveSheet.Shapes(Check_No).Select Selection.Delete とすると その画像だけを削除出来ます。 後は、あなたの腕次第です。

lightheart
質問者

補足

ご回答ありがとうございます。 画像に一つ一つ名前を付ける方法は既に思いつきはしたんですが、何せリストが大量にあるため、できれば一つ一つ名前を付ける手間なく、「既にそこに貼り付けられてる画像は全部消して新しいのを貼る!」みたいなことができれば一番いいと思って質問を投稿させてもらったんです…。 やっぱり無茶なことなんでしょうか…?

関連するQ&A

  • 参照先のブックを開かずに内容をコピーしたい

    エクセルのマクロ初心者です。 いつもここで他の方のQ&Aを参考にしたり、自分で質問したりしてお世話になっています。 今回は、参照先のブックを開かずにその内容をコピーする方法についてお聞きしたいです。 現在、下記のようなマクロを組んでいます。 Workbooks.Open FileName:="BookA.xls" Sheets("Sheet1").Activate Range("B4:H4").Copy Windows("BookB.xls").Activate Sheets("Sheet2").Select Range("B1").Select Sheets("Sheet2").Paste Workbooks("BookA").Close Windows("BookB").Activate つまり、BookAのセルの一部分をコピーしてBookBのセルに貼り付けるという内容なんですが、コピー参照先のBookAを一度開いてコピーしてからBookBに行って貼付け、さらにBookAを閉じた後でBookBに再び戻る、という動作になっているため、画面がパラパラと切り替わる時間があって少々うっとおしいのです。 BookAをいちいち開かずに内容をコピーする方法があると思うのですが、どのような構文を使えばいいでしょうか? ご回答よろしくお願いします。

  • 【Excel】2つのBook間のマクロ

    Excel2003を使用しています。 BookAのSheet1とSheet2のある範囲をそれぞれBookBのSheet1とSheet2に値のみコピーするというマクロを作成しようとしています。 (1)Sheet1を値のみコピーするコード   を書いて (2)Sheet2を値のみコピーするコード   を書こうと思っていたのですが、(1)から(2)へどのように続けて書いたらいいでしょうか? (1)のコードは  Sheets("Sheet1").Range("A1:G30").Select  Selection.Copy  Workbooks.Open Filename:="A:\B.xls"  Sheets("Sheet1").Range("A1").Select   Selection.PasteSpecial Paste:=xlPasteValues   Application.CutCopyMode = False と書いています。 また、こういう場合は、BookAとBookBのどちら側にコードを書いた方がいいのでしょうか?

  • マクロを教えてください

    同じフォルダ内にあるXlsブックのあるSheetのデータを他のBookにコピーして貼り付けて貼り付けた側のBookで加工したいのですがうまくマクロが組めません。 Bookを共有で使っているので困っています。 Sub ワードアート1_Click ' ActiveWindow.ScrollWorkbookTabs sition:=xlLast Workbooks.Open ("販売管理表み.xls") Sheets("在庫一覧").Select Cells.Select Range("A1").Activate Selection.Copy Windows("完成在庫.xls").Activate Sheets("完成在庫一覧").Select Range("A1").Select ActiveSheet.Paste End Sub って書いてみましたが、Workbooks…のところでエラーになってしまいました。(TOT)初心者ですみません。教えてください。

  • VBAの構文過ち箇所指摘お願いします。

    まだまだVBA初心者です。 あるブックに2番目に開いたブックの一部を選択し、図のコピーで貼り付けるというものですが、最初の Workbooks(2).workshees(Sheets.Count).Activate でエラーが出ます。 2番目に開いたブックの一番右のシートの中の一部のセルを選択したいのですが、ご指摘おねがいします!! 以下その構文です。 Sub 2番目に開いたブックの貼り付け() On Error GoTo HandleErr Workbooks(2).workshees(Sheets.Count).Activate ActiveWindow.DisplayGridlines = False Range("A1:B2").Select Selection.CopyPicture Appearance:=xlScreen,Format:=xlPicture Workbooks(1).Activate Workbooks(1).Worksheets(Sheets.Count - 1).Range"B41").Select     ・     ・     ・     間省略 Exit Sub HandleErr: MsgBox "2番目のブックが開かれておりません!!" End Sub

  • EXCELのVBAについての質問です

    現在、2つのブックでVBAを使用して作業中ですが、 どうしてもうまく作動しない箇所があります。 BookAとBookBがあり、BookBにはtesというユーザーフォームを設置しています。 やりたい作業は以下の通りです。 BooKAからコマンドボタンを利用してBookBを開く。 BookBは開くとBookAを閉じる。testのユーザーフォームを開く。 BookAのコマンドボタンのコードは Private Sub CommandButton1_Click() Dim mypath As String mypath = ThisWorkbook.Path Workbooks.Open (mypath & "BookB.xlsm") End Sub BookBのOPENイベントに Private Sub Workbook_Open() Workbooks("BookA.xlsm").Close test.Show End Sub を入力しています。 これを実行すると エラーが発生せず、デバッグで1行ずつコードを確認すると test.Showが実行されずに closeで処理が終了されています。 ・ユーザーフォームのActiveイベントでclose処理を入れるとcloseが処理されずに モードレスでフォームを開くと、close後にフォームが閉じられてしまいます。 ・クッション用のブックを作成して、そこにBookAをclose処理とBooKBのOPEN処理を入れても closeで処理が終了されてしまいます。 エラーが出ると対応の使用があるのですが、エラーも無く静かに処理だけが終了してしまうため、 対応ができず困っています。 あちこち検索して調べてみましたが、いずれも当てはまらない状況です。 何かヒント等でもお持ちの方は、ご教授下さい。

  • マクロ構文エラー

    下記のマクロを記述していますが構文エラーが出ます 何が原因でしょうか。 Sub 会計データ送信() Sheets("工程生産バランス").Select file = "ml" & Cells(8, 12) & Cells(9, 13) & ".xls" Range("E5").Select If Range("E5") = "4月" Then Range("E6:E38").Select Selection.Copy Workbooks.Open Filename:="C:\sdata\ml\生産バランス.xls" Sheets("上期工程生産バランス").Select Range("E6:E38").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Range("E6").Select End If Windows("file").Activate  →エラー箇所(インデックスが有効範囲にありません。) Sheets("工程生産バランス").Select Range("E5").Select End Sub 教えてください。

  • excel2003マクロの2007での使い方

    OS:windowsXP excel2003で作成したマクロがexcel2007で動かなく困っております。 マクロでやりたいことは 1つ目のブック(以降A)の内容を、2つ目(以降B)のブックに行列を反転しコピー です。Aのブックの列数は不変ですが行数、ファイル名は毎回変化します。 excel2003では動いていたのですが2007ではコピー元がBのブックになってしまいます。 実際のマクロは Workbooks(1).Activate Range("A1").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy Windows("B.xls").Activate Sheets("sheet2").Select Range("B1").Select Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True です。 よろしくお願いいたします。

  • マクロを使ったコピペがうまく動作しない。

    あるデータを転記用のブック(月毎にシートが分かれています。シートの内容は同一)に貼り付ける処理を行うため、下記のようなマクロを組んだのですが、何故か貼りつきません。処理終了時には、転記元ブック(シート)で最終処理の範囲(5番目のB287)を選択しています。一体何がいけないのでしょうか? データはA1からPまでで毎月可変しています。 また、転記用ブックが12枚あるため、月を指定してから貼り付けたいのですが、どのようにすればよいでしょうか?(下記は直接シ-トを指定しました) Sub test() Dim 最終行 As Integer '-------------------------------------------- 開始 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("1").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B1").PasteSpecial Paste:=xlPasteValues '-------------------------------------------- 1 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("2").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B83").PasteSpecial Paste:=xlPasteValues '-------------------------------------------- 2 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("3").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B157").PasteSpecial Paste:=xlPasteValues '-------------------------------------------- 3 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("4").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B227").PasteSpecial Paste:=xlPasteValues '-------------------------------------------- 4 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("5").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B287").PasteSpecial Paste:=xlPasteValues --------------------------------------------- 5 End Sub 

  • 値のみ貼りつけたい。

    値のみ貼りつけたい。 すみません。教えて頂いた内容でもう一つ追加で質問をさせてください。 マクロで別ファイルを二つ開いて、マクロファイルがWorkbooks(1)別ファイル二つがWorkbooks(2)、Workbooks(3)になります。Workbooks(2)のデーターをコピーしてWorkbooks(3)に値だけ貼りつけたいのですが、教えて頂けませんでしょうか。 Workbooks(2).Activate Sheets(1).Select Range("A1").Copy Workbooks(3).Activate Sheets(2).Select Range("B1:C1").Select ActiveSheet.Paste この部分を値のみ貼りつけたいのですが。 PasteSpecial xlPasteValuesをつけてもうまくいかないので、お願いします。

  • 「 このコード 」 のチェック を お願い致します。

    下記コードは何とか動作しますが、チェックお願い致します。 1、 MsgBox "「 空白シート 」 は ありません。"    の    追加編集が、よくわかりません。 2、 1以外に、おかしな箇所をご教示お願い致します。 --------------------------- '「 ブック1 」 に空白シートがあったら、そこへ貼り付ける Sub 空白シートへコピー() Dim ws As Worksheet For Each ws In Workbooks("ブック1.xls").Sheets If IsEmpty(ws.UsedRange) = True Then Workbooks("ブック2.xls").Activate Cells.Select Selection.Copy Workbooks("ブック1.xls").Activate ws.Select Range("A1").Select ActiveSheet.Paste Else MsgBox "「 空白シート 」 は ありません。" End If Next End Sub

専門家に質問してみよう