Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Home : Microsoft 365)
エクセルファイルに画像を挿入及び削除する
投稿日時: 24/09/03 20:26:23
投稿者: はじめて

お世話になります。
Excelファイルに画像フォルダの中から画像を挿入し、さらにその画像ファイルをス駆除したいのです。

回答
投稿日時: 24/09/03 21:08:05
投稿者: WinArrow

自分でコードを書いてみましたか?
 
マクロの記録でコードが作成できるがご存知ですか?

投稿日時: 24/09/03 21:26:46
投稿者: はじめて

ありがとうございます。
挿入は下記のようにして取り込めました。
Sub InsertImage()
    Dim ws As Worksheet
    Dim img As Shape
     
    Set ws = ThisWorkbook.Sheets("Sheet1")
    Set img = ws.Shapes.AddPicture("C:\Users\user\Desktop\カレン貼付け一般\カレン角丸\2月.png", msoFalse, msoTrue, 100, 100, -1, -1)
     
End Sub
削除をただいま思案中です。

回答
投稿日時: 24/09/03 21:43:25
投稿者: WinArrow

貼付けた画像には、画像ファイルの保存場所情報がありません。
 
そのため、AddPictureの引数部分を、
例えば、↓の方法で取得します。
 
Dim Filename As String
    Filename = Application.GetOpenFilename()
※キャンセルした場合の対応が必要です。
 
そうすれば、
   kill Filename
で削除できます。

投稿日時: 24/09/03 23:09:39
投稿者: はじめて

ありがとうございます。
このようにコーディングしましたがうまくいきません。
Sub DeleteImagetesuto() '********** テスト    *********
    Dim ws As Worksheet
    Dim img As Shape
     
    Set ws = ThisWorkbook.Sheets("Sheet1")
    Set img = ws.Shapes.AddPicture("C:\Users\user\Desktop\カレン貼付け一般\カレン角丸\2月.png", msoFalse, msoTrue, 100, 100, -1, -1)
      
    Dim Filename As String
        Filename = Application.GetOpenFilename()
   
     Kill Filename
 
End Sub

回答
投稿日時: 24/09/04 09:22:24
投稿者: MMYS

はじめて さんの引用:

このようにコーディングしましたがうまくいきません。

そのコード、どんな意図でそのように記述したのでしょうか。意図と違う動きなったと思いますが、なぜそのように動いたかは理解しましたか。コードは適当に書いたら、意図通りに動く。なんてことはありません。
 
たとえば、Application.GetOpenFilename() の意味は調べましたか。カーソルを調べたい位置に置いて F1キー でヘルプが出ます。
 
なお、ファイル削除だけなら下記の通り。
 
Kill "C:\Users\user\Desktop\カレン貼付け一般\カレン角丸\2月.png"
 

回答
投稿日時: 24/09/04 10:04:03
投稿者: WinArrow

はじめて さんの引用:
ありがとうございます。
このようにコーディングしましたがうまくいきません。

 
>うまくいきません
だけでは、状況が伝わりません。
実行した結果、どのようになったのかを説明しましょう
 
はじめて さんの引用:

<<前の部分省略>>
    Set img = ws.Shapes.AddPicture("C:\Users\user\Desktop\カレン貼付け一般\カレン角丸\2月.png", msoFalse, msoTrue, 100, 100, -1, -1)
<<後の部分省略>>

 
↑の部分を少し変えます。
Dim FileName As String
    FileName = "C:\Users\user\Desktop\カレン貼付け一般\カレン角丸\2月.png"
   Set img = ws.Shapes.AddPicture(FileName, msoFalse, msoTrue, 100, 100, -1, -1)
  
ここに画像ファイル削除コードを追加します。
    Kill ikeName
  
ところが、質問者さんのコードも、このコードも同じです。
このコードは特定の画像ファイルのみが対象なので、
別の画像ファイルを対象とする場合は、コードを変更する必要があります。
ここで指定した画像ファイルだけならば、わざわざマクロを作成する必要はありませんよね?
ここまで、理解してもらえたでしょうか?

回答
投稿日時: 24/09/04 10:11:30
投稿者: WinArrow

追加
 
