• ベストアンサー

エクセル マクロ フルパスから画像を読み込む

数日前からマクロを勉強し始めた初心者です。 下の画像のような表を作っています。 ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ■Sheet1 …「商品在庫一覧」 ■Sheet2 …「印刷用シート」※必要なものだけをSheet1から呼び出し、印刷用として同じシート上で並べ替える(図では‘行5’から下が印刷範囲です) ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ Sheet2のD列(D1~D3‥)に商品画像のフルパスを呼び出し、「写真を配置」のボタンを押すと、印刷範囲の‘行7’のセルに自動で画像が配置されるようにしたいです(‘あ’のパスの画像を‘い’のセルに)。 画像を配置するような関数はなく、マクロでなければ実現できないということで、似ている条件の構文をアレンジして‥と思ったのですが、マクロのことをきちんと理解できていないためうまくいきません。 ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ■「D1」のパスから「A7」に画像を配置する構文を教えていただけますでしょうか。 ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 初歩的なことを聞いてすみません。 完成までの残り時間があまりないもので、質問させていただきました。 どなたかお暇がありましたら、お願いいたします。

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

'読み込み 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 ...こんな感じです。 #ちょっとデジャヴゅな仕様... >数日前からマクロを勉強し始めた初心者です。 勉強してコード内容を理解するようにしてください。 今後の仕様変更の対応など、コードのメンテナンスに苦労しますよ。

yooko0108
質問者

お礼

end-u様 ご回答ありがとうございました。お礼が遅くなり、申し訳ありません。 丁寧な解説までつけていただき、大変恐縮です。 おかげさまでなんとか完成させることができました! と言ってもたまたまうまくいっただけで、おっしゃる通りちゃんと勉強しないと応用するのは無理だということがよく分かりました。 ちなみに… 「行6~9のセットを下方向に4段配置したかったのですが(質問に書き忘れました)、方法が分からなかったので、「For」~「Next」の部分を4回繰り返し(コピー&ペースト)、 下の構文の「■」のところをそれぞれずらす、という方法でやってみました。   For Each r In .Range("■", "■")   Set tr = .Cells(■, (i + 1) - ■) 本当はもっとちゃんとしたやり方があるのだと思います。。 私の間違った方法を書いても意味がないとは思ったのですが、初めてできてとても嬉しかったのでご報告させていただきました。 お正月休みにでもまとめて勉強したいと思います。 この度は助けていただき、ありがとうございました。

その他の回答 (1)

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.2

>数日前からマクロを勉強し始めた初心者です。 >完成までの残り時間があまりないもので、質問させていただきました。 残り時間が少ないのでしたら、今回の画像表示のサンプルコードを提示してもらっても、最終版として完成するには、時間が足らないように思います。 もしかすると、以下のようなことがしたいのではないでしょうか? 自動的に画像を切り替える http://officetanaka.net/excel/function/tips/tips14.htm

yooko0108
質問者

お礼

MackyNo1様 ご回答いただきありがとうございました。 お礼が遅くなり申し訳ありません。 ご紹介していただいたサイト、写真入りで大変分かりやすかったです。 ぜひ参考にさせていただきます。 この度はどうもありがとうございました。

関連するQ&A

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

    エクセル マクロ 相対パスから画像を読み込みたいです。 以前、こちらで同様の質問をして無事に解決していただきました。  ↓ 「エクセル マクロ フルパスから画像を読み込む」(回答番号:No.1) http://okwave.jp/qa/q5527067.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 ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ どうぞよろしくお願いいたします。

  • エクセル マクロ セルの値が変わった時、自動でマクロを実行させたいです

    エクセル マクロ セルの値が変わった時、自動でマクロを実行させたいです。 以前、こちらで教えていただいたコードで下のような表を作りました。 ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ■ボタンを押すと画像が配置される表 【Sheet1】…商品在庫一覧表(テキスト情報&商品画像のパス) 【Sheet2】…  1、Sheet1から必要なデータだけを関数で呼び出しておく  2、印刷用の体裁として6行目以下に並び替え(テキスト情報は‘=’で自動配置)、    「画像を配置」ボタンをトリガーにして画像を配置    (※D列の画像のパスを行7に(あ→い))  3、「リセット」ボタンで画像を削除 ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 社内でとても便利に使っておりましたが 「毎回ボタンを押すのが面倒くさい」という意見があり、 自動で配置できないかと思っています。 やりたいこと ※A1~D3列が変わった時点で(ボタンを押さずに)6行目以下に画像を表示させたい ※「リセット」ボタンを押さなくても、次の更新があった時点で古い画像が削除され  新しい画像が配置されるようにしたい ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ■現在の構文(教えていただいたものをほぼそのまま貼り付けています。すみません) 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("【Sheet2】") 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) 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 Private Sub photo_2() '←「リセット」ボタン(★) Sheets("【Sheet2】").Pictures.Delete End Sub ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ (★)の部分をなくして自動化したいです。 「Worksheet_Calculate(Change?)」というのでできるらしい… と知って色々やってみましたが、うまくいきません。 お時間がありましたら教えてください。 どうぞよろしくお願いいたします。

  • エクセルで同じ大きさの画像だけを並び替えるマクロ

    仕事でエクセルのシートに600枚ほどの写真画像を並べる作業をしなければなりません。 画像のサイズは2種類あり、  ・大きなサイズの画像(高さ5.73cm、幅7.51cm)が2枚、  ・小さなサイズの画像(高さ4.31cm、幅5.77cm)約50枚(以下n枚とします) を1つのsheetに配置します。 このとき、大きなサイズの画像はシートの右上に並べ、小さなサイズの画像は横4枚×縦(n/4)+1列に並べなければなりません。シート上での配置のイメージは下のような感じです。 ●:大きなサイズの画像 ☆:小さなサイズの画像 --:シートの範囲だと思ってください -----------------------------                  ●● ☆     ☆     ☆     ☆ ☆     ☆     ☆     ☆ ☆     ☆     ☆     ☆ ☆     ☆     ☆     ☆ ・ ・(途中省略) ・ ☆     ☆     ☆     ☆ ----------------------------- シート右上に配置されてある大きなサイズの画像配置を変更せずに、小さなサイズの画像のみを選択して横4枚の格子状に並べるにはどのようなマクロを組めばよいでしょうか? 過去の質問QNo.3864319を参考にしましたが、この方法では同じサイズの画像すべてを並べ替えているように設定されてあります。したがって、このマクロを実行すると、位置を変えたくない大きなサイズの画像も含めて格子状に並べ替えられてしまうため、困っています。並べ替えをしなければならない画像は3000枚くらいになると思われるので、このマクロを完成させてしまわないと作業が締め切りに間に合わないのでとっても困っています。 どうかよろしくお願いいたします。

  • エクセル 並び替え&画像

    基本となるファイルには シート1の上部に画像がありその下に表があります。 それをシート2の上部に表、画像を表の下というふうに並び替えを行いたいです。 ・並び替え ┏━┳━┳━━━━━┓   ┏━┳━┓ ┃1┃A┃あいうえお┃   ┃1┃A┃ ┃1┃A┃かきくけこ┃ ⇒ ┃2┃B┃ ┃3┃C┃さしすせそ┃   ┃3┃C┃ ┃2┃B┃たちつてと┃   ┃4┃ ┃ ┃5┃D┃なにぬねの┃   ┃5┃D┃ ┃5┃D┃はひふへほ┃   ┗━┻━┛  ┗━┻━┻━━━━━┛  右の表(シート1)を左の表(シート2)のように並び替えがしたいです。 1列目の数字を基準に並び替えるのですが、 飛んでる数字を表示して順に並べたいのです。 3列目以降はいりません。 通常は約50列、約30行あるのですがこれくらい小さいものの応用だと思い、 この小さな表で質問させていただきました。 ・画像の移動 シート1のセルA1~セルE5の大きさの画像があるとします。 この画像をシート2のセルC10~E13に移動して それに合わせて大きさも変更したいです。 最終的にはマクロを組むところまでできるとうれしいのですが、 できる範囲で教えてください、お願いします。

  • EXCELのマクロで。。。

    シートAのセルC2の値(数字)を シートBのE、F、Gの各列のうち空いている一番左のセルで、かつ、D列に何か書いてある一番下の行のセル に転記したいです。 たとえば、シートBが図のような場合にはF28です。これが毎回、変化します。 マクロの記述を教えて下さい。よろしくお願い致します。

  • Excelのマクロを使ってのオートフィル

    Excelのマクロを使ってのオートフィルについて教えて下さい。 類似の質問があったのですが、決まったセルからのものが多くわかりませんでした。 マクロはまだ始めたばかりです。 やりたいことはExcelの2つのシートに別のcsvファイルの数字を入れることです。 ExcelのSheet1のD1セルに日付を表す数字が入っています。 Sheet2と3には2行目に月の日付がずらりと並んでいます。 1列目には記録番号が入っています。 それぞれのシートにSheet1のD1セルと同じ日付の列を見つけて、 その下の行から1列目の記録番号を元に検索したcsvファイルのデータを引っ張ってきたいのです。   Sheets("Sheet1").Select Cells(3, (Sheets("Sheet2").Range("D1")).Select と最初に入れるセルを探しても違う列に飛んでしまったりします。 又、下のセルまで数式もコピーできずに止まったままです。 VBAまでは手が出せずに悩んでいます。どうか教えて下さい。よろしくお願いします。

  • EXCELのマクロがわかりません・・・

    現在、A列にデータが並んでいるのですが、 これを7つ区切り(例:A1~A7、A15~A21)にして、 別シートに用意した表に行列を入れ替えて、 貼り付けるマクロを作っているのですが、 なにぶんVBは素人ですので、よくわかりません。 今作ろうとしているマクロは、 「元データ」セルのA1からA7までをコピーして、 「作成データ」セルのB2を起点として、 コピーした内容の行列入れ替えを行い貼り付け、 以後、「元データ」のコピー範囲を7つづつ 下にずらし、「作成データ」の貼り付け起点を 1つづつ下にずらして、「元データ」のA列の 最後までくりかえすものです。 必ず「Range」文で引っかかってしまうのですが、 何か構文的におかしいでしょうか? かなり急ぎですので、 わかる方、よろしくお願いしますっ!! 下に、作成したマクロを貼り付けます。 Sub Macro3() ' ' Macro3 Macro ' マクロ記録日 : 2005/12/5 ユーザー名 : *** Worksheets("元データ").Activate 開始行 = -6 終了行 = 0 ペースト行 = 0 Do 開始行 = 開始行 + 7 終了行 = 終了行 + 7 ペースト行 = ペースト行 + 1 開始セル番号 = "A" & 開始行 終了セル番号 = "A" & 終了行 ペーストセル番号 = "B" & ペースト行 Range("開始セル番号:終了セル番号").Select Selection.Copy Sheets("作成データ").Select Range(ペーストセル番号).Select Selection.PasteSpecial Paste:=xlAll, Operation:=xlNone, SkipBlanks:=False _ , Transpose:=True Loop End Sub

  • 連続で印刷すると画像が更新されない(Excelのイメージコントロール)

    いつもお世話になります。 エクセルのイメージコントロールを使用しているのですが、 なかなかうまく行かないので、アドバイスをお願いします。 シートにイメージコントロールをいくつか(8個)配置しました。 マクロで LoadPicture を使用し画像を読み込ませました。 Rangeで範囲を指定して印刷しました。 一旦、Sheet1.Image1.Picture = Nothing と開放しました。 そのイメージコントロールに別画像を LoadPicture させました。 同様に印刷させましたが、画像は最初に読み込ませたもののままです。 マクロが終了して見ると、最新の画像に更新されているのですが、 印刷したものでは(プリビューでも)更新されません。 Redraw させたり Refresh させるコマンドはないかと思いましたが見つかりません。 同じマクロで画像のコメントをセルに表示させているのですが、 こちにはどんどん更新しています。 画像だけが、最初に読み込んだ画像のままで印刷されてしまいます。 印刷範囲は常に同じです。 原因なり対処法なりをお教え下さいますようお願いします。

  • エクセルのマクロの組み方に詳しい方

    エクセルのマクロの組み方に詳しい方はいらっしゃいませんか? 今、売り上げの記入を自動化できるようにマクロを組もうと試みています。 しかし、マクロの本を見てもちんぷんかんぷんです 。 頭の中で考えていることですが… まずデータベースとしてエクセル、またはそれに代用できるファイルに手入力で仕入れの詳細を記入していきます。 これは自分で入力していくので問題ありません。 ここからが問題です。 データベースとは別のエクセルにマクロを登録して、データベースから仕入れ情報を検索したいのです。 例えば… A1商品名、A2重量、A3仕入値…というように項目を作っていきます。 そしてB行に検索したい文字、数値を入力します。 そしてボタン1をクリックすると、B 行に入力した値に一致するデータを行ごとD行に呼び出します。 最後にD行の売上の項目に売上を記入して、更新したD行のデータをシート2、又は別のエクセルファイルに張り付けられるようにしたいです。 データの張り付けを文字のあるセルの最後尾の下の空白のセルに張り付けていけるようにしたいです。 どのようなマクロを組むと良いでしょうか?どのような言語を使うと良いでしょうか? 詳しい方是非是非教えて下さい。。

  • とほほのエクセルマクロ

    以下の文の[-1899]の部分を可変型にしたいのですが。 どなたかご存知有りませんか? ActiveCell.FormulaR1C1 = "=COUNTIF(R[-1899]C:R[-1]C,""いっしょだよ"")" ==================================== マクロの説明です。 ==================================== エクセルマクロでsheet1にデータを入力していって、 sheet1のD列内に同一のコードがないかをチェックするために sheet1のコピーを作成してD列でソートしてから D列の1行目=2行目ならK列に”いっしょだよ”という メッセージを出すようにIF文を書きこんでいきます。 最後にこの”いっしょだよ”というメッセージが何件あったかを見たいので、 一番下の行+1行目に ActiveCell.FormulaR1C1 = "=COUNTIF(R[-1899]C:R[-1]C,""いっしょだよ"")" という文を入れたのですがこれだと自分が居る一つ上のセルから 1899上までしか行かないのですが、毎回データを入力して行数は増えていってしまいます。 どのような、文にしたらよいのか教えてください。 お願いいたします。

専門家に質問してみよう