- ベストアンサー
Excel VBAによるイメージ保存の方法と問題解決
- Excel VBAを使用して、画像を個別に名前を付けて保存する方法を紹介します。
- 質問者は、現在のVBAコードで1枚の画像しか保存できない問題に直面しています。
- 解決策として、VBAコードを修正して全ての画像を個別に保存できるようにする方法を説明します。
- みんなの回答 (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 ' ' ///
お礼
以下関数での保存が利かなくなりました。所々修正してみます。 ・CreatePictureFromClipboard() 関数 ・SavePictureJpg() 関数 ご教示いただきまして、ありがとうございました。