私がアドバイスした
Application.GetOpenFilename()
は、ファイルを選択するためのダイアログを表示するコードです。
そのダイアログで、貼り付け(兼)削除対象のファイルを選択します。
他人から提供されたコードを理解もせず、
どこにでも記述すればよいと考えてはいけません。

投稿日時: 24/09/04 10:58:52
投稿者: はじめて

的確なるご指示ありがとうございます。
現在取り組んでいますのは、画像ファイルを入れ替えるためにマクロで対応しようと思っています。一度挿入した画像を半月ほどで入れ替えが発生します。削除の段階でファイルが見つからないとのメッセージが出て苦慮しておりました。もう少し研さんに努め完成させたいと思っています。よろしくお願いいたします。

回答
投稿日時: 24/09/05 13:38:32
投稿者: simple

質問の最初に
| Excelファイルに画像フォルダの中から画像を挿入し、
| さらにその画像ファイルを削除したいのです。

とあります。
念のため確認するんですが、
(1)削除するのは、その挿入した画像ファイルなんですか?
そうだとしたら、挿入に使ったファイルのパス名を使って
同時に Kill処理したらいいわけで削除そのものは何の難しさもないと思いますが、
それほど急いで削除する必要があるんですか?
例えば、挿入位置を変更したいなどという話が持ち上がったりしたら、
消してしまっていればアウトじゃないですか。
 
(2)消すのは、前の世代のものということなんですか?
Excelブックに埋め込まれた画像の元ファイル名は残っていませんから難しいですよ。
普通は、世代ごとにフォルダを分けたりしませんか?役目が済んだ段階でフォルダごと消せばいい。
 
そのあたりの前提を、誤解があってはいけないので明確にされたらどうですか。

投稿日時: 24/09/05 19:52:26
投稿者: はじめて

ファイルは毎月1回、貼り付けている画像を消して別なファイルを挿入するものです。消去する画像も挿入する画像もファイル名は異なります。

回答
投稿日時: 24/09/05 20:43:30
投稿者: simple

コメントありがとうございました。
 
(1)画像の削除
・画像削除はワークシート上の「検索と選択」の「オブジェクトの選択」で選択して
  Deleteキーで一括して削除
もしくは
・マクロで削除

     ActiveSheet.DrawingObjects.Delete
のようなもので対応できると思います。
  Activeである必要はなく、Worksheetオブジェクトであればいいです。
   
(2)画像ファイルの取り扱い
シート上の画像情報からはファイル名を取得することはできないので、
ファイル名に月情報を入れるとか、月毎にフォルダを分ける
とかの運用上の工夫で対応したほうがよいと思います。
(尤も、画像書き込みのときに画像の裏の特定セルにファイルパスを書き込んでおくなどという
  工夫はあるでしょう。)
 
私はこれで失礼します。

回答
投稿日時: 24/09/06 06:32:34
投稿者: MMYS

はじめて さんの引用:
ファイルは毎月1回、貼り付けている画像を消して別なファイルを挿入するものです。

画像を入れ替え。しかも月1回ですか。だったら手作業で
画像を右クリックして、「図の変更」
で十分だと思うのですが。
 
仮にマクロで対応したとして、取り込み後、その画像ファイルは即削除されます。それで良いのですか。
※私の経験上、元画像ファイルが再度必要になるケースはよくあります。
 
画像ファイル不要が確実になった時点。たとえば2〜3ヶ月に一度、手作業で削除しても、大した手間では無いと思いますが。
 

回答
投稿日時: 24/09/06 10:01:01
投稿者: WinArrow

 
最初の質問

はじめて さんの引用:

お世話になります。
Excelファイルに画像フォルダの中から画像を挿入し、さらにその画像ファイルをス駆除したいのです。

 
稿日時: 24/09/05 19:52:26
はじめて さんの引用:

ファイルは毎月1回、貼り付けている画像を消して別なファイルを挿入するものです。消去する画像も挿入する画像もファイル名は異なります。

 
最初の説明と最後の説明は、全く異なります。
最後の説明の中には、
>画像ファイルを削除する
が無くなっています。
 
再度、仕様を整理して説明しのしてください。
後出ししないこと。

投稿日時: 24/09/06 15:03:02
投稿者: はじめて

 simpleさん ありがとうございます。
私が作った画像削除マクロを実行しますと、初回は画像は消えます。ただ、削除されているsheet上で再度削除を実行しますと、「インデックスが境界を越えています」というエラーが発生しました。そこで貴男のコメントの中の「ActiveSheet.DrawingObjects.Delete」の部分を使わせていただきますと、エラーが出なくなりました。
使ってもよろしいでしょうか?
 
 
 

回答
投稿日時: 24/09/06 17:16:06
投稿者: WinArrow

はじめて さんの引用:

私が作った画像削除マクロを実行しますと、初回は画像は消えます。ただ、削除されているsheet上で再度削除を実行しますと、「インデックスが境界を越えています」というエラーが発生しました。

これはシート上の画像を個々に指定して削除しているからです。
1回、削除した画像を同じ名前で削除しようとすると、
その名前の画像は存在しないから、エラーになります。
 
はじめて さんの引用:

そこで貴男のコメントの中の「ActiveSheet.DrawingObjects.Delete」の部分を使わせていただきますと、エラーが出なくなりました。
使ってもよろしいでしょうか?

こちらのコードは、シート上の画像を全部削除するコードです。
シート上に画像が存在しなくてもエラーにはなりません。
 
みよう見まねでコードを作成してもよいですが、
コードそのものの意味、実行したら、どのような状態になるかを
確認することが大切です。

回答
投稿日時: 24/09/06 17:42:59
投稿者: Suzu

画像ファイルを駆除 と 言っているのは、
 
エクセルに画像として挿入する、フォルダ内の【画像.jpeg】の
【画像.jpeg】を フォルダ内から削除する という意味ではないですよね?
 
その辺りは当方では、ご説明の内容がきちんと理解できませんのでスルー。
 
 
画像ファイルを入れ替える
について 一般機能 で実現する
 
方法の一つは
 MMYS さんが 既に おっしゃっている [図の変更]
 こちらは、エクセル上で 操作
 
もう一つの方法
 【画像.jpeg】を リンクとして挿入。
 画像を変えたい時には、
  元の【画像.jpeg】ファイルを 削除またはファイル名 を 【元画像1.jpeg】の様に変え
  同じフォルダに、新たに画像としてExcelに表示したいファイルを【画像.jpeg】として保存。
 
  Excel上の操作は必要ありません。
  開けば、サイズもそのままに、勝手に画像内容が変わります。
   (ただ、写真で向き情報があると、縦横比や向きが変わりますので注意が必要)
 
  制限としては、
   そのエクセルファイル、画像フォルダ共、『信頼できる場所』である必要があります。
   Excelのオプションの トラストセンター 「トラストセンターの設定」
     信頼できる場所 の 新しい場所の追加で
      そのエクセルファイル・画像ファイルの保存場所 を追加
   ただ、エクセルファイルだけを他のユーザーに送っても画像は表示されない事に注意
 
エクセルファイルを開き、画像を削除-再び画像を挿入 でも 良いでしょうけど。
 
結局、ダイアログで 選択するなら、消す動作が不要な 図の変更
ダイアログで画像選択の必要すらない、リンク の方が楽そうですね。

回答
投稿日時: 24/09/06 19:52:12
投稿者: simple

返事遅くなりました。質問者さんからお尋ねの件、形式的なものかと思いますが、
「もちろんOKです。」基本的に回答されたものを使うのに許可は要りません。
 
それよりも、皆さんから提案があるように、削除せずに更新していくほうが得策のように思います。
色々とよい提案もされていますから、虚心坦懐に検討されることを推奨します。
 
なお、画像の数とかそうした情報も提示すると共通認識のうえで議論することができます。
 
# 老婆心ながら申し上げると、コメントを頂いたら、きちんと返事をされるようお願いします。
# ひとつの発言のなかで、複数の方へ返事してもらって構いません。
# 皆さん時間を割いてボランティアで回答していますので、ご配慮下さい。

投稿日時: 24/09/07 09:15:27
投稿者: はじめて

 WinArrowさん、 MMYSさん、 simpleさん、 Suzuさん、ありがとうございました。
おかげで完成できました。これまでのご教示に感謝いたします。