プロが教えるわが家の防犯対策術!

エクセル マクロ 相対パスから画像を読み込みたいです。

以前、こちらで同様の質問をして無事に解決していただきました。
 ↓
「エクセル マクロ フルパスから画像を読み込む」(回答番号:No.1)
http://oshiete.goo.ne.jp/qa/5527067.html

この時は、絶対パスから画像を読み込む方法を教えていただいたのですが、
相対パスでも読み込むようにできるでしょうか
(相対パスに変えたら画像が表示されませんでした)。

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
■表の内容

【Sheet1】…(商品在庫一覧)
【Sheet2】…「印刷用シート」※必要なデータだけをSheet1から呼び出し、印刷用として同じシート上で並べ替える(図では‘行5’から下が印刷範囲です)
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

Sheet2のD列(D1~D3‥)に商品画像の「絶対パス」を呼び出しておき、
「写真を配置」のボタンを押すと、印刷範囲の‘行7’のセルに自動で画像が配置されます
(‘あ’のパスの画像が‘い’のセルに)。

今までは自分のパソコンのみでこの表を使っていたのですが
他の複数のパソコンでも使用することになり、
絶対パスではフォルダ名(C:\Documents ~)がそれぞれ違うため
相対パスで読み込めたら…と思っています。

※並び替えなどがあってD列に直接リンクを貼ることができないので、
 別に呼び出しておいた「ファイル名」と「C:\Documents ~(格納場所)」を
 CONCATENATE関数でくっつけています。

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
■構文(教えていただいたものをそのまま貼り付けています。すみません)

Private Sub photo_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("【Sheet1】")

For Each r In .Range("D1", "D3")
s = r.Value
If Len(s) = 0 Then Exit For
i = i + 1
If Len(Dir(s)) > 0 Then
Set tr = .Cells(7, i + 2)
With .Pictures.Insert(s).ShapeRange
.LockAspectRatio = msoTrue
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

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

どうぞよろしくお願いいたします。

「エクセル マクロ 相対パスから画像を読み」の質問画像

A 回答 (1件)

このブックと画像を同じフォルダーに入れておくと


Thisworkbook.Pathでブックのパスが取得できるのでそれを利用したらどうでしょう。

現在、Sheet1の画像はフルパスになってますが、
パスは、ThisWorkbook.Pathで取得しますので
画像ファイルの名前だけにしてください。
例えば、Pic1.jpg とか。。

下記●のコード1行追加するだけです。

'----------------------------------
For Each r In .Range("D1", "D3")
s = r.Value
If Len(s) = 0 Then Exit For

s = ThisWorkbook.Path & "¥" & s  '●これを追加

i = i + 1
If Len(Dir(s)) > 0 Then
'----------------------------------------------

■■注意■■
追加コードの "¥" は上記では全角になってますが、実際では半角の¥にすること

以上です。
 

この回答への補足

素早いご回答ありがとうございます!

質問に書き忘れていたのですが、画像を種類ごとにいくつかのフォルダに分けています。
・ブックを1階層とすると3階層まで
・最終のフォルダ数は30フォルダ(画像数:合わせて5000枚))

後から大事な情報を申し上げてすみません。


※■←ブック/□←フォルダ とすると
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
階層1

□…画像フォルダ
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
階層2
□…Aフォルダ
□…Bフォルダ
□…Cフォルダ
□…Dフォルダ
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
階層3
□□□□□□□□□□□□□ (Aフォルダの中:13フォルダ)
□□□□□□□□□□ (Bフォルダの中:10フォルダ)
□□□□ (Cフォルダの中: 5フォルダ)
□□ (Dフォルダの中: 2フォルダ)

↑それぞれに「.jpg画像」が入っている
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

という構成です。

(関係ないかもしれませんが)今の自分でもできることは
「あらかじめ関数で※のようにパスを文字列として呼び出しておくこと」
ぐらいでしょうか。

※..\画像フォルダ\Aフォルダ\最後のフォルダ\いちご01.jpg


もしお時間がありましたら、ヒントをいただけると大変助かります。
自分でも教えていただいたコードを元に調べてみたいと思います。

よろしくお願いいたします。

補足日時:2010/05/28 16:35
    • good
    • 1
この回答へのお礼

myRange様

先ほど補足を入力してすぐに
「ん?相対パスでもいいのなら…」
と思って色々試してみたところ、画像を表示することができました!
「HYPERLINK関数」で呼び出したパスの頭に「..¥」を足したらできました。
びっくりです。

ちょっと急いでいたのでとても助かりました!
どうもありがとうございました。

お礼日時:2010/05/28 17:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A