- ベストアンサー
エクセル マクロ フルパスから画像を読み込む
数日前からマクロを勉強し始めた初心者です。 下の画像のような表を作っています。 ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ■Sheet1 …「商品在庫一覧」 ■Sheet2 …「印刷用シート」※必要なものだけをSheet1から呼び出し、印刷用として同じシート上で並べ替える(図では‘行5’から下が印刷範囲です) ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ Sheet2のD列(D1~D3‥)に商品画像のフルパスを呼び出し、「写真を配置」のボタンを押すと、印刷範囲の‘行7’のセルに自動で画像が配置されるようにしたいです(‘あ’のパスの画像を‘い’のセルに)。 画像を配置するような関数はなく、マクロでなければ実現できないということで、似ている条件の構文をアレンジして‥と思ったのですが、マクロのことをきちんと理解できていないためうまくいきません。 ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ■「D1」のパスから「A7」に画像を配置する構文を教えていただけますでしょうか。 ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 初歩的なことを聞いてすみません。 完成までの残り時間があまりないもので、質問させていただきました。 どなたかお暇がありましたら、お願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
'読み込み Sub try_1() Const n As Long = 2 'margin Dim r As Range 'Loop用 Dim tr As Range '読み込みセル用 Dim s As String 'セル文字列 Dim x As Double '縦横比固定での縮小率 Dim i As Long With Sheets("sheet2") 'D1から下へ連続セルをLoop For Each r In .Range("D1", .Range("D1").End(xlDown)) s = r.Value '空白セルの場合Loopを抜ける If Len(s) = 0 Then Exit For i = i + 1 'フルパスが有効な時だけ処理する If Len(Dir(s)) > 0 Then Set tr = .Cells(7, i) With .Pictures.Insert(s).ShapeRange .LockAspectRatio = msoTrue 'セルの幅or高さに合わせて縮小率を得る x = Application.Min((tr.Width - n) / .Width, (tr.Height - n) / .Height) .Width = .Width * x .Left = tr.Left + (tr.Width - .Width) / 2 .Top = tr.Top + (tr.Height - .Height) / 2 End With End If Next End With '念のためファイルを解放 Dir Application.Path Set tr = Nothing End Sub '削除 Sub try_2() Sheets("sheet2").Pictures.Delete End Sub ...こんな感じです。 #ちょっとデジャヴゅな仕様... >数日前からマクロを勉強し始めた初心者です。 勉強してコード内容を理解するようにしてください。 今後の仕様変更の対応など、コードのメンテナンスに苦労しますよ。
その他の回答 (1)
- MackyNo1
- ベストアンサー率53% (1521/2850)
>数日前からマクロを勉強し始めた初心者です。 >完成までの残り時間があまりないもので、質問させていただきました。 残り時間が少ないのでしたら、今回の画像表示のサンプルコードを提示してもらっても、最終版として完成するには、時間が足らないように思います。 もしかすると、以下のようなことがしたいのではないでしょうか? 自動的に画像を切り替える http://officetanaka.net/excel/function/tips/tips14.htm
お礼
MackyNo1様 ご回答いただきありがとうございました。 お礼が遅くなり申し訳ありません。 ご紹介していただいたサイト、写真入りで大変分かりやすかったです。 ぜひ参考にさせていただきます。 この度はどうもありがとうございました。
お礼
end-u様 ご回答ありがとうございました。お礼が遅くなり、申し訳ありません。 丁寧な解説までつけていただき、大変恐縮です。 おかげさまでなんとか完成させることができました! と言ってもたまたまうまくいっただけで、おっしゃる通りちゃんと勉強しないと応用するのは無理だということがよく分かりました。 ちなみに… 「行6~9のセットを下方向に4段配置したかったのですが(質問に書き忘れました)、方法が分からなかったので、「For」~「Next」の部分を4回繰り返し(コピー&ペースト)、 下の構文の「■」のところをそれぞれずらす、という方法でやってみました。 For Each r In .Range("■", "■") Set tr = .Cells(■, (i + 1) - ■) 本当はもっとちゃんとしたやり方があるのだと思います。。 私の間違った方法を書いても意味がないとは思ったのですが、初めてできてとても嬉しかったのでご報告させていただきました。 お正月休みにでもまとめて勉強したいと思います。 この度は助けていただき、ありがとうございました。