• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel VBAによるコピー作業について)

Excel VBAによるイメージ保存の方法と問題解決

このQ&Aのポイント
  • Excel VBAを使用して、画像を個別に名前を付けて保存する方法を紹介します。
  • 質問者は、現在のVBAコードで1枚の画像しか保存できない問題に直面しています。
  • 解決策として、VBAコードを修正して全ての画像を個別に保存できるようにする方法を説明します。

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 CreatePictureFromClipboard() 関数 SavePictureJpg() 関数 については、そちらの環境で正しく動作するものが設定されているとして、 それらの関数については、当方の環境では再現できませんので、こちらは一切関知しません。 ご質問のポイントは、 対象のイメージと項番をすべて捉えてループすること、 対象のイメージと項番との対応関係を正しく得ること、 保存するファイル名を正しく整形すること の3点、と考えました。 厄介なのは、 > ★イメージ列の各セルにほぼ収まる状態でイメージが貼りつけられた以下のExcelシートがあります。 の、"ほぼ収まる状態"、という部分です。 例えば項番4に対応したイメージが、項番3に掛かるような位置にあっても、 項番4と関連付けする方法として、  イメージの中心点のY座標(縦方向位置)と、  イメージが貼り付けられたセル(.TopLeftCell)のひとつ下のセルの.Top とを比較して  .TopLeftCell の行のA列の項番と関連付けるか  .TopLeftCell のひとつ下のセルの行のA列の項番と関連付けるか を決めます。 中心点が収まっていない状態なら、 ひとつ下のセルに"ほぼ収まる状態"であろう、という解釈です。 sSavePath を事前に "C:\Users\test\Pictures\" と設定。 ActiveSheet の .Shapes を総当たりでループして、  各Shape(oShape)の   .Type が, msoPicture であるならば、    .TopLeftCell.Column が、1~2列め、であるならば、     中心点とセルのY座標を比較することで分岐して、      対応する項番を、nSrNum に格納 ///     以降の処理は、ご提示のまま、     ファイル名については sSavePath & Format$(nSrNum, "000") & ".jpg"     Format$() 関数で項番を3桁に整形します。 /// ActiveSheet の .Shapes を総当たりする中で、 .Type プロパティが, msoPicture を返す場合だけに限定していますが、 修正が必要ならば、VBEのオブジェクトブラウザで、MsoShapeType を確認の上、 応用してください。 ' ' /// Sub 画像保存()   Dim sSavePath As String   Dim gdipRet As GDIPlusStatusConstants   Dim myStdPicture As StdPicture   Dim oShape As Shape   Dim nSrNum As Long   sSavePath = "C:\Users\test\Pictures\"   With ActiveSheet     For Each oShape In .Shapes       With oShape         If .Type = msoPicture Then           If .TopLeftCell.Column < 3 Then             If .Top + .Height / 2 < .TopLeftCell.Offset(1).Top Then               nSrNum = .TopLeftCell.EntireRow.Cells(1).Value             Else               nSrNum = .TopLeftCell.Offset(1).EntireRow.Cells(1).Value             End If             .CopyPicture Appearance:=xlScreen, Format:=xlBitmap             Set myStdPicture = CreatePictureFromClipboard             'jpg保存するときはこの下の行を有効に(100ところを0~100に変更でクオリティ設定できる)             gdipRet = SavePictureJpg(myStdPicture, sSavePath & Format$(nSrNum, "000") & ".jpg", 100)           End If         End If       End With     Next   End With End Sub ' ' ///

teshiga119
質問者

お礼

以下関数での保存が利かなくなりました。所々修正してみます。 ・CreatePictureFromClipboard() 関数 ・SavePictureJpg() 関数 ご教示いただきまして、ありがとうございました。

関連するQ&